1

私は次のようなことをしようとしています

seq { 1..100 }
|> Seq.sum
|> pown 2

これはパイプラインのデフォルトの動作であるため、pownは最初の引数として「T ^」引数を期待し、2番目の引数としてそれを与えているため、コンパイルすらしません。グーグルで、「pown」が最初の引数としてパイプラインによって運ばれるパラメータを使用するようにする方法を見つけられませんでした。多分それはいくつかのデフォルト名を持っていますか?

4

3 に答える 3

5

補助機能を使用できます:

let flip f x y = f y x

seq { 1L..100L }
    |> Seq.sum
    |> flip pown 2

標準ライブラリにフリップがあると便利です:)

于 2010-09-03T08:42:17.110 に答える
4

ラムダを使用して、着信値に名前を付けることができます。

seq { 1..100 } 
|> Seq.sum 
|> (fun x -> pown x 2)

上記では、名前を付けましたx

于 2010-09-03T09:42:47.803 に答える
1

引数が一致しない場合、通常、パイプラインは使用しません。ブライアンによるオプションは非常に明確ですが、結果を値に代入することと大差ありません (letパイプラインと を使用する代わりに使用しfunます)。

だから、私はこれを書くだけです(素晴らしい関数マジックなしで):

let x = seq { 1 .. 100 } |> Seq.sum
pown x 2

これは基本的に Brian のバージョンと同じです。結果も値に代入していますが、より単純です。sumResultの代わりに、よりわかりやすい名前を使用するでしょうx

使用するバージョンflipは、Haskell で行うにはかなり標準的なことですが、読みにくくなる可能性もあります (この単純なケースではありませんが、複数の機能を組み合わせると、簡単に恐ろしいものになる可能性があります)。flipそれが、 (およびその他の) F# ライブラリーに欠落している理由でもあると思います。

于 2010-09-03T16:18:26.833 に答える