我是榆树的新手,说实话,我现在有点努力理解某些概念。我不确定我的问题有多清楚,但这就是我想做的。
例如:
aFunction value1 value2
相当于:
value2
|> aFunction value1
但是,如果我想通过管道而不是value2
传递value1
aFunction
怎么办?
目前我正在使用这样的东西:
value1
|> (x y -> aFunction y x) value2
然而,老实说,这让我感到有点笨拙。有没有更优雅的方法可以做到这一点?
我试图在实践中编写的代码是相当长的管道链的一部分,使用带有大量括号的表达式是不切实际的(或至少是不可读的)。
使用 flip 函数(这只是您与 lambda 表达式内联定义的函数):
value1 |> (flip aFunction) value2
根据@chepner的回答,对于具有 2 个参数的函数,flip
鉴于似乎没有任何内置的解决方案来解决如何为具有 2 个以上参数的函数执行此操作的更广泛问题,我想出了以下内容。
我真的不确定这在现实生活中是否特别有用,但这对我来说(至少)是一个有趣的练习,因为我真的还在学习相当基本的东西:
module RotArgs exposing (..)
rot3ArgsL1 func = y z x -> func x y z
rot3ArgsL2 func = z x y -> func x y z
rot4ArgsL1 func = x y z w -> func w x y z
rot4ArgsL2 func = y z w x -> func w x y z
rot4ArgsL3 func = z w x y -> func w x y z
因此,例如,rot3ArgsL1
采用一个 3 参数函数并返回该函数的一个版本,其中参数的预期顺序已向左旋转 1 位......等等。
它将实现以下功能:
import RotArgs exposing (..)
someFunction one two three =
...whatever
...
one
|> (rot3ArgsL1 someFunction) two three
显然,RotArgs
可以很容易地扩展到超过 4 个参数的函数,尽管添加的参数越多,这似乎越来越不有用。