4

暗黙的またはポイントフリー スタイルのプログラミングでは、引数に関係なく関数を作成できます。これは F# で実行できますか?

4

2 に答える 2

6

チャックの答えとクリス・スミスのコメントに合わせて、次のように書くことができます

let digits = string_of_int >> String.length
digits 9000;; // 4
[1; 10; 100] |> List.map digits;; // [1;2;3]

これらの合成演算子とパイプライン演算子を高階関数と組み合わせると、複雑なことを非常に簡潔に行うことができます。

let prodSqrtAbs = Seq.map (abs>>sqrt) >> Seq.reduce (*)
prodSqrtAbs [| -9.0; 4.0 |];;  // 6.0

編集: J とその暗黙の fork 演算子について読みました。それは非常に強力です。F# で同等の高階演算子を作成できますが、それらは暗黙的に適用されません。したがって、たとえば、最初に定義しますlift(明示的な引数を使用)

let lift op a b x = op (a x) (b x)

そしてそれを明示的に適用します

let avg = lift (/) List.sum List.length

リンク先のウィキペディアのページの J の例に似たものを取得します。しかし、それは完全に「暗黙」ではありません。

于 2009-11-27T07:44:33.350 に答える
3

もちろん。必要なのは関数の合成とカリー化だけであり、これらは両方とも F# で可能です。

let compose f1 f2 = fun x -> f1 (f2 x);;
let digits = compose String.length string_of_int;;
digits 9000;; // 4
于 2009-11-27T06:30:55.993 に答える