1

我正在尝试做类似的事情

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

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

4

3 回答 3

5

您可以使用辅助功能:

let flip f x y = f y x

seq { 1L..100L }
    |> Seq.sum
    |> flip pown 2

在标准库中翻转会很整洁:)

于 2010-09-03T08:42:17.110 回答
4

您可以使用 lambda 为传入的值命名:

seq { 1..100 } 
|> Seq.sum 
|> (fun x -> pown x 2)

上面,我给它命名x

于 2010-09-03T09:42:47.803 回答
1

如果参数不匹配,我通常不使用管道,因为我觉得它会损害可读性。letBrian 的选项非常清楚,但它与将结果分配给一个值(使用而不是使用管道和)没有太大区别fun

所以,我只想写这个(没有任何好的功能魔法):

let x = seq { 1 .. 100 } |> Seq.sum
pown x 2

这与 Brian 的版本基本相同 - 您还将结果分配给一个值 - 但它更简单。我可能会使用更具描述性的名称,例如sumResult而不是x.

使用的版本flip在 Haskell 中是非常标准的事情——尽管我也认为它可能会变得难以阅读(不是在这种简单的情况下,但如果你结合多个功能,它很容易变得可怕)。flip我认为这也是F# 库中缺少(和其他)的原因。

于 2010-09-03T16:18:26.833 回答