構図

2017-11-06 7 views
3

と偶数が、私はラムダ構文を使用してリスト内の偶数番号を取得することができます取得:構図

[1..10] |> List.filter (fun x -> x % 2 = 0) 

をしかし、私はこのように、組成物とそれを取得したい:

[1..10] |> List.filter ((% 2) >> (= 0)) 

エラー:STDIN (7,37):エラーFS0010:式の予期しない整数リテラル。期待される ')'または他のトークン。

答えて

7

F#はoperator sectionsをサポートしていません。あなたは部分的にそうように、括弧で囲むことでオペレータを適用することができます。

let five = (+) 2 3 
let add2 = (+) 2 
let alsoFive = add2 3 

しかし、これはあなたが部分的にオペレータの引数を適用することはできません。言い換えれば、F#はHaskellの式(/ 2)に相当するものを提供していません。 (+ 2) === (2 +)はF#で((+) 2)と表現できますが、非可換型では表現できないため、加算や乗算などの可換性演算子では処理できます。あなたは絶対に任意のより多くの機能を宣言していないと主張した場合、あなたはflipをどうしようとすることができ

let mod2 x = x % 2 
[1..10] |> List.filter (mod2 >> ((=) 0)) 

あなたができる最善のは、このように、別の関数としてのセクションを宣言しています

[1..10] |> List.filter ((flip (%) 2) >> ((=) 0)) 

しかし、あなたはとにかくそれを自分で宣言する必要があると思いますので、悲しいことに、F#の標準ライブラリは、どちらかflip機能を提供していません:

個人的に、私はむしろ増加し、読みやすさのために行くとisEven関数を宣言します:

let isEven x = (x % 2) = 0 
[1..10] |> List.filter isEven 
+1

は[FSharpx.Extras](https://github.com/fsprojects/FSharpx.Extras) 'flip'のIを持っています思う。 – ildjarn

+2

依存関係を追加するか、自分自身を宣言する - 同じ作業量。あなたがこれらのダースを持っているなら、多分、依存関係に行きます。しかし、ただのために - あまりにも。 –

関連する問題