运算符-6ren"> 运算符-我真的很喜欢 Elm,直到我遇到了一个我以前从未见过的函数并想了解它的输入和输出。 以foldl的声明为准例如: foldl : (a -> b -> b) -> b -> List a -> b 我-6ren">
gpt4 book ai didi

elm - 如何 "read"Elm 的 -> 运算符

转载 作者:行者123 更新时间:2023-12-04 06:56:50 24 4
gpt4 key购买 nike

我真的很喜欢 Elm,直到我遇到了一个我以前从未见过的函数并想了解它的输入和输出。

foldl的声明为准例如:

foldl : (a -> b -> b) -> b -> List a -> b

我看着这个,不禁觉得好像缺少一组括号,或者关于这个运算符的关联性的其他一些微妙之处(我找不到任何明确的文档)。也许这只是更多地使用该语言的问题,直到我对它有了“感觉”,但我想有一种方法可以用英语“阅读”这个定义。

查看 docs 中的示例…
foldl (::) [] [1,2,3] == [3,2,1]

我希望函数签名读取如下内容:

Given a function that takes an a and a b and returns a b, an additional b, and a List, foldl returns a b.



那是对的吗?

对于像我这样迫切希望用逗号分隔输入并更清楚地分隔输入/输出的人,您有什么建议?

最佳答案

简短的回答

您正在寻找的缺少括号是由于 ->是右结合的:类型 (a -> b -> b) -> b -> List a -> b相当于(a -> b -> b) -> (b -> (List a -> b)) .非正式地,在 -> 的链中s,阅读最后 -> 之前的所有内容作为一个论点,结果只有最正确的事情。

长答案

您可能缺少的关键见解是 currying -- 如果你有一个接受两个参数的函数,你可以用一个接受第一个参数并返回一个接受第二个参数然后返回结果的函数来表示它。

例如,假设你有一个函数 add这需要两个整数并将它们相加。在 Elm 中,您可以编写一个函数,将两个元素都作为一个元组并将它们相加:

add : (Int, Int) -> Int
add (x, y) = x+y

你可以称之为
add (1, 2)  -- evaluates to 3

但是假设你没有元组。您可能认为没有办法编写此函数,但实际上使用 currying 您可以将其编写为:
add : Int -> (Int -> Int)
add x =
let addx : Int -> Int
addx y = x+y
in
addx

也就是说,您编写了一个函数,该函数采用 x并返回另一个接受 y 的函数并将其添加到原始 x .你可以用
((add 1) 2)  -- evaluates to 3

你现在可以想到 add有两种方式:或者作为一个接受 x 的函数和 y并添加它们,或者作为一个“工厂”函数,它采用 x重视并生产新的、专业的 addx只接受一个参数并将其添加到 x 的函数.

“工厂”的思维方式偶尔会派上用场。例如,如果您有一个名为 numbers 的数字列表。如果您想为每个号码加 3,您可以调用 List.map (add 3) numbers ;如果您编写的是元组版本,则必须编写类似 List.map (\y -> add (3,y)) numbers 的内容这有点尴尬。

Elm 来自编程语言的传统,它非常喜欢这种思考函数的方式并尽可能鼓励它,因此 Elm 的函数语法旨在使其变得简单。为此, ->是右结合的: a -> b -> c相当于 a -> (b -> c) .这意味着如果你不加括号,你定义的是一个接受 a 的函数。并返回 b -> c ,我们可以再次将其视为一个接受 a 的函数。和 b并返回 c , 或者等效地是一个接受 a 的函数并返回 b -> c .

调用这些函数还有另一个语法上的好处:函数应用程序是左关联的。那样,丑的 ((add 1) 2)从上面可以写成 add 1 2 .通过该语法调整,您根本不必考虑柯里化(Currying),除非您想部分应用一个函数——只需使用所有参数调用它,语法就会奏效。

关于elm - 如何 "read"Elm 的 -> 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35906111/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com