Здравствуйте, 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 ) { /* Работаем */ }
Вот простой пример абстрактный пример, передается какая-то машина и что-то с ней делается
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 нельзя потому что, но все-таки может как-то можно такие строчки сокращать?