例如,
let fn x y = printfn "%i %i" x y
1 |> fn 2 // this is the same as fn 2 1 instead of fn 1 2
怎么做fn 1 2
?
这只是一个简化的测试示例。我有一个复杂的函数返回一个值,我想将它转发到函数的左侧(而不是右侧)。
我假设您至少有两个管道。否则,fn 1 2
做这项工作;为什么我们要让它变得更复杂?
对于交换函数(满足f x y = f y x
),例如(+)
,(*)
等,您可以使用1 |> fn 2
.
对于其他功能,我可以看到一些替代方案:
使用反向管道
arg1
|> fn1
|> fn2 <| arg2
我倾向于谨慎使用它,因为运算符的优先级可能会导致一些微妙的错误。
使用flip
功能
let inline flip f x y = f y x
Array.map2 (fun y d -> (y - d) ** 2.0) y d
|> Array.sum
|> flip (/) 2.0
这并不漂亮,但很明显,参数的顺序(/)
被不同地对待。
使用带有fun
andfunction
关键字的匿名函数
如果您需要适当的模式匹配,这很方便。
input
|> createOption
|> function None -> 0 | Some _ -> 1
IMO,您不必一直管道。再创建一个let
绑定,那么你的意图就很清楚了,你可以避免由于不寻常的样式而导致的错误。
let sum =
Array.map2 (fun y d -> (y - d) ** 2.0) y d
|> Array.sum
sum / 2.0
这是一个看起来很漂亮的解决方案。不知道是不是太实用了
1 |> fn <| 2