F# 如何将值转发到函数的左侧参数?

F# 如何将值转发到函数的左侧参数?,f#,f#-3.0,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 如何制作它 这只是一个简单的测试示例。我有一个复杂的函数返回一个值,我想通过管道将其转发到函数的左侧(而不是右侧)。这里有一个看起来很不错的解决方案。但我不知道这是否太实际 1 |> fn <| 2 1 |>fn我假设您至少有两条管道。否则,fn 1 2执行该任务;为什么我们要把它弄得

比如说,

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
如何制作它


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

这里有一个看起来很不错的解决方案。但我不知道这是否太实际

1 |> fn <| 2

1 |>fn我假设您至少有两条管道。否则,
fn 1 2
执行该任务;为什么我们要把它弄得更复杂

对于交换函数(满足
fxy=fyx
),例如
(+)
(*)
,等等。您只需使用
1 |>fn 2

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

  • 使用反向管道

    arg1
    |> fn1
    |> fn2 <| arg2
    
    这并不漂亮,但很明显,
    (/)
    中的参数顺序是不同的

  • 使用带有
    fun
    function
    关键字的匿名函数
    如果您需要适当的模式匹配,这非常方便

    input
    |> createOption
    |> function None -> 0 | Some _ -> 1
    
  • 依我看,你不必一路吹笛。再创建一个
    让绑定,这样您的意图就清楚了,您就可以避免由于不寻常的样式而产生的错误

    let sum =
       Array.map2 (fun y d -> (y - d) ** 2.0) y d
       |> Array.sum
     sum / 2.0    
    

    更改当前顺序的常用方法是将管道插入匿名函数:|>fun x->fn x 2这可能是一个很好的指示,表明您应该切换
    fn
    函数的参数顺序(除非您有其他管道需要传递第二个参数).我认为Tomas是对的--我认为这是一种应该告诉您可能需要重新排序参数的气味。+1表示“您不必一直使用管道”:-)以及所有其他伟大的替代方案。我经常在
    defaultArg
    中使用此选项。如何将其与
    defaultArg
    一起使用,例如
    a |>Array.tryHead |>defaultArg
    
    let sum =
       Array.map2 (fun y d -> (y - d) ** 2.0) y d
       |> Array.sum
     sum / 2.0