2013-03-06 60 views
6

我發現很多東西我對我自己的一起卷染,似乎在所有有用實際上有一個標準的實施,我只是不知道,所以很好奇,如果任何人都可以說,他們已經看到了這種類型的事情之前使用:Haskell函數是否已知/實現爲另一個名稱?

它需要一個一元函數,並把它摺疊,直到斷言被替代選擇則返回謂詞的結果:

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 

我認識的名字是一個前奏碰撞,我可能會把它命名爲別的東西,但是我認爲我會先看看在標準庫中是否有類似的功能,我只是不知道。

此外,我想我很好奇,如果我寫的成分替代在其他地方定義,或者如果任何此位的功能似乎誤導開始說起。但我的問題的癥結是,這是在其他地方實施的或者非常類似的東西在其他地方實施或許

+0

您可能需要使用'MonadPlus'而不是合併'Monad'和'Alternative'約束。 – 2013-03-06 05:10:55

+0

@pelotom你可以用MonadPlus來定義Alternative嗎?我不知道,我只是把我的簽名直接從GHCI – 2013-03-06 05:19:54

+1

他們定義不同的API,但執行類似的角色...'Alternative':'Applicative' ::'MonadPlus':'Monad'。 – 2013-03-06 05:47:17

回答

7

有一個令人驚訝的大量的便利功能不在前奏或標準庫,但也許應該。如果您發現它們有用,我不會過多地重新實施。

注意到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 

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

相關問題