我是榆树的新手,说实话,我现在正在努力解决某些问题。我不确定我的问题有多清楚,但这正是我想要做的。
例如:
aFunction value1 value2
相当于:
value2
|> aFunction value1
但如果我想通过管道而不是value1
将aFunction
传递给value2
该怎么办?
目前我正在使用这样的东西:
value1
|> (\x y -> aFunction y x) value2
然而,说实话,它让我感觉像是一块垃圾。有更优雅的方式吗?
我在实践中尝试编写的代码是相当长的一系列管道的一部分,使用带有大量括号的表达式是不切实际的(或至少是不可读的)。
答案 0 :(得分:5)
使用flip函数(这是您在lambda表达式中定义的函数):
value1 |> (flip aFunction) value2
答案 1 :(得分:0)
根据@ chepner的回答,flip
似乎是对具有2个参数的函数执行此操作的最佳方法。
鉴于对于如何为具有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个参数的函数,尽管在添加的参数越多时这似乎越来越没用了。