gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:19:04 25 4
gpt4 key购买 nike

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

(\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) ,但我从编译器收到以下错误:
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

最佳答案

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

(\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)

关于elm - 简化 Elm 中的两参数匿名函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46322520/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com