为什么Haskell不使用某种特殊格式来反映这一点,或者 - > c可以用另一种方式理解吗?
答案 0 :(得分:5)
您可以通过两种方式查看babel的类型签名。
babel
有两个a
和b
类型的输入;它会生成c
类型的输出。babel
接受类型为a
的输入,并生成类型为(b -> c)
的输出。 (1)返回一个c
类型的值,其中babel
已完全应用。 (2)返回一个(b -> c)
类型的中间函数,部分应用babel
;如果您选择将中间函数应用于类型b
的值,则可以获得从案例(1)获得的结果。
这种选择部分或完全应用函数的能力使您能够通过将简单(中间)函数粘合在一起来构建复杂函数。
为什么Haskell没有使用某种特殊格式来反映这个......?
默认情况下,Haskell中的所有函数都接受一个输入;两个参数的函数只是一个返回函数的函数。默认情况下,Currying在类型签名中已经很明显。这就是(->)
与右侧相关联的原因所以我们不必写babel :: a -> (b -> c)
答案 1 :(得分:4)
Haskell使用一个名为currying的概念,这意味着只有单个参数函数,多个参数函数只是返回另一个函数的函数,前面的参数是“烘焙”,直到所有参数都填入
所以
add :: Int -> Int -> Int
add x y = x + y
相当于
add :: Int -> (Int -> Int)
add = \x -> \y -> x + y
答案 2 :(得分:0)
您可以将babel :: a -> b -> c
之类的函数视为管道。
这是一个需要a
的函数,然后返回一个带b
的函数,然后返回一个{{1} }。 Partial application是使这项工作的原因,任何应用程序都返回一些函数或最后一个值c
。