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

Ral*_*lph 3 function-composition elm

在榆树中,如果我有匿名功能

(\f x -> f x)
Run Code Online (Sandbox Code Playgroud)

我可以简化为

(<|)
Run Code Online (Sandbox Code Playgroud)

对于参数为另一个函数的参数的两参数函数,可以这样做吗?

(\x y -> f x y |> g)
Run Code Online (Sandbox Code Playgroud)

我以为我可以用

(f |> g)
Run Code Online (Sandbox Code Playgroud)

但是编译器抱怨类型。

具体来说,在我的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 )
Run Code Online (Sandbox Code Playgroud)

我试图简化匿名函数参数List.foldl喜欢的东西(update |> Tuple.first),但我从编译器以下错误:

The right side of (|>) is causing a type mismatch.

159|                                      update |> Tuple.first)
                                                    ^^^^^^^^^^^
(|>) is expecting the right side to be a:

    (Msg -> Model -> ( Model, Cmd Msg )) -> a

But the right side is:

    (( Model, Cmd Msg )) -> Model
Run Code Online (Sandbox Code Playgroud)

Cha*_*ert 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)
Run Code Online (Sandbox Code Playgroud)

再迈一步,事情就会变得更加混乱:

(((<<) g) << f)
Run Code Online (Sandbox Code Playgroud)

这与您从pointfree.io(在Haskell中使用.操作符完成函数组合)获得的内容匹配:

(g .) . f
Run Code Online (Sandbox Code Playgroud)

如果您想提高可读性,则可能只想制作自己的infix函数:

infixr 9 <<<
(<<<) : (c -> d) -> (a -> b -> c) -> (a -> b -> d)
(<<<) g f x y =
    g (f x y)
Run Code Online (Sandbox Code Playgroud)

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

(g <<< f)
Run Code Online (Sandbox Code Playgroud)