如何通过名称解决f#管道参数?

时间:2010-09-03 08:33:55

标签: f# pipeline

我正在尝试做类似

的事情
seq { 1..100 }
|> Seq.sum
|> pown 2

它甚至没有编译因为pown期望'T ^'参数作为第一个参数而我将它作为第二个参数,因为这是管道的默认行为。通过谷歌搜索我没有找到制作“pown”的方法使用管道携带的参数作为它的第一个arg。也许它有一些默认名称?

3 个答案:

答案 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(和其他)的原因。