我是haskell世界的新手,我遇到了一些功能签名问题:
在简单的世界中它意味着什么:
add:: Integer -> Integer -> Integer
这是否意味着两个第一个参数是Integer
,并且返回值Integer
也是?
你能解释一下,使用箭头确定参数类型的目的,或者至少给我一个关于这个函数签名的简短解释吗?
通俗地说,我们可能确实称之为add
一个需要两个Integer
s并生成一个的函数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
.