此Haskell函数是否以另一个名称命名/实现?

此Haskell函数是否以另一个名称命名/实现?,haskell,alternative-functor,monadplus,Haskell,Alternative Functor,Monadplus,我发现我自己拼凑起来的很多东西似乎都很有用,实际上有一个我不知道的标准实现,所以我很好奇是否有人能说他们以前见过这种东西: 它接受一元函数并将其折叠,直到alternative选择谓词,然后返回谓词的结果: until :: (Monad m, Alternative m) => (a -> m a) -> (a -> m c) -> a -> m c f `until` p = \a -> (f >=> (p `altF` (until f

我发现我自己拼凑起来的很多东西似乎都很有用,实际上有一个我不知道的标准实现,所以我很好奇是否有人能说他们以前见过这种东西:

它接受一元函数并将其折叠,直到alternative选择谓词,然后返回谓词的结果:

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
直到::(单子m,备选方案m)=>(a->MA)->(a->MC)->a->MC
f`until`p=\a->(f>=>(p`altF`(until fp)))a
其中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

有一个类似的函数称为
untilM
,其中使用
Bool
谓词,并且存在一个
LoopT
转换器,用于在中进行任意循环。但是不,这个特定的函数似乎还不出名。

您可能想使用
MonadPlus
而不是组合的
Monad
Alternative
约束。@pelotom您可以用MonadPlus定义Alternative吗?我没有意识到,我只是直接从Ghcit获取了我的签名。他们定义了不同的API,但执行类似的角色<代码>备选方案:
应用程序
MonadPlus
Monad
@pelotom感谢您澄清了这种关系,这很有意义。谢谢它能按你的要求工作吗?从名称来看,我认为
p
是一个谓词,但它不会生成布尔值,而是生成最终答案。看看实现,我必须在纸上计算出
p
实际触发并生成答案的时间-这让我有些担心,因为我确实希望组合器尽可能直观。如果我自己写的话,我希望有一个单独的谓词来测试停止,还有一个“flusher”来生成最终值。
till :: MonadPlus m => (a -> m a) -> (a -> m b) -> a -> m b
f `till` p = f >=> mplus <$> p <*> f `till` p