我正在审阅《Haskell函数式编程艺术》,但第356页的类型签名让我感到困惑。
这里有一个简单的例子:
succeed :: b -> Parse a b
succeed val inp = [( val, inp )]
如何理解b -> Parse a b呢?
succeed Int -> Int
succeed a = a
并且,
succeed Int -> Int -> Int
succeed a b = a + b
你所接受的参数数量必须在类型声明中正确吗?如果你的类型声明只有一个类型变量:succeed :: b -> Parse a b
应该是这样的,接受一个类型为 a
的变量,并返回一个类型为 Parse a b
的值,而不是接受两个变量...那么 inp
在哪里被允许?
->
显式同义词的提及确实很有帮助。我现在明白你的意思了,这似乎使类型系统的清晰度变得更加模糊 - 你或其他人能否对此发表评论? - Evan Carrollsucceed
的类型可以明确你可能想要将该函数应用于两个参数。实际上,你只需要将它应用于一个参数,这样它就会生成一个解析器(也就是函数)。它可以仅在左侧使用一个参数进行定义,如下所示:succeed val = \inp -> [(val, inp)]
,即接受一个名为val
的参数,并生成一个parser(也就是函数),该函数接受inp
并生成那个列表。实际上,解析器就是一个函数。因为您可以轻松地组合函数,所以可以轻松地组合以此风格编写的解析器。 - R. Martinho Fernandes