我有两个类型的问题int - > (int - > int)和(int - > int) - > INT。这两者有什么区别?
我在这里读到的第一个可以被解释为一个函数,它接受一个int并返回一个带有int和int的函数并返回一个int,它与int相同 - > int - > INT。这是正确的吗?
答案 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#,但它看起来很直观(很多其他语言都有相同的概念)。
第一种有点像咖喱功能。
答案 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
肯定不会编译