2013-12-21 8 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

私はあなたがハスケルから来たとは、それがこのように動作するように期待:)

を不幸にするために、F#が糖衣構文を持っていません式の前後に括弧を付けて演算子を部分的に適用することができます。あなたのコードでは、+1は1つの数字のトークンとみなされます。そのため、それは関数ではないと不平を言うのです。

しかし、F#には、オペレータだけをかっこで囲むことができる構文があります。 @ Leeの解決策につながる。しかし、この構文に注意してください。(+) 1は、と同じですが、(+1)ではありません。明らかに加算のためにそれは重要ではないが、減算のような非対称の演算に対しては、誤解を招く可能性がある。

+0

はい、私が 'add x'や'(+)1'を書くと左辺になることは明らかです。しかし、本当に '+ 1'を表現したいのであれば、ラムダを使う必要がありますか? 'fun x - > x + 1'のように? –

+1

@MaikKlein、関数を渡す必要がありますが、 '+ 1'は関数式ではありません。 '(+)1'はです。ラムダは、特に非対称の演算子のために、最も読みやすい構文を持っていることが多くあります。 '(/)2'と書くと' fun x - > 2/x'となり混乱します。ただし、ポイントフリーのスタイルで書くことは可能です。 'fun x - > x/2'は'(/)>>(|>)2'と等価です。 [この回答](http://stackoverflow.com/a/11383421/974789)を参照してください。 – bytebuster

+0

@MaikKlein基本的な問題は、 '+ 1 = fun x - > x + 1'から' + 1 = 1'をどのように区別するかということです。 F#ソリューションは、関数ではなく数字を書くことを常に試みているということです。 –

関連する問題