对于Haskell类型签名,如babel :: a - > b - > c,是c的返回类型?

时间:2017-04-08 13:51:47

标签: haskell types type-signature

为什么Haskell不使用某种特殊格式来反映这一点,或者 - > c可以用另一种方式理解吗?

3 个答案:

答案 0 :(得分:5)

您可以通过两种方式查看babel的类型签名。

  • (1)babel有两个ab类型的输入;它会生成c类型的输出。
  • (2)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