Cycle in type synonym declarations

haskell, types

Solution

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

Problem

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?

Original source