理解Haskell函数签名

理解Haskell函数签名,haskell,Haskell,我是haskell的新手,在函数签名方面遇到了一些问题: 在简单的世界里它意味着什么: add:: Integer -> Integer -> Integer 这是否意味着前两个参数是Integer,返回值也是Integer 你能给我解释一下,使用箭头来确定参数类型的目的,或者至少给我一个关于这个函数签名的简要解释吗?作为一个简单的心智模型-是的,最后一个箭头后面的东西是一个返回类型,其他一切都是参数 二元及以上函数的签名看起来是这样的,因为它们实际上是返回另一个一元及以上函数的一

我是haskell的新手,在函数签名方面遇到了一些问题:

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

add:: Integer -> Integer -> Integer
这是否意味着前两个参数是
Integer
,返回值也是
Integer


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

作为一个简单的心智模型-是的,最后一个箭头后面的东西是一个返回类型,其他一切都是参数

二元及以上函数的签名看起来是这样的,因为它们实际上是返回另一个一元及以上函数的一元函数

就你而言

add :: Integer -> (Integer -> Integer)
传递
add
参数

add 3 :: (Integer -> Integer)

add34
,因此就是
Integer
类型。

通俗地说,我们确实可以将
add
称为一个函数,它接受两个
整数
并生成一个
整数
。然而,要理解符号,您需要理解,从技术上讲,Haskell中没有接受两个参数的函数

相反,每个函数只接受一个参数,函数的类型写为
a->r
,其中
a
是参数的类型,
r
是结果的类型。函数箭头是右关联的,这意味着类型
a->(b->c)
可以在没有括号的情况下写入,如
a->b->c

因此,
Integer->Integer->Integer
Integer->(Integer->Integer)
相同,它告诉我们,
add
是一个函数,它接受一个
Integer
并生成另一个
Integer->Integer
类型的函数。这被称为Curry,是Haskell中“编码”多参数函数的常用方法


要调用这样一个curried函数,我们可以编写
add12
,因为函数应用程序是左关联的,所以它与
(add1)2
相同,首先调用
add1
以获得类型为
Integer->Integer
的函数,然后将该函数应用于参数
2

,简短的回答是肯定的:这正是它的意思。最后一种类型是返回值,所有其他类型都是参数

这是因为一个非常简单的原因,即:Haskell中不存在多重函数。所有函数实际上都是单参数,函数的一般类型是
a->b
。由于currying,我们有了类似于多参数函数的东西。您需要了解的只是括号:

add :: Integer -> (Integer -> Integer)
它的内容是:
add
是一个函数,它接受一个
Integer
并返回一个函数
Integer->Integer
。所有括号都在右边。相反,应用时,所有括号都会挤压左手尺寸,如下所示:

(add 5) 6
其内容为:将
add
应用于参数
5
。作为回报,您将获得一个函数-然后将该函数应用于
6
(最终结果为
11
)。我们同样可以这样定义它:

add :: Integer -> (Integer -> Integer)
add x = \y -> x + y
因此,您可以为一个函数指定多个参数这一事实只是一种语法上的甜点,这样您就不必返回所有这些lambda了

这正是我们能够做到这一点的原因:

add5 :: Integer -> Integer
add5 = (+5)
我想,参考和了解细节不会有什么坏处。