简化Elm中的双参数匿名函数

时间:2017-09-20 12:46:03

标签: elm function-composition

在Elm中,如果我有一个匿名函数

monthName= 'january'
asci_letters = ['a' , 'b' , .... , 'z']

lst = list(monthName)
indxs = [i for i , _ in enumerate(monthName)]
oneLetter=[]

for i in indxs:
word = monthName
pos = list(word)
    for j in asci_letters:
        pos[i] = j
        changed = ("".join(pos))
        oneLetter.append(changed)

我可以将其简化为

(\f x -> f x)

对于双参数函数可以做同样的事情,其中​​参数是另一个函数的参数吗?

(<|)

我以为我可以简单地使用

(\x y -> f x y |> g)

但编译器抱怨类型。

具体来说,在我的(f |> g) 函数的一个案例中,我有类似的东西:

update

我正在尝试将let msgNames = [Foo, Bar] values = ["f", "b"] // These values are actually derived // by a more complicated operation model_ = List.map2 (<|) msgNames values |> List.foldl (\msg mod -> update msg mod |> Tuple.first) model in ( model_, Cmd.none ) 的匿名函数参数简化为类List.foldl,但我从编译器中得到以下错误:

(update |> Tuple.first)

1 个答案:

答案 0 :(得分:5)

我们可以按照以下几个步骤进行简化:

(\x y -> f x y |> g)
... can be written as
(\x y -> g (f x y))
... can be written as
(\x -> g << f x)

还有一个步骤让事情变得更加混乱:

(((<<) g) << f)

这与pointfree.io(使用.运算符完成函数组合的Haskell)相匹配:

(g .) . f

如果您正在尝试提高可读性,您可能只想创建自己的中缀函数:

infixr 9 <<<
(<<<) : (c -> d) -> (a -> b -> c) -> (a -> b -> d)
(<<<) g f x y =
    g (f x y)

现在你可以像这样使用它:

(g <<< f)