2012-02-22 55 views
1

我有两个类型的问题int - >(int - > int)和(int - > int) - > int。这两者有什么区别?Curried函数f#

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

回答

3

int -> (int -> int)int -> int -> int之间的差别可以忽略不计(如果你要我,你会真正关心与另一种语言结合)。这些是curried函数,它们有效地使用两个整数并返回一个整数(例如,内置的加法运算符具有这些行的类型)。

但是,这两个都与(int -> int) -> int大不相同,它将函数从整数转换为整数并返回一个整数。正如其他人所提到的,这种功能的唯一简单例子就是将给定的函数应用于特定的值(例如fun (f:int->int) -> f 13)。

+0

您可以给第二种类型的例子? – user1072706 2012-02-22 23:28:12

+0

@ user1072706 - 正如我在我的回答中提到的,“fun(f:int-> int) - > f 13'就是这样一个例子。 – kvb 2012-02-23 03:02:46

2

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

  1. 是一个函数取一个整数,并返回一个函数,它接受一个int并返回一个int
  2. 是一个函数,利用函数接受一个int并返回一个int,并返回一个int

第一种会有点像咖喱功能。

0

所以让我们看看会是什么样实现比如:

第一

let func1 i = fun j -> i+j 

这有int -> (int -> int)

音符的签名func1 2 3不应该工作

编辑:事实证明,由于联系性的工作方式,这就是交流tually精细

但这是

let func2 i j= i+j 

其中有一个类型的int -> int -> int

这里func2 1 2不同的是罚款

另一个例子中,我们可以建立这样的:

let func4 a = a 1 

这将有一个签名('t->int) -> u采摘混凝土a将工作。请注意,func4 1 2绝对不会编译

+2

'func1 2 3' * does * work。不需要编译器,你可以使用http://tryfs.net或http://ideone.com/ :) – 2012-02-22 05:33:30

+1

我相信有一个错误。 Func1 2 3应该评估为5,因为它与(fun1 2)3相同。此外,由于 - >右侧相关,int - >(int - > int)和int - > int - > int之间没有区别 – user1072706 2012-02-22 05:34:05

+0

@MauricioScheffer,user1072706 - 感谢您的更正 - 回答更新 – 2012-02-22 08:38:11

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 

(这并不直接回答你的问题,但可能给别人的东西来啃)