有没有办法将两个参数传递给Elm中的函数?

时间:2016-11-28 22:58:32

标签: elm

具有以下功能:

f : Int -> Int -> Int
f a b = 
  a + b

有没有办法管道a和b?

我只有这么远,但我想知道是否有办法摆脱括号:

main =
  1 |> (2 |> f) |> toString |> text

5 个答案:

答案 0 :(得分:5)

虽然它可能不满足你,但一个简单的可能性是:

(1,2)|>不满意

答案 1 :(得分:4)

为了管道的缘故,不要管道。说1 |> f 2 |> toString |> text比你的例子更清晰。获取管道的参数通常是数据结构,因为按照惯例,它始终是最后一个参数。让我们看一个更现实的例子:

"40"
  |> String.toInt
  |> Maybe.map (\n -> n + 2)
  |> Maybe.withDefault 2

直接参数(lambda,2)影响操作,而数据结构(链的一部分Maybe Int)通过管道传输。对比:Maybe.withDefault 2 (Maybe.map (\n -> n + 2) (String.toInt "40"))。这个丑陋的版本甚至没有更快,因为管道由编译器优化。

如果以这种方式管道数据结构的转换,则不需要管道两个项目。

答案 2 :(得分:1)

|>管道首先评估左侧,这是您想要的,并将第一个参数应用于第二个,这不是您想要的。 <|管道首先评估右侧,这不是您想要的,并将第二个参数应用于第一个,这不是您想要的。

你可以使用反转函数应用程序的lambda来绕过它。喜欢这个

add a b = a + b

add
   |> \f -> f 2
   |> \f -> f 3

-- outcome: 5

或者您可以编写辅助函数

invert v f = f v

add
   |> invert 2
   |> invert 3

答案 3 :(得分:0)

我想象不到。我从来没有见过它。它之所以不太可能,从技术上讲,所有榆树功能只需要一个参数。但是这样的事情呢?

add 1 2 3

嗯,榆树实际上是咖喱这个函数,并且在第一个带有第二个参数的参数之后返回一个匿名函数,它接受第二个参数并返回第三个参数。如果您曾经想过为什么类型注释看起来像多个参数和返回语句之间没有分离......

add : Int -> Int -> Int

......那是因为没有!

答案 4 :(得分:0)

您可以像这样实现类似的流程

1 :: 2 :: [] |> List.foldl f 0 |> toString |> text

我们的想法是使用::创建包含参数的List。然后,使用foldl将函数f应用于参数。

当然,语法中有许多多余的项目:空Listfoldl所需的起始值。继续使用示例函数,您可以使用合成来隐藏起始值:

let
    g = List.foldl f 0
in
    1 :: 2 :: [] |> g |> toString |> text

缺点是你仍然有一个起始值要处理,你可能希望它只是列表的头部(例如1)。但是,如果你尝试使用列表的头部作为起始值,你最终会遇到另一个问题:

如果没有起始值(空列表),则fold不能返回任何内容,并且所有Elm函数都有返回值。

无论如何,希望这种方法有所帮助。