问题 类型差异很小


我有三个应该是平等的功能:

let add1 x = x + 1
let add2 = (+) 1
let add3 = (fun x -> x + 1) 

为什么这些方法的类型不同?
add1和add3是 int -> int,但add2是 (int -> int)。 它们都按预期工作,我只是好奇为什么FSI以不同的方式呈现它们?


2541
2018-02-23 15:43


起源



答案:


这通常是一个不重要的区别,但如果你真的很好奇,请参阅 价值的Arity一致性 F#规格的一部分。

我的快速总结就是这样 (int -> int) 是一个超集 int -> int。以来 add1 和 add3 是语法函数,推断它们具有更具体的类型 int -> int,而 add2 是一个函数值,因此推断出具有该类型 (int -> int) (并不能被视为一个 int -> int)。


16
2018-02-23 15:48



你提到的规范的一部分与向其他语言呈现函数有关,说只有'true'函数才能实现int - > int。我做了一个C#项目引用了一个F#项目,果然,add1和add3是可以从C#访问的方法,而add2是一个FSharpFunc <int,int>! - Robert Jeppesen
我也想知道这件事,谢谢你的澄清。组合函数也是如此? (即让f = b >> m)其中f假设参数传递给b - Alex
@Alex - 将被编译为方法的唯一内容是语法函数(或者 let f x = ... 要么 let f = fun x -> ...)。 let f = b >> m 不是句法功能: f 定义为通过应用运算符获得的值 (>>) 价值观 b 和 m。我希望能回答你的问题。 - kvb
所以要关闭,为了使组合函数可用于其他语言,你必须将它们包装在另一个函数中,有点否定F#的“高阶”参数,至少在互操作场景中?我没有看到一个很好的技术原因吗? - Robert Jeppesen
@kvb - 感谢您的回答,非常感谢! - Robert Jeppesen


答案:


这通常是一个不重要的区别,但如果你真的很好奇,请参阅 价值的Arity一致性 F#规格的一部分。

我的快速总结就是这样 (int -> int) 是一个超集 int -> int。以来 add1 和 add3 是语法函数,推断它们具有更具体的类型 int -> int,而 add2 是一个函数值,因此推断出具有该类型 (int -> int) (并不能被视为一个 int -> int)。


16
2018-02-23 15:48



你提到的规范的一部分与向其他语言呈现函数有关,说只有'true'函数才能实现int - > int。我做了一个C#项目引用了一个F#项目,果然,add1和add3是可以从C#访问的方法,而add2是一个FSharpFunc <int,int>! - Robert Jeppesen
我也想知道这件事,谢谢你的澄清。组合函数也是如此? (即让f = b >> m)其中f假设参数传递给b - Alex
@Alex - 将被编译为方法的唯一内容是语法函数(或者 let f x = ... 要么 let f = fun x -> ...)。 let f = b >> m 不是句法功能: f 定义为通过应用运算符获得的值 (>>) 价值观 b 和 m。我希望能回答你的问题。 - kvb
所以要关闭,为了使组合函数可用于其他语言,你必须将它们包装在另一个函数中,有点否定F#的“高阶”参数,至少在互操作场景中?我没有看到一个很好的技术原因吗? - Robert Jeppesen
@kvb - 感谢您的回答,非常感谢! - Robert Jeppesen