有没有一种方法可以将两个参数传递到Elm中的一个函数?

有没有一种方法可以将两个参数传递到Elm中的一个函数?,elm,Elm,具有以下功能: f : Int -> Int -> Int f a b = a + b 有办法把a和b都接上管道吗 我只走了这么远,但我想知道是否有办法摆脱括号: main = 1 |> (2 |> f) |> toString |> text 尽管您可能不满意,但一个简单的可能性是: (1,2)|>我想不会。我从来没见过。之所以不太可能,是因为从技术上讲,所有elm函数只接受一个参数。但是像这样的事情呢 add 1 2 3 Elm实际上是cu

具有以下功能:

f : Int -> Int -> Int
f a b = 
  a + b
有办法把a和b都接上管道吗

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

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

尽管您可能不满意,但一个简单的可能性是:


(1,2)|>我想不会。我从来没见过。之所以不太可能,是因为从技术上讲,所有elm函数只接受一个参数。但是像这样的事情呢

add 1 2 3
Elm实际上是curry的函数,在第一个参数后返回一个匿名函数,这个匿名函数接受第二个参数,然后接受第二个参数并返回第三个参数。如果您曾经想知道为什么类型注释看起来好像在多个参数和return语句之间没有分隔

add : Int -> Int -> Int

。。。那是因为没有

不要为了配管而配管。说
1 |>f2 |>toString>text
比你的示例中的要简洁得多。管道传输的参数通常是数据结构,因为按照惯例,它总是最后一个参数。让我们看一个更现实的例子:

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

如果在数据结构上以这种方式进行转换,则不需要将两个项目插入管道。

您可以实现类似的流程,如下所示:

1 :: 2 :: [] |> List.foldl f 0 |> toString |> text
其思想是使用
创建一个包含参数的
列表。然后,使用
foldl
将函数
f
应用于参数

当然,语法中有许多多余的项:空的
列表
foldl
所需的起始值。继续使用示例函数,您可以使用composition隐藏起始值:

let
    g = List.foldl f 0
in
    1 :: 2 :: [] |> g |> toString |> text
缺点是你仍然有一个起始值要处理,你可能希望它只是列表中的头一个(例1)。但是,如果您尝试使用列表的开头作为起始值,则最终会遇到另一个问题:

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


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

管道首先计算左侧,这是您想要的,然后将第一个参数应用于第二个参数,这不是您想要的。
F#采纳了这个想法,除了给你一个
|>
|124;>
哪一个管道将一个大小为2的元组进行未载波传输,哪一个管道将一个大小为3的元组进行未载波传输。
哪一个管道将一个大小为3的元组进行未载波传输,哪一个管道将一个大小为3的元组进行未载波传输。
只要去掉括号,
1 |>f2 |>到字符串就足够了。但这当然还没有形成两个论点。下面有两个很好的答案,但我的问题是你到底想做什么。我怀疑您提供的代码不会出现在您的程序中,您的最佳答案取决于您的实际环境
add a b = a + b

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

-- outcome: 5
invert v f = f v

add
   |> invert 2
   |> invert 3