Xiao Jia
Xiao Jia

Reputation: 4259

Cycle in type synonym declarations

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

Answers (1)

Ptharien's Flame
Ptharien's Flame

Reputation: 3246

There are two problems here:

  • it should be Maybe (Program a), not Maybe Program a
  • type synonyms cannot be recursive

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

Related Questions