如何在 Elm 中部分应用具有所需顺序的函数?

How to partially apply a function with desired order in Elm?

假设我有一个将 3 个参数作为输入的函数。如何在 Elm 中部分应用此函数,使其接受第一个和最后一个参数并等待第二个参数 return 最终结果?

这可以在 Ramda 中使用名为 placeholerR.__ 完成。

你可以将它包装在一个具有你想要的形状的 lambda 函数中,这也是通过任何其他方式产生的:

\y -> f "x" y "z"

在柯里化语言中,我发现很少需要这样做,以至于没有必要专门为这个用例添加语法糖。

您可以使用核心基础模块中的 flip

例如:

> append3 x y z = x ++ y ++ z
<function> : appendable -> appendable -> appendable -> appendable
> hello = flip (append3 "Hello, ") "!"
<function> : String -> String
> hello "world"
"Hello, world!" : String

正如 glennsl 所说,您可以使用您想要的参数顺序将您的函数包装在另一个函数中。他的回答假设你静态地知道第一个和第三个参数是什么,如果你不知道,但只是想部分应用第一个和第三个参数,然后应用第二个你可以采用这样的函数,

joinThree : String -> String -> String -> String
joinThree first second third =
        first ++ second ++ third

并将其包装在调用第一个函数的新函数中,但参数顺序不同,

joinThreeWrapper : String -> String -> String -> String
joinThreeWrapper first third second =
    joinThree first second third

这允许您像这样调用此函数,

welcomeToNeverland : String -> String
welcomeToNeverland name =
    let
        myGreeting = joinThreeWrapper "Welcome " " to Neverland"
    in
        myGreeting name

那你就可以这样使用了,

text (welcomeToNeverland "Wendy")
-- Welcome Wendy to Neverland

像这样写 joinThreeWrapper 可以更容易地将您的函数映射到列表,例如

greetMany : List String -> List String
greetMany names =
    List.map (joinThreeWrapper "Welcome " ", this is our town. ") names

这样你就可以做到,

text (List.map (++) (greetMany ["Jesse", "Carl"]))
-- Welcome Jesse, this is our town. Welcome Carl, this is our town.