Re: Монада State - поломка головы
От: Andir Россия
Дата: 07.08.09 10:46
Оценка: 2 (1) +1
Здравствуйте, GSergey, Вы писали:

GS>я понимаю, что просто так использовать isGood в if нельзя потому что, но все-таки может как-то можно такие строчки сокращать?


Может функцию написать?

Что-нибудь наподобие:
ifM :: (Monad m) => m Bool -> m a -> m a -> m a
ifM condition thenOp elseOp = do
    result <- condition
    if result then thenOp else elseOp


В hackage есть модуль Control.Monad.IfElse там есть подобная функция whenM.

С Уважением, Andir!
using( RSDN@Home 1.2.0 alpha 4 rev. 1233 ) { /* Работаем */ }
Монада State - поломка головы
От: GSergey  
Дата: 07.08.09 09:38
Оценка:
Вот простой пример абстрактный пример, передается какая-то машина и что-то с ней делается
data Verchile = Verchile
              { speed :: Double,
                capacity :: Int } deriving (Show)

type VState a = State Verchile a

addPeople :: Int -> VState ()
addPeople value = do
  ver <- get
  put ver { capacity = (capacity ver) - value }

speedUp :: Double -> VState ()
speedUp value = get >>= \car -> put car { speed = (speed car) + value }

isGood :: VState Bool
isGood = get >>= \car -> return $ (capacity car) >= 0 && (speed car) >= 0

process :: VState ()
process = do
  speedUp 10
  addPeople 2
  speedUp 20
  good <- isGood
  if good then speedUp 100 else speedUp 10
  addPeople 4  

compute car = execState process car


я понимаю, что просто так использовать isGood в if нельзя потому что, но все-таки может как-то можно такие строчки сокращать?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.