Pause monad
Monadlar çok şaşırtıcı, çılgın şeyler yapabilirsiniz. Değerler süperpozisyon barındıran değişkenleri oluşturabilirsiniz. Sen bunu hesaplamak için önce gelecekten veri erişimi için izin verebilir. Sen yıkıcı güncellemeleri yazmak için izin olabilir, ama gerçekten değil. Ve sonra devam monad sağlarinsanların kafasında kır!Ususally kendi. ;-)
Burada bir meydan okuma ama: olabilir . bir monad Yapabilirsiniz ^em>durakladı?
data Pause s x instance Monad (Pause s) mutate :: (s -> s) -> Pause s () yield :: Pause s () step :: s -> Pause s () -> (s, Maybe (Pause s ()))
Pause
monad monad devlet bir tür (dolayısıyla açık semantiği ile mutate
). Normalde böyle bir monad "son durumu geri." hesaplama ve elinde çalışan işlev, kaç çeşit var Ama Pause
şudur: yield
büyülü işlevini çağırır kadar hesaplama çalışır step
fonksiyon sağlar. Burada hesaplama arayana hesaplama daha sonra devam etmek için yeterli bilgi dönen duraklatıldı.
İçin fazladan awesomness: arayan step
aramalar arasında durumunu değiştirmek için İzin verir. (Tür imzaların üstünde bu, örneğin izin vermek lazım.)
Uygulama fikirleri:
Belli kikonuları, kilitler ve
IO
ile yapılabilir. Ama daha iyisini yapabilir miyiz? ;-)Bir şeyin devamı, bir monad deli?
yield
sadece mevcut durumunu kaydeder ve sonra "15 **" log. devletler üzerinden yineleme göre davranırız nerede yazar monad belki bir tür, Gerçekten olmadığımıza göre (belli ki bu engeller adımlar arasındaki durumu değiştirerek, "duraklatma" şimdi bir şey.)
CEVAP
Not: mevcut durumu kendini doğrudan erişim sağladığınız s
Bu monad.
Pause s
mutate
yield
işlemleri üzerinden ücretsiz bir monad. Doğrudan olsun hayata:
data Pause s a
= Return a
| Mutate (s -> s) (Pause s a)
| Yield (Pause s a)
instance Monad (Pause s) where
return = Return
Return a >>= k = k a
Mutate f p >>= k = Mutate f (p >>= k)
Yield p >>= k = Yield (p >>= k)
istenen API: vermek akıllı kurucular bir çift ile
mutate :: (s -> s) -> Pause s ()
mutate f = Mutate f (return ())
yield :: Pause s ()
yield = Yield (return ())
ve adım sürücü işlevi
step :: s -> Pause s () -> (s, Maybe (Pause s ()))
step s (Mutate f k) = step (f s) k
step s (Return ()) = (s, Nothing)
step s (Yield k) = (s, Just k)
Ayrıca doğrudan kullanarak bu tanımlayabilirsiniz
data Free f a = Pure a | Free (f (Free f a))
(benim '' paket) ücretsiz
data Op s a = Mutate (s -> s) a | Yield a
o zaman biz zaten Duraklatmak için bir monad
type Pause s = Free (Op s)
sadece akıllı kurucular ve step tanımlamak gerekir.
Daha hızlı yapmak.
Şimdi, bu uygulamalar hakkında neden kolaydır ama hızlı operasyonel modeli yok. Özellikle, sol ilişkili kullanır (^< . =) yavaş verim sınıfları ve kod.
Mevcut ücretsiz monad Codensity monad uygulamak, ya da sadece tarif hem 'Church free' monad doğrudan kullanabileceğiniz kurtulmak için derinlemesine blogumda.
http://comonad.com/reader/2011/free-monads-for-less/
http://comonad.com/reader/2011/free-monads-for-less-2/
http://comonad.com/reader/2011/free-monads-for-less-3/
Serbest monad Kilisesi kodlanmış sürümü uygulanması sonucu veri türü için bir sebep için kolay bir model olsun, ve hala hızlı bir değerlendirme modeli.
sistemi("pause"); - Neden ya...
Nasıl ve neden Haskell monad çalışma D...
Hiç vahşi bir Monad Transformer karşıl...
Monad fonksiyonları için Transformers ...
Bir monad'sorun ne endofunctors k...