簡體   English   中英

這個 Haskell 函數是否已知/實現為另一個名稱?

[英]Is this Haskell function known/implemented as another name?

我發現很多我自己拼湊起來的東西看起來很有用,實際上有一個我不知道的標准實現,所以很好奇是否有人能說他們以前見過這種類型的東西:

它接受一個 monadic 函數並將其折疊,直到alternate 選擇一個謂詞,然后它返回謂詞的結果:

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非常MonadPlus m ,您可以稍微簡化一下類型:

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

Control.Monad.Loops 中有一個名為untilM的類似函數,它使用Bool謂詞,並且存在用於Control.Monad.Trans.Loop 中的任意循環的LoopT轉換器。 但是不,這個特殊的功能似乎還沒有出名。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM