咖喱函数f#

时间:2012-02-22 04:53:09

标签: f# f#-scripting

我有两个类型的问题int - > (int - > int)和(int - > int) - > INT。这两者有什么区别?

我在这里读到的第一个可以被解释为一个函数,它接受一个int并返回一个带有int和int的函数并返回一个int,它与int相同 - > int - > INT。这是正确的吗?

4 个答案:

答案 0 :(得分:3)

好问题,我怀疑功能上没有太大区别。我花了一些时间摆弄试图弄清楚如何获得这两个签名。 (约翰帕尔默的let fun1 i = fun j -> i + j只给我int -> int -> int

let add a b = a + b       // int -> int -> int
let inc a = add a         // int -> (int -> int)

我想不出第二个签名的一个非人为的例子:

let foo fn : int -> fn 1  // (int -> int) -> int

(这不会直接回答你的问题,但可能会给别人一些东西来咀嚼)

答案 1 :(得分:3)

int -> (int -> int)int -> int -> int之间的差异可以忽略不计(如果你必须与另一种语言互操作,你真的只会关心)。这些是curried函数,它们有效地获取两个整数并返回一个整数(例如,内置加法运算符在这些行中有一个类型)。

然而,这两者与(int -> int) -> int非常不同,fun (f:int->int) -> f 13函数从整数转换为整数并返回整数。正如其他人所提到的,这种函数的唯一简单示例是将给定函数应用于特定值(例如{{1}})。

答案 2 :(得分:2)

我真的不知道F#,但它看起来很直观(很多其他语言都有相同的概念)。

  1. 是一个函数接受一个int,并返回一个接受int的函数并返回一个int
  2. 是一个函数,它接受一个带有int的函数并返回一个int,然后返回一个int
  3. 第一种有点像咖喱功能。

答案 3 :(得分:0)

让我们看看实现的样子:

第一

let func1 i = fun j -> i+j

这个签名为int -> (int -> int)

请注意func1 2 3不起作用

编辑:事实证明,由于关联方式有效,这实际上很好

但这与

不同
let func2 i j= i+j

,其类型为int -> int -> int

这里func2 1 2很好

我们可以像这样创建另一个例子:

let func4 a = a 1

这将有('t->int) -> u签名选择具体的a将起作用。请注意,func4 1 2肯定不会编译