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