多态类型的显式类型签名

Eva*_*oll 3 haskell

我正在回顾Haskell:函数式编程的工艺,但是第356页的类型签名已经引发了我的循环.

这是一个简单的:

succeed :: b -> Parse a b
succeed val inp = [( val, inp )]
Run Code Online (Sandbox Code Playgroud)

怎么可能b -> Parse a b,如果

succeed Int -> Int
succeed a = a
Run Code Online (Sandbox Code Playgroud)

和,

succeed Int -> Int -> Int
succeed a b = a + b
Run Code Online (Sandbox Code Playgroud)

您在论证类型声明中的论据数量是多少?你怎么能采取val,并且imp,如果你的类型声明只有一个类型的变量:succeed :: b -> Parse a b应该是阅读,做类型的一个变量a并返回一个类型的Parse a b,用不了两个变量...是哪里inp允许?

kee*_*gan 8

因为在它的扩展中Parse是一个类型的同义词->.例:

type Foo = Int -> Int

succeed :: Int -> Foo
succeed a b = a + b
Run Code Online (Sandbox Code Playgroud)

  • @Evan:使用该快捷方式编写`success`的类型使其明确您可能希望将该函数应用于两个参数.你应该将它应用于一个参数,因此它产生一个解析器(也就是函数).它本来只能用左边的参数来定义,就像这个`succeed val =\inp - > [(val,inp)]`,即取一个参数`val`并产生一个*解析器*(又称函数) )使用`inp`并生成该列表.只是解析器实际上是一个函数.因为您可以轻松地编写函数,所以您可以轻松地编写以此样式编写的解析器. (2认同)