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