如何将值管道转移到函数的左侧参数?

时间:2013-09-26 05:25:44

标签: f# f#-3.0

例如,

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

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

2 个答案:

答案 0 :(得分:10)

我假设你至少有两个管道。否则,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. 使用包含funfunction个关键字的匿名函数 如果您需要进行模式匹配,这很方便。

    input
    |> createOption
    |> function None -> 0 | Some _ -> 1
    
  4. 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