Skip to content

Instantly share code, notes, and snippets.

@sinelaw
Created December 25, 2014 20:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sinelaw/608aa659d2c32d6d3cb1 to your computer and use it in GitHub Desktop.
Save sinelaw/608aa659d2c32d6d3cb1 to your computer and use it in GitHub Desktop.
fixed-point type
{-# LANGUAGE FlexibleContexts, FlexibleInstances #-}
module FixT where
data Expr = Val
| Divide Expr Expr
| Times Expr Expr
deriving Show
flipDivide :: Expr -> Expr
flipDivide Val = Val
flipDivide (Divide a b) = Divide (flipDivide b) (flipDivide a)
flipDivide (Times a b) = Times (flipDivide a) (flipDivide b)
data FExpr a = FVal Int
| FDivide a a
| FTimes a a
deriving Show
instance Functor FExpr where
fmap f (FDivide a b) = FDivide (f a) (f b)
fmap f (FTimes a b) = FTimes (f a ) (f b)
fmap _ (FVal x) = FVal x
data Fix a = Fix { unFix :: a (Fix a) }
flipFDivide :: Fix FExpr -> Fix FExpr
flipFDivide (Fix (FDivide a b)) = Fix (FDivide (flipFDivide b) (flipFDivide a))
flipFDivide (Fix x) = Fix $ fmap flipFDivide x
instance Show (Fix FExpr) where
show (Fix x) = "Fix (" ++ (show x) ++ ")"
main :: IO ()
main = return ()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment