9

例如,

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

这只是一个简化的测试示例。我有一个复杂的函数返回一个值,我想将它转发到函数的左侧(而不是右侧)。

4

2 回答 2

9

我假设您至少有两个管道。否则,fn 1 2做这项工作;为什么我们要让它变得更复杂?

对于交换函数(满足f x y = f y x),例如(+),(*)等,您可以使用1 |> fn 2.

对于其他功能,我可以看到一些替代方案:

  1. 使用反向管道

    arg1
    |> fn1
    |> fn2 <| arg2
    

    我倾向于谨慎使用它,因为运算符的优先级可能会导致一些微妙的错误。

  2. 使用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
    

    这并不漂亮,但很明显,参数的顺序(/)被不同地对待。

  3. 使用带有funandfunction关键字的匿名函数
    如果您需要适当的模式匹配,这很方便。

    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    
于 2013-09-26T05:57:32.447 回答
5

这是一个看起来很漂亮的解决方案。不知道是不是太实用了

1 |> fn <| 2
于 2013-09-26T05:28:22.897 回答