gpt4 book ai didi

haskell - 这个 Haskell 函数是否以另一个名称已知/实现?

转载 作者:行者123 更新时间:2023-12-02 22:03:28 27 4
gpt4 key购买 nike

我发现很多我自己组装在一起的东西看起来很有用,实际上有一个我只是不知道的标准实现,所以很好奇是否有人可以说他们已经看到过这种类型的东西的使用之前:

它需要一个一元函数,并将折叠它,直到通过替代选择谓词,然后返回谓词的结果:

until :: (Monad m, Alternative m) => (a -> m a) -> (a -> m c) -> a -> m c
f `until` p = \a -> (f >=> (p `altF` (until f p))) a
where f1 `altF` f2 = \a -> f1 a <|> f2 a

我意识到这个名字是一个前奏冲突,我可能会把它命名为其他名字,但我想我首先看看标准库中是否已经有类似的功能,我只是不知道..

此外,我想我很好奇我编写的组合替代方案是否在其他地方定义,或者是否有任何功能从一开始就被误导了。但我的问题的关键是,这是在其他地方实现的还是在其他地方实现的非常类似的东西

最佳答案

有大量便利函数不在 Prelude 或标准库中,但也许应该在。如果您发现它们有用的话,我不会太担心重新实现它们。

注意到altF相当于 liftA2 (<|>) ,你可能会这样写:

till :: (Monad m, Alternative m) => (a -> m a) -> (a -> m b) -> a -> m b

-- To do f till p is to first do f; then either p, or f till p.
f `till` p = f >=> (<|>) <$> p <*> f `till` p

并注意到 (Monad m, Alternative m)MonadPlus m 非常相似,您可以稍微简化一下类型:

till :: MonadPlus m => (a -> m a) -> (a -> m b) -> a -> m b
f `till` p = f >=> mplus <$> p <*> f `till` p

有一个类似的函数,名为 untilMControl.Monad.Loops它使用 Bool谓词,以及 LoopT Control.Monad.Trans.Loop 中存在任意循环的变压器。但不,这个特殊的功能似乎还不太出名。

关于haskell - 这个 Haskell 函数是否以另一个名称已知/实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15239302/

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