SORU
19 NİSAN 2012, PERŞEMBE


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.)

Kullanım: genellikle kolay bir şey karmaşık geliyor o kodu yazmak için, ama toplam dönüştürmek için de PİTAçıktıfaaliyete Ara Birleşik Devletleri. Kullanıcı için mümkün olmak istiyorumdeğiştirinbir orta yol icra yoluyla işler karmaşık gerçekten çok hızlı.

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
19 NİSAN 2012, PERŞEMBE


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dopelives

    Dopelives

    30 Temmuz 2009
  • EEVblog

    EEVblog

    4 NİSAN 2009
  • WePlayWeWatch

    WePlayWeWatc

    3 Temmuz 2013