2011-09-06 11 views
11

Bir monaddan "şeyleri" almanın bir yolu var mı?Haskell'de bir monaddan nasıl bir değer çıkarırsınız?

Ben bir oyun geliştiriyorum ve şimdi veritabanları hakkında anlamaya çalışıyorum. happstack'u gerçekten çok iyi buldum, ama ben bir şey alamıyorum.

Örneğin, bu işlevi var

getAllThings :: MonadIO m => m [Thing] 
getAllThings = do 
      elems <- query GetThings 
      return elems 

Yani m [Things] almak (eğer happstack aşina umut), ama benim modelinde bu kullanamazsınız! Örneğin

doSomeThingWithThings :: [Thing] -> Something 

Bunu araştırdım ve hiçbir şey bulamadım.

+2

Sen hayali yaklaşık [yorumlarımı zevk verebilir monad gelen <- kullanarak değeri ayıklamak kullanmak ve işlevine geçebilir getAllThings aradığınız her zamankinden Yani ya elde elems sonra ve return önce veya nerede size başka işlevi çağırabilir 'magicMonadUnwrap'] (http://stackoverflow.com/questions/7154518/unwrapping-a-monad/7156230#7156230) (benzer bir StackOverflow sorusuna cevap verin) –

cevap

16

Sen IO (unsafePerformIO fonksiyonu hariç) bu şekilde Monad çıkmak gerekiyordu değil, ama yine de bunun içinde senin işlevini kullanabilirsiniz:

process :: MonadIO m => m() 
process = do 
      elems <- getAllThings 
      let smth = doSomeThingWithThings elems 
      -- ... 
+4

Bunu şöyle düşünebilirsiniz: tüm programınız IO monad'tır ve senin modelin içinde yürütülen saf fonksiyonların bir demet. – bravit

+0

Evet! Sorularımı cevaplarınızla tekrar düşündükten sonra anlıyorum, bu şekilde olması gerekiyor !, oyunum (dediğin gibi) saf fonksiyonlar, ama kullanıcı arayüzü gerçek çirkin bir dünya, bu yüzden kalıcılık parçası da olmalı! – Illiax

2

elems <- query GetThings sonra elems içeride [Thing] yüzden <- olduğunu yapmak alma hakkında olduğunu Monad'ın dışındaki şeyler (bağlama operasyonu denir). Son ifade return ifadesi bir şeyi bir monoya yerleştiriyor. Eğer

İlgili konular