在elm中,如何将一个值作为参数传递给函数而不是最后一个?

时间:2017-01-28 23:08:30

标签: elm

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

例如:

aFunction value1 value2

相当于:

value2
  |> aFunction value1

但如果我想通过管道而不是value1aFunction传递给value2该怎么办?

目前我正在使用这样的东西:

value1
  |> (\x y -> aFunction y x) value2

然而,说实话,它让我感觉像是一块垃圾。有更优雅的方式吗?

我在实践中尝试编写的代码是相当长的一系列管道的一部分,使用带有大量括号的表达式是不切实际的(或至少是不可读的)。

2 个答案:

答案 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个参数的函数,尽管在添加的参数越多时这似乎越来越没用了。