Reputation: 4259
I want to try out Haskell type
and data
with the following code
type Program a = Maybe a -> (Operation a, Maybe Program a)
data Operation a = Read a | Write a
Program
follows a continuation passing style (CPS) and Nothing
indicates termination. a
may be instantiated with Int
or something else.
However, GHC complains that:
main.hs:1:1:
Cycle in type synonym declarations:
main.hs:1:1-58: type Program a =
Maybe a -> (Operation a, Maybe Program a)
I'm new to Haskell so I don't understand why this is not allowed. How can I express this type in Haskell?
Upvotes: 3
Views: 1792
Reputation: 3246
There are two problems here:
Maybe (Program a)
, not Maybe Program a
A working version would be:
newtype Program a = Program { runProgram :: Maybe a -> (Operation a, Maybe (Program a)) }
data Operation a = Read a | Write a
Upvotes: 8