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