Haskell学习笔记--The state monad 状态变换器
快快快在回宿舍前搞完
失败了
状态变换器
type ST a = State -> ( a , State )
返回变换后的状态和一个参数a
type定义的类型不能被弄成monad,所以改成用newtype
newtype ST a = S (State -> (a,State))
app :: ST a -> State -> (a,State) app (S f) x = f x instance Functor ST where --fmap :: (a->b) -> f a -> f b fmap f st = S(\s -> let (x,s') = app st s in (f x,s')) --fmap f st = S(\inp -> (f x,s') where (x,s') = app st inp)
还可以变成applicative
instance Applicative ST where pure :: a -> ST a pure x = S (\s -> (x,s)) (<*>) :: ST (a->b) -> ST a -> ST b stf <*> stx = S(\s -> let (f,s') = app stf s (x,s'') = app stx s' in (f x ,s'')
还可以弄成Monad
instance Monad ST where --(>>=) :: ST a -> (a -> ST b) -> ST b stx >>= f = S (\s -> let (x,s') = app stx s in app (f x) s' )