F# 使用List.map的部分函数应用程序

F# 使用List.map的部分函数应用程序,f#,F#,我目前正在阅读F#3.0中的编程,我了解到F#支持部分函数应用 但是如果我尝试 List.map (+1) [1 .. 10];; 然后我得到错误FS0001:该表达式的类型应为'a->'b 但是List.map(funx->x+1)[1..10]编译良好。你知道为什么吗?你需要把+放在括号里: List.map ((+)1) [1..10] 我想你是哈斯凯尔人,因为你希望它能这样运作:) 不幸的是,F#没有语法上的糖分,可以通过在表达式前面或后面加括号来部分应用运算符。在您的代码中,+1被

我目前正在阅读F#3.0中的编程,我了解到F#支持部分函数应用

但是如果我尝试

List.map (+1) [1 .. 10];;
然后我得到
错误FS0001:该表达式的类型应为'a->'b


但是
List.map(funx->x+1)[1..10]编译良好。你知道为什么吗?

你需要把
+
放在括号里:

List.map ((+)1) [1..10]

我想你是哈斯凯尔人,因为你希望它能这样运作:)

不幸的是,F#没有语法上的糖分,可以通过在表达式前面或后面加括号来部分应用运算符。在您的代码中,
+1
被视为单个数字标记,这就是它抱怨它不是函数的原因


然而,F#所具有的是一种语法,您可以在其中单独插入运算符。这导致了@Lee的解决方案。但是要注意这个语法:
(+)1
相当于Haskell的
(1+)
,而不是
(+1)
。显然,对于加法来说,这并不重要,但是对于诸如减法之类的非对称运算,这可能会产生误导。

是的,对于我来说,很明显,如果我写
addx
(+)1
,它将是左侧。但是如果我真的想表达
+1
,我必须使用lambda?像
funx->x+1
?@MaikKlein,你必须传递一个函数,但是
+1
不是一个函数表达式<代码>(+)1是。许多人认为lambda的语法可读性最强,特别是因为非对称运算符。如果你写
(/)2
,它将是
funx->2/x
,这是令人困惑的。但是,可以用无点样式编写它
funx->x/2
相当于
(/)>>(|>)2
。请参阅。@MaikKlein基本问题是如何区分
+1=1
+1=fun x->x+1
。F#解决方案是,你总是试图写一个数字,而不是一个函数。