在 elm 中,如何将值作为最后一个参数以外的参数通过管道传输到函数



我是榆树的新手,说实话,我现在有点努力理解某些概念。我不确定我的问题有多清楚,但这就是我想做的。

例如:

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 个参数的函数,尽管添加的参数越多,这似乎越来越不有用。

最新更新