管道参数是否仅适用于接受一个参数的功能? 如果我们查看 Chris Smiths' page处的示例,
// 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参数,
如果函数期望两个参数,即
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)
我想我应该能够使用具有多个输入参数的函数的管道运算符,对吧?我错过了什么?
答案 0 :(得分:14)
当混合管道运算符和curried参数时,请注意使用。
传递参数的顺序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
有三个参数
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
答案 1 :(得分:9)
你建议的例子应该可以正常工作,la
let add x y = x + y
41
|> add 1
|> printfn "%d"
如果filesUnderFolder
采用两个curried args,并且你将其部分应用于一个arg,则可以在管道中将其用于另一个arg。
(另请注意鲜为人知的管道运营商||>
(41,1)
||> add
|> printfn "%d"
采用2元组并按顺序将它们反馈到后面。)
答案 2 :(得分:1)
可能是错误的样式(?),但您可以从右侧向管道添加其他参数'
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)