2017-06-14 8 views
17

からOperators.id<'T> Function (F#)FSharp.Coreの `id`関数の目的は何ですか?

アイデンティティ関数。

パラメータ:Xタイプ:「T(入力値)

戻り値:同じ値でサポート

F#コアライブラリバージョン:2.0、4.0、ポータブル

なぜその入力を返す関数はありますか?

+3

興味深いことに、数学的背景にも注意してください。 「何もしない」オブジェクトを持つことは重要な構造を与える。ゼロは追加される数字のアイデンティティであり、1つは乗算される数字のアイデンティティであるため、 'id'は合成中の関数のセットのアイデンティティです。関数型言語では、関数をオブジェクトとして操作したり、操作を実行したりすることがしばしばあります。 –

+0

@matt_t_greggこれを回答として投稿すると、非常に多くのアップフォースが得られます。 –

+0

@FyodorSoikin私はあなたの答えがなぜ必要であり、使用されたのかという実用性をカバーしてくれてとても嬉しかったです。私が思った数学はもっと面白いものでした。 –

答えて

24

高階関数(他の関数を返す、および/またはパラメータとして他の関数を取るすなわち関数)を扱うとき、あなたは常にパラメータとして何かを提供する必要がありますが、実際には必ずしもありませんあなたが適用したいデータ変換。

たとえば、関数Seq.collectは一連のシーケンスを平坦化し、「外側」シーケンスの各要素の「入れ子」シーケンスを返す関数を取ります。たとえば、これはあなたには、いくつかの種類のUIコントロールのすべての孫のリストを取得する方法を次のとおりです。

let control = ... 
let allGrandChildren = control.Children |> Seq.collect (fun c -> c.Children) 

しかし、多くの時間、シーケンスの各要素は、すでにそれ自体でシーケンスになります - 例えば、あなたはリストのリスト持っている可能性があります。この場合

let l = [ [1;2]; [3;4]; [5;6] ] 

を、あなたはSeq.collectに渡すパラメータの機能は、単に引数を返す必要がある:

let flattened = [ [1;2]; [3;4]; [5;6] ] |> Seq.collect (fun x -> x) 

このEXPRES fun x -> xは、その引数を返す関数であり、「同一性関数」とも呼ばれます。

let flattened = [ [1;2]; [3;4]; [5;6] ] |> Seq.collect id 

その使用作物アップはそれほど頻繁にそれが標準ライブラリ内の場所に値することを高階関数(上記Seq.collectなど)で作業するとき。

もう1つの説得力のある例はSeq.chooseです。これは、Optionの値のシーケンスをフィルタリングし、同時にそれらをアンラップする機能です。すでにOption値のリストを与えられている場合

let tryParse s = match System.Int32.TryParse s with | true, x -> Some x | _ -> None 
let strings = [ "1"; "2"; "foo"; "42" ] 
let numbers = strings |> Seq.choose tryParse // numbers = [1;2;42] 

しかし、何から始めること:例えば、これはあなたが数字として、すべての文字列を解析し、解析できないものを捨てるかもしれませんどのようにでしょうか?レスキューへのアイデンティティ機能!

+0

'Seq.choose id'の例は素晴らしいですが、' Seq.collect id'は 'Seq.concat'を読みにくい方法です。 (つまり、私は 'Seq.collect id'を何度も書いていると確信しています。 –

11

ラムダ(fun x -> x)を書き出す代わりに、idを引数として渡すことができるように、特定の上位関数(関数を引数としてとる関数)には便利です。

[[1;2]; [3]] |> List.collect id // [1; 2; 3] 
+0

この場合、 'List.concat'を使うだけで、読みやすくなります:-)。 –

関連する問題