我正在尝试做类似的事情
seq { 1..100 }
|> Seq.sum
|> pown 2
它甚至无法编译,因为 pown 期望 'T^' 参数作为第一个参数,而我将其作为第二个参数,因为这是管道的默认行为。通过谷歌搜索,我没有找到让“pown”使用管道携带的参数作为第一个参数的方法。也许它有一些默认名称?
您可以使用辅助功能:
let flip f x y = f y x
seq { 1L..100L }
|> Seq.sum
|> flip pown 2
在标准库中翻转会很整洁:)
您可以使用 lambda 为传入的值命名:
seq { 1..100 }
|> Seq.sum
|> (fun x -> pown x 2)
上面,我给它命名x
。
如果参数不匹配,我通常不使用管道,因为我觉得它会损害可读性。let
Brian 的选项非常清楚,但它与将结果分配给一个值(使用而不是使用管道和)没有太大区别fun
。
所以,我只想写这个(没有任何好的功能魔法):
let x = seq { 1 .. 100 } |> Seq.sum
pown x 2
这与 Brian 的版本基本相同 - 您还将结果分配给一个值 - 但它更简单。我可能会使用更具描述性的名称,例如sumResult
而不是x
.
使用的版本flip
在 Haskell 中是非常标准的事情——尽管我也认为它可能会变得难以阅读(不是在这种简单的情况下,但如果你结合多个功能,它很容易变得可怕)。flip
我认为这也是F# 库中缺少(和其他)的原因。