Как частично применить функцию с желаемым порядком в Elm? - PullRequest
3 голосов
/ 11 марта 2019

Предположим, у меня есть функция, которая принимает 3 параметра в качестве входных данных. Как частично применить эту функцию в Elm, чтобы она принимала первый и последний параметры и ждала, пока второй параметр вернет окончательный результат?

Это можно сделать в Ramda с R.__, который называется placeholer.

Ответы [ 3 ]

5 голосов
/ 11 марта 2019

Вы можете просто обернуть его в лямбда-функцию, имеющую желаемую форму, которая в любом случае будет создана любым другим способом:

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

На языке карри я считаю необходимым сделатьэто настолько редко, что добавление синтаксического сахара специально для этого варианта использования кажется ненужным.

2 голосов
/ 14 марта 2019

Как говорит 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. 
0 голосов
/ 11 марта 2019

Вы можете использовать flip из основного модуля Basics.

Например:

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