Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 循环类型同义词声明_Haskell_Types - Fatal编程技术网

Haskell 循环类型同义词声明

Haskell 循环类型同义词声明,haskell,types,Haskell,Types,我想用以下代码试用Haskell类型和数据 type Program a = Maybe a -> (Operation a, Maybe Program a) data Operation a = Read a | Write a 程序遵循连续传递样式(CPS),而无表示终止a可以用Int或其他东西实例化 然而,GHC抱怨说: main.hs:1:1: Cycle in type synonym declarations: main.hs:1:1-58: type

我想用以下代码试用Haskell
类型
数据

type Program a = Maybe a -> (Operation a, Maybe Program a)
data Operation a = Read a | Write a
程序
遵循连续传递样式(CPS),而
表示终止
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)

我是哈斯克尔的新手,所以我不明白为什么这是不允许的。如何在Haskell中表达这种类型?

这里有两个问题:

  • 它应该是
    可能(程序a)
    ,而不是
    可能是程序a
  • 类型同义词不能是递归的
工作版本将是:

newtype Program a = Program { runProgram :: Maybe a -> (Operation a, Maybe (Program a)) }
data Operation a = Read a | Write a

谢谢如果我使用这个
newtype
runProgram
,你能告诉我如何调用这个函数吗?
f::Program a->Maybe a->(操作a,Maybe(Program a))
fpm=(runProgram)m
--
runProgram
是记录字段,因此可以像普通函数一样调用它。