如何在 Elm 中部分应用具有所需顺序的函数?
How to partially apply a function with desired order in Elm?
假设我有一个将 3 个参数作为输入的函数。如何在 Elm 中部分应用此函数,使其接受第一个和最后一个参数并等待第二个参数 return 最终结果?
这可以在 Ramda 中使用名为 placeholer
的 R.__
完成。
你可以将它包装在一个具有你想要的形状的 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.
假设我有一个将 3 个参数作为输入的函数。如何在 Elm 中部分应用此函数,使其接受第一个和最后一个参数并等待第二个参数 return 最终结果?
这可以在 Ramda 中使用名为 placeholer
的 R.__
完成。
你可以将它包装在一个具有你想要的形状的 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.