例如,
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
?
这只是测试的简化示例。我有一个复杂的函数返回一个值,我想将它转发到函数的左侧(而不是右侧)。
答案 0 :(得分:10)
我假设你至少有两个管道。否则,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
和function
个关键字的匿名函数
如果您需要进行模式匹配,这很方便。
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 :(得分:5)
这是一个看起来很漂亮的解决方案。我不知道它是否太实用了
1 |> fn <| 2