我有两个类型的问题int - >(int - > int)和(int - > int) - > int。这两者有什么区别?Curried函数f#
我在这里读到的地方,第一个可以被解释为一个函数,它接受一个int并返回一个函数,该函数接受和int并返回一个int,它与int - > int - > int相同。这是正确的吗?
我有两个类型的问题int - >(int - > int)和(int - > int) - > int。这两者有什么区别?Curried函数f#
我在这里读到的地方,第一个可以被解释为一个函数,它接受一个int并返回一个函数,该函数接受和int并返回一个int,它与int - > int - > int相同。这是正确的吗?
int -> (int -> int)
和int -> int -> int
之间的差别可以忽略不计(如果你要我,你会真正关心与另一种语言结合)。这些是curried函数,它们有效地使用两个整数并返回一个整数(例如,内置的加法运算符具有这些行的类型)。
但是,这两个都与(int -> int) -> int
大不相同,它将函数从整数转换为整数并返回一个整数。正如其他人所提到的,这种功能的唯一简单例子就是将给定的函数应用于特定的值(例如fun (f:int->int) -> f 13
)。
我真的不知道F#,但它看起来很直观(许多其他语言都有相同的概念)。
第一种会有点像咖喱功能。
所以让我们看看会是什么样实现比如:
第一
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
绝对不会编译
'func1 2 3' * does * work。不需要编译器,你可以使用http://tryfs.net或http://ideone.com/ :) – 2012-02-22 05:33:30
我相信有一个错误。 Func1 2 3应该评估为5,因为它与(fun1 2)3相同。此外,由于 - >右侧相关,int - >(int - > int)和int - > int - > int之间没有区别 – user1072706 2012-02-22 05:34:05
@MauricioScheffer,user1072706 - 感谢您的更正 - 回答更新 – 2012-02-22 08:38:11
好问题,我怀疑功能上没有太大的区别。我花了一段时间试图弄清楚如何获得这两个签名。 (约翰·帕尔默的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
(这并不直接回答你的问题,但可能给别人的东西来啃)
您可以给第二种类型的例子? – user1072706 2012-02-22 23:28:12
@ user1072706 - 正如我在我的回答中提到的,“fun(f:int-> int) - > f 13'就是这样一个例子。 – kvb 2012-02-23 03:02:46