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)
我们可以按照一些步骤进行简化:
(\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)