6

F#に引数名がない最初の引数に関して、モジュラス演算子などの非対称演算子の部分関数アプリケーションを作成するにはどうすればよいですか?私の最初の試みは

let mod10 = (%) 10もちろんこれは

mod10(x) = 10 mod x希望の代わりに

mod10(x) = x mod 10。確かに私は書くことができました

let mod10 x = (%)x 10しかし、引数に名前を付ける必要はないので、使用できるプレースホルダーはありますか?

let mod10 = (%)_ 10

4

2 に答える 2

20

これが機能合成に基づく解決策です。

let mod10 = (%) >> (|>) 10

UPDここに一言で説明しましたが、プログラマーはコードを話すので、数学的な証明の方法で、以下はそれをはるかによく説明すると思います。

次の式は同じです:

let m1 x = x % 10                    
let m2 x = (%) x 10                  // x (op) y = (op) x y
let m3 x = ((%) x) 10                // f x y = (f x) y
let m4 x = 10 |>         ((%) x)     // f x = x |> f
let m5 x = ((|>) 10)     ((%) x)     // x |> f = (|>) x f
let m6 x = ((%) x)    |> ((|>) 10)   // f x = x |> f
let m7 x = (x |> (%)) |> ((|>) 10)   // (op) x = x |> (op)
let m8 x = x |> ((%)  >> ((|>) 10))  // f(x) |> g = x |> (f >> g)
let m9   =       (%)  >> ((|>) 10)   // remove formal argument
let m10  =       (%)  >>  (|>) 10    // remove unnecessary parenthesis

代替構文:

let mod10_2 = (|>) 10 << (%)
于 2012-07-08T13:14:41.047 に答える
13

flipポイントフリースタイルで一般的な関数を定義できます。

let inline flip f x y = f y x

次のように使用します。

let (%-) = flip (%)
let mod10 = (%-) 10

または直接このように:

let mod10 = flip (%) 10

ポイントフリースタイルは(この例のように)常に読み取り可能であるとは限らず、F#プログラミングでは一般的ではありません。

于 2012-07-07T20:36:12.943 に答える