2

私は2つの機能を持っていfますg

let f (x:float) (y:float) = 
    x * y

let g (x:float) = 
    x * 2.0

>>それらを構成 ( ) して、実行する新しい関数を取得fし、結果を取得したいと考えていgます。

ソリューションは次のように動作する必要があります。

let h x y = 
    (f x y) |> g

これは動作しません:

// Does not compile
let h = 
    f >> g

どの>>ように使用する必要がありますか?

4

2 に答える 2

4

これを達成したいと思います:

let fog x  =  f x >> g 

この順序で直接構成することはできませんf >> g。f は 2 つのパラメーターを想定しているため、意味があります。これを行うf xと、部分的に適用された関数になりますがg、関数ではなく値が想定されます。

他の方法で構成すると、交換関数を使用しているため、特定の例でも同じ結果が得られます。は単一の値を期待するg >> fため、部分的に適用された関数になる構成を取得できます。そのため、値を適用して別の値 (関数ではない)を取得し、2 つの値を期待すると、部分的に適用された関数が得られます。ggf

于 2015-10-12T16:45:01.583 に答える
2

ポイントフリー スタイルで書く、つまり、明示的な引数なしで関数を定義すると、暗黙の引数が複数ある場合に見苦しくなります。

演算子を正しく組み合わせれば、いつでも実行できます。しかし、結果はがっかりすることになり、ポイントフリー スタイルの主な利点であるシンプルさと読みやすさが失われます。

楽しみと学習のために、試してみます。明示的な (別名「ポイントフル」) スタイルから始めて、そこから作業を進めましょう。

(注意: 合成演算子を(>>) (a) (b)通常のa >> b.

let h x y =  f x y |> g

let h x = f x >> g

// everybody puts on their parentheses!
let h x = (>>) (f x) (g)

// swap order
let h x = (<<) (g) (f x)

// let's put another pair of parentheses around the partially applied function
let h x = ((<<) g) (f x)

そこにいます!ほら、今は私たちが望むh xで表現されています-「に渡し、次に結果を別の関数に渡します」。xf

その関数はたまたま であり((<<) g)、これはfloat -> floatを引数として取り、その合成を で返す関数ですg

(使用されている特定の例では違いはありませんが、2 番目に重要な構成ですg)

もちろん、私たちのfloat -> float議論は(f x)の部分的な適用ですf

したがって、次のようにコンパイルされます。

let h x = x |> f |> ((<<) g)

これは、次のように非常に明確に単純化できます。

let h = f >> ((<<) g)

それが何を意味するかをすでに知っている場合、これはそれほどひどいものではありません。しかし、センスのある人なら誰でも、むしろ読み書き するでしょうlet h x y = f x y |> g

于 2015-10-12T19:06:21.660 に答える