2013-03-06 28 views
6

Kendi başıma bir araya getirdiğim çok fazla şey, aslında hiç bilmediğim standart bir uygulamaya sahip olmakla birlikte, aslında daha önce kullanılan bu tür bir şeyi gördüklerini merak ettim. :Bu Haskell işlevi bilinen/başka bir ad olarak uygulanan mı?

bir monadic işlevi alır ve bir yüklem o zaman yüklem sonucunu döndürür alternatif tarafından seçilene kadar katlayın edecek

: adını fark

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 

başlangıcı çarpışma, ben muhtemelen olacak Başka bir şey isim ama ben zaten bilmiyorum bir standart kütüphanede zaten benzer bir işlevsellik parçası olup olmadığını görmek düşündüm ..

Ayrıca yazdığım kompozisyon alternatifinin başka bir yerde tanımlanmış mı yoksa bu işlevselliklerden herhangi birinin başlaması yanlış görünüyorsa merak ediyorum. Ama benim sorumluğumun püf noktası, bu başka bir yerde uygulanan veya başka bir yerde uygulanan benzer bir şey olabilir belki de

+0

"MonadPlus" ile birlikte "Monad" ve "Alternative" kısıtlamalarını kullanmak isteyebilirsiniz. –

+0

@pelotom Alternatif'i MonadPlus açısından tanımlayabilirsiniz? Ben habersiz, sadece imzamı doğrudan GHCi'den aldım. –

+1

Farklı API'leri tanımlar ama benzer rolleri yerine getirirler ... 'Alternative':' Applicative' :: 'MonadPlus':' Monad'. –

cevap

7

Prelüd veya standart kütüphanelerde olmayan, ama belki de olması gereken şaşırtıcı derecede çok sayıda kolaylık fonksiyonu vardır. Faydalı bulursanız birkaçını yeniden düşünmekten çok fazla korkmazdım.

till :: MonadPlus m => (a -> m a) -> (a -> m b) -> a -> m b 
f `till` p = f >=> mplus <$> p <*> f `till` p 
: Eğer tip biraz kolaylaştırabilirsiniz,

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 

Ve (Monad m, Alternative m) belirterek kadar MonadPlus m aynıdır: altFliftA2 (<|>) denk olduğunu kaydeden

, daha bu gibi yazmak olabilir

yüklemi ve LoopT trafo e kullanan Control.Monad.Loops içinde untilM adlı benzer bir işlev var. Control.Monad.Trans.Loop'da rastgele döngü için xists. Ama hayır, bu özel işlev henüz meşhur görünmüyor.

İlgili konular