我是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.
作为一个简单的心理模型 - 是的,最后一个箭头后面的东西是返回类型,其他所有内容都是参数。
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类型。