18

私は最近 F# を取り上げており (私のバックグラウンドは C# です)、サイトhttp://fsharpforfunandprofit.comを読んでいます。

コンビネータのセクションであるhttp://fsharpforfunandprofit.com/posts/defining-functions/にアクセスしました。ケストレルを除いて、私はそれらすべてを理解しています(Yコンビネーターまたはセージバードは私の心を狂わせますが!)。Scott Wlaschin は (F# で) 次のように定義しています。

let K x y = x

これが役立つ状況を一生理解することはできません。最初は、関数に値を渡してから元の値を取得できるように、チェーン演算子として使用できるのではないかと考えました。私は以前にそのような演算子を自分で書いたことがありますが、ご覧のとおり、同じではありません。

let (>|) x f = f x; x

K コンビネータ (値 5) を部分的に適用すると、引数を無視して代わりに 5 を返す関数が返されます。これも役に立ちません。

(K 5) = fun y -> 5

これがどこで使用されるかの簡単な例を教えてください。

4

1 に答える 1

19

非常に簡単な例を次に示します。

関数をマップできるリストのような構造があるとします。

let K x y = x

let lst = [3;5;13;2]

次のように数学関数をマッピングできます。

let plus5  = lst |> List.map ((+)5) // instead of writing List.map (fun x -> 5 + x)
// val plus5 : int list = [8; 10; 18; 7]

let times3 = lst |> List.map ((*)3) // instead of writing List.map (fun x -> 3 * x)
// val times3 : int list = [9; 15; 39; 6]

定数関数をマップしたい場合はどうすればよいですか?

let tens = lst |> List.map (K 10) // instead of writing List.map (fun x -> 10)
// val tens : int list = [10; 10; 10; 10]

FP では通常、関数を引数として渡すため、K コンビネータを使用すると、数回のキーストロークで定数関数を指定できます。

于 2014-10-01T12:26:38.070 に答える