循环类型同义词声明

Xia*_*Jia 2 haskell types

我想尝试Haskell typedata使用以下代码

type Program a = Maybe a -> (Operation a, Maybe Program a)
data Operation a = Read a | Write a
Run Code Online (Sandbox Code Playgroud)

Program遵循延续传递方式(CPS)并Nothing指示终止.a可以用Int其他东西实例化.

然而,GHC抱怨说:

main.hs:1:1:
    Cycle in type synonym declarations:
      main.hs:1:1-58: type Program a =
                          Maybe a -> (Operation a, Maybe Program a)
Run Code Online (Sandbox Code Playgroud)

我是Haskell的新手,所以我不明白为什么不允许这样做.如何在Haskell中表达这种类型?

Pth*_*ame 7

这里有两个问题:

  • 应该是Maybe (Program a),而不是Maybe Program a
  • 类型同义词不能递归

一个工作版本将是:

newtype Program a = Program { runProgram :: Maybe a -> (Operation a, Maybe (Program a)) }
data Operation a = Read a | Write a
Run Code Online (Sandbox Code Playgroud)

  • `f ::程序a - >也许是 - >(操作a,可能(程序a))`; `fpm =(runProgram p)m` - `runProgram`是记录字段,因此可以像普通函数一样调用它. (2认同)