currying和类型声明中的括号

时间:2013-07-30 19:17:24

标签: functional-programming currying type-declaration

我很难理解用于currying的符号。也许这意味着我对这个问题有更深的困惑,但我不这么认为。

我理解如何......

add (x,y) = x + y可以有(int, int) -> int类型。

这也是有道理的,咖喱形式看起来像这样:

add x y = x + y类型为int -> int -> int,又称为int -> (int-> int)

我想知道最后一个例子中括号的含义。是第一个int x,第二个是int y,还是最后一个int输出?这样的功能会是什么样的?

(int -> int) -> int

我知道有些东西不是点击而且非常令人沮丧。

1 个答案:

答案 0 :(得分:4)

a -> b形式的类型实际上只是意味着

  

函数采用类型a的值并返回类型b的值

从那以后它只是重复申请更大的(多个箭头)类型,就像1 + 2 + 3 + 41 + 2完全不同。 一个潜在的绊脚石是这些价值观中的任何一个都可以成为一种功能。您对curry类型的解释是正确的,但请注意add x本身是一个有效的表达式,并给出另一个函数(在返回int之前只需要一个参数)。

至于第二种类型:就像int -> (int -> int)类型

一样
  

int并返回函数int -> int

类型(int -> int) -> int表示

  

取一个函数int -> int并返回int

它是一个高阶函数,一个接受函数作为参数的函数。 一个不完全无用的例子是函数sum0To100 f = sum (map f [0 .. 100])(或任何其他范围的等效函数)。例如,sum0To100 fib是前100个斐波纳契数的总和。