Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
module Main where
import Control.Monad
--import Data.Monoid
data State s a = State (s -> (a, s))
runState :: State s a -> s -> (a, s)
runState (State f) = f
instance Monad (State s) where
return a = State $ \s -> (a, s)
ma >>= mf = State $ \s0 -> let (b, s1) = runState ma s0
in runState (mf b) s1
type FSM s = State s s
fsm :: (ev -> s -> s) -> (ev -> FSM s)
fsm transition = \e -> State $ \s -> (s, transition e s)
data PN = NONZ | PONZ | POPZ | NOPZ deriving (Eq,Show)
parse :: Int -> FSM PN
parse = fsm $ trans
where trans 1 NONZ= PONZ
trans 1 NOPZ= POPZ
trans 1 POPZ= NOPZ
trans 1 PONZ= NONZ
trans 0 POPZ= PONZ
trans 0 PONZ= POPZ
trans 0 NONZ= NOPZ
trans 0 NOPZ= NONZ
conv [] = []
conv ('1':xs) = 1:(conv xs)
conv ('0':xs) = 0:(conv xs)
conv (_:xs) = error "parse error"
main =do
x <- getLine
print $ (snd $ runState (mapM parse (conv x)) POPZ) == POPZ
print $ runState (mapM parse (conv x)) POPZ
Гы-гы.