理解Haskell函数签名

Tho*_*mas 3 haskell

我是haskell世界的新手,我遇到了一些功能签名问题:

在简单的世界中它意味着什么:

add:: Integer -> Integer -> Integer
Run Code Online (Sandbox Code Playgroud)

这是否意味着两个第一个参数是Integer,并且返回值Integer也是?

你能解释一下,使用箭头确定参数类型的目的,或者至少给我一个关于这个函数签名的简短解释吗?

sep*_*p2k 12

通俗地说,我们可能确实称之为add一个需要两个Integers并生成一个的函数Integer.但是要理解这种符号,你需要理解技术上没有一个函数在Haskell中接受两个参数.

而每一个函数有且只有一个参数和功能的类型被写入a -> r其中a是参数的类型和r是结果的类型.函数箭头是右关联的,这意味着a -> (b -> c)可以在没有括号的情况下写入类型a -> b -> c.

所以Integer -> Integer -> Integer是相同的Integer -> (Integer -> Integer),它告诉我们这add是一个函数,它接受Integer并生成另一个类型的函数Integer -> Integer.这称为currying,是在Haskell中"编码"多参数函数的常用方法.

要调用这样一个curried函数,我们可以编写add 1 2,因为函数应用程序是左关联的,与(add 1) 2第一次调用add 1获取类型函数Integer -> Integer然后将该函数应用于参数相同2.


arr*_*owd 5

作为一个简单的心理模型 - 是的,最后一个箭头后面的东西是返回类型,其他所有内容都是参数。

2 元及更多元函数的签名看起来是这样的,因为它们实际上是返回另一个 1 元及更多元函数的一元函数。

在你的情况下

add :: Integer -> (Integer -> Integer)
Run Code Online (Sandbox Code Playgroud)

传递add一个参数给出

add 3 :: (Integer -> Integer)
Run Code Online (Sandbox Code Playgroud)

并且add 3 4, 因此 只是Integer类型。

  • 我想,参考 [currying](https://wiki.haskell.org/Currying) 和 [partial application](https://wiki.haskell.org/Partial_application) 了解详细信息不会有什么坏处。 (6认同)