9

パラメータをラインにパイプすることは、1 つのパラメータを受け入れる関数に対してのみ機能しますか? Chris Smiths のページの例を見ると、


// Using the Pipe-Forward operator (|>)
let photosInMB_pipeforward =
    @"C:\Users\chrsmith\Pictures\"
    |> filesUnderFolder
    |> Seq.map fileInfo
    |> Seq.map fileSize
    |> Seq.fold (+) 0L 
    |> bytesToMB

彼の filesUnderFolder 関数は rootFolder パラメーターのみを予期していましたが、関数が 2 つのパラメーターを予期していた場合、つまり
let filesUnderFolder size rootFolder

次に、これは機能しません:


// Using the Pipe-Forward operator (|>)
let size= 4
let photosInMB_pipeforward =
    @"C:\Users\chrsmith\Pictures\"
    |> filesUnderFolder size
    |> Seq.map fileInfo
    |> Seq.map fileSize
    |> Seq.fold (+) 0L 
    |> bytesToMB

定義できるので
let inline (>>) f g x y = g(f x y)
、複数の入力パラメーターを持つ関数でパイプライン演算子を使用できるはずですよね?私は何が欠けていますか?

4

3 に答える 3

16

パイプライン演算子とカリー化された引数を混在させる場合は、引数を渡す順序に注意してください。

let size = 4
let photosInMB_pipeforward =
    size, @"C:\Users\chrsmith\Pictures\"
    ||> filesUnderFolder
    |> Seq.map fileInfo
    |> Seq.map fileSize
    |> Seq.fold (+) 0L 
    |> bytesToMB

コンパイラが関数とそのパラメータをこのように括弧で囲んでいると考えてください。

@"C:\Users\chrsmith\Pictures\" |> filesUnderFolder size
または
@"C:\Users\chrsmith\Pictures\" |> (filesUnderFolder size)
_
(filesUnderFolder size) @"C:\Users\chrsmith\Pictures\"

順不同の例

let print2 x y = printfn "%A - %A" x y;;

(1, 2) ||> print2;;
1 - 2

1 |> print2 2;;
2 - 1

引数が 3 つある場合

let print3 x y z = printfn "%A - %A - %A" x y z;;

(1, 2, 3) |||> print3;;
1 - 2 - 3

(2, 3) ||> print3 1;;
1 - 2 - 3

3 |> print3 1 2;;
1 - 2 - 3

定義

let inline (|>) x f = f x

let inline (||>) (x1,x2) f = f x1 x2

let inline (|||>) (x1,x2,x3) f = f x1 x2 x3
于 2010-02-25T01:44:43.833 に答える
11

あなたが提案した例はうまくいくはずです。

let add x y = x + y

41
|> add 1
|> printfn "%d"

filesUnderFolder2 つのカリー化された引数を取り、それを 1 つの引数に部分的に適用する場合、パイプラインで他の引数に使用できます。

(あまり知られていないパイプライン演算子にも注意してください||>

(41,1)
||> add
|> printfn "%d"

これは 2 タプルを取り、それらを次のものに順次フィードします。)

于 2010-02-25T00:42:02.733 に答える
4

スタイルが悪い(?)かもしれませんが、「右側から」パイプラインにパラメータを追加できます

let h x y z = x + y - z

let sub x y = x - y

let sqr x = x * x

3 |> h <| 2 <| 7
  |> sub <| 23
  |> sqr

// is the same as
sqr (sub (h 3 2 7) 23)
于 2015-11-19T14:38:45.993 に答える