[Book Note] Haskell: Monad
来源:互联网 发布:.net和vb是什么意思 编辑:程序博客网 时间:2024/06/05 20:29
Definition
class Monad m where return :: a -> m a (>>=) :: m a -> (a -> m b) -> m b (>>) :: m a -> m b -> m b x >> y = x >>= \_ -> y fail :: String -> m a fail msg = error msgclass Monad m => MonadPlus m where mzero :: m a mplus :: m a -> m a -> m a
Restriction
return x >>= f = f xm >>= return = m(m >>= f) >>= g = m >>= (\x -> f x >>= g)
Instances
.
(.) :: (b -> c) -> (a -> b) -> (a -> c)f . g = (\x -> f (g x))(<=<) :: (Monad m) => (b -> m c) -> (a -> m b) -> (a -> m c)f <=< g = (\x -> g x >>= f)
Maybe
instance Monad Maybe where return x = Just x Nothing >>= f = Nothing Just x >>= f = f x fail _ = Nothing
List
instance Monad [] where return x = [x] xs >>= f = concat (map f xs) fail _ = []instance MonadPlus [] where mzero = [] mplus = (++)guard :: (MonadPlus m) => Bool -> m ()guard True :: return ()guard False = mzero
Writer
newtype Writer w a = Writer { runWriter :: (a, w) }instance (Monoid w) => Monad (Writer w) where return x = Writer (x, mempty) (Writer (x, v)) >>= f = let (Writer (y, v')) = f x in Writer (y, v `mappend` v')
Reader/Function
instance Monad ((->) r) where return x = \_ -> x h >>= f = \w -> f (h w) w
State
State: s -> (a, s)
Stack
type Stack = [Int]pop :: Stack -> (Int, Stack)pop (x:xs) = (x, xs)push :: Int -> Stack -> ((), Stack)push a xs = ((), a:xs)
State
newtype State s a = State { runState :: s -> (a, s) }instancce Monad (State s) where return x = State $ \s -> (x, s) (State h) >>= f = State $ \s -> let (a, newState) = h s (State g) = f a in g newState
pop :: State Stack Intpop = state $ \(x:xs) -> (x, xs)push :: Int -> State Stack ()push a = state $ \xs -> ((), a:xs)
Get/Set
get = state $ \s -> (s, s)put newState = state $ \s -> ((), newState)
Error
instance (Error e) => Monad (Either e) where return x = Right x Right x >>= f = f x Left err >>= f = Left err fail msg = Left (strMsg msg)
Monadic
liftM
liftM :: (Monad m) => (a -> b) -> m a -> m bliftM f m = m >>= (\x -> return (f x))liftM f m = do x <- m return (f x)
liftM2 :: (Monad f) => (a -> b -> c) -> f a -> f b -> f c
join
join :: (Monad m) => m (m a) -> m ajoin mm = do m <- mm m
filterM
filterM :: (Monad m) => (a -> m Bool) -> [a] -> m [a]
foldM
foldM :: (Monad m) => (a -> b -> m a) -> a -> [b] -> m a
0 0
- [Book Note] Haskell: Monad
- [Book Note] Haskell: Monoid
- [Book Note] Haskell: Functor & Applicative
- haskell monad
- haskell Monad: Status Monad
- haskell Monad 2 Write monad
- haskell Monad 3 Reader Monad
- haskell之Functor、Applicative、Monad
- Haskell语言学习笔记(6)Monad
- Ray's NOTE BOOK
- [Book Note] PFDS: Lists
- Haskell的monad和范畴论的探讨
- Haskell语言学习笔记(9)State Monad
- Haskell语言学习笔记(10)Writer Monad
- 「学习总结-Haskell-6」Haskell 重要编程模式——Functor,Applicative,Monad
- 什么是读书笔记(Book Mark , Book Note)?
- Monad
- Monad
- Could not resolve type alias 'DepartmentResultMap'.
- UICollectionView使用方法
- G-CNN: an Iterative Grid Based Object Detector
- JAVA jdk 线程池学习笔记
- SHELL跳出循环、shift左移、函数的使用和数据库自动备份脚本
- [Book Note] Haskell: Monad
- JAVA:借用OpenOffice将上传的Word文档转换成Html格式
- 避免使用非静态内部类,这会导致Context泄露
- GeekBand第二周 ListView(上)
- android listview 连续调用getview问题分析及解决
- iOS开发------常用正则表达式语法以及常用正则
- PHP入门教程之数组函数操作大全
- iOS中是否支持垃圾回收机制
- 2.NSBundle