有没有一种方法可以将两个参数传递到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