2013-12-21 37 views
5

我目前正在阅读编程在F#3.0中,我读到F#支持部分函数应用程序。部分函数应用程序与List.map

但如果我尝试

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

然后我得到error FS0001: This expression was expected to have type 'a -> 'b

List.map (fun x -> x + 1) [1 .. 10];;编译罚款。任何想法为什么?

回答

5

你需要把周围的+括号:

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

我想你来自Haskell中,对于期待它以这种方式工作:)

不幸的是,F#不具备的语法糖您可以在其中部分应用操作员,方法是在表达式前面或后面加上括号。在你的代码中,+1被认为是一个单一的数字标记,这就是为什么它抱怨它不是一个函数。

但是,F#所具有的是可以单独对操作符加括号的语法。这导致@李的解决方案。不过要注意这个语法:(+) 1相当于Haskell的(1+),而不是(+1)。显然,对于添加它并不重要,但对于减法等不对称操作而言,它可能会产生误导。

+0

对我来说,很明显,如果我会写'add x'或'(+)1',它会是左边的。但是如果我想真正表达'+ 1',我将不得不使用lambda?像'fun x - > x + 1'? –

+1

@MaikKlein,你必须传递一个函数,但'+ 1'不是函数表达式; '(+)1'是。许多人认为lambda具有最易读的语法,尤其是因为非对称运算符。如果你写'(/)2',它会是'有趣的x - > 2/x',这是令人困惑的。但是,可以用无点式的方式编写它。 'fun x - > x/2'相当于'(/)>>(|>)2'。看[这个答案](http://stackoverflow.com/a/11383421/974789)。 – bytebuster

+0

@MaikKlein基本问题是如何将'+ 1 = 1'与'+ 1 = fun x - > x + 1'区分开来。 F#解决方案是你总是试图写一个数字而不是一个函数。 –