将另一个参数输入F#中的行

dem*_*tos 6 f# pipeline

管道参数是否仅适用于接受一个参数的功能?如果我们看看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
Run Code Online (Sandbox Code Playgroud)

他的filesUnderFolder函数只期望rootFolder参数,如果函数期望两个参数,即
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
Run Code Online (Sandbox Code Playgroud)

因为我可以定义
let inline (>>) f g x y = g(f x y)
我认为我应该能够使用具有多个输入参数的函数的管道运算符,对吧?我错过了什么?

gra*_*bot 14

混合管道运算符和curried参数时,请注意传递参数的顺序.

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

考虑一下,好像编译器在函数及其参数周围加上括号.

@"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
Run Code Online (Sandbox Code Playgroud)

有三个论点

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
Run Code Online (Sandbox Code Playgroud)

定义

let inline (|>) x f = f x

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

let inline (|||>) (x1,x2,x3) f = f x1 x2 x3
Run Code Online (Sandbox Code Playgroud)


Bri*_*ian 9

你建议的例子应该可以正常工作,la

let add x y = x + y

41
|> add 1
|> printfn "%d"
Run Code Online (Sandbox Code Playgroud)

如果filesUnderFolder需要两个curried args,并将其部分应用于一个arg,则可以在管道中将其用于另一个arg.

(还要注意鲜为人知的管道运营商 ||>

(41,1)
||> add
|> printfn "%d"
Run Code Online (Sandbox Code Playgroud)

它需要一个2元组并按顺序将它们送入以下内容.)