Haskell语言学习笔记(26)Identity, IdentityT
来源:互联网 发布:网络调教男奴方法 编辑:程序博客网 时间:2024/06/04 00:31
Identity Monad
newtype Identity a = Identity { runIdentity :: a }instance Functor Identity where fmap = coerceinstance Applicative Identity where pure = Identity (<*>) = coerceinstance Monad Identity where m >>= k = k (runIdentity m)
newtype Identity a = Identity { runIdentity :: a }
Identity 类型是个 newtype,也就是对现有类型的封装。该类型只有一个类型参数 a。
Identity a 封装了一个值:a,用 runIdentity 字段可以取出这个值。
Identity 是一个用于占位的 Monad。instance Monad Identity where
对比 Monad 类型类的定义,可知 return 函数的类型签名为:
return :: Identity a
而 bind 函数的类型签名为:
(>>=) :: a -> (a -> Identity b) -> Identity bm >>= k = k (runIdentity m)
证明 Identity 符合Monad法则: 1. return a >>= f ≡ f areturn a >>= f ≡ Identity a >>= f ≡ f (runIdentity (Identity a)) ≡ f a 2. m >>= return ≡ mm >>= return ≡ (Identity a) >> Identity ≡ Identity (runIdentity (Identity a)) ≡ Identity a ≡ m 3. (m >>= f) >>= g ≡ m >>= (\x -> f x >>= g)(m >>= f) >>= g≡ ((Identity a) >>= f) >>= g≡ f (runIdentity (Identity a)) >> = g≡ f a >> gm >>= (\x -> f x >>= g) ≡ (Identity a) >>= (\x -> f x >>= g) ≡ (\x -> f x >>= g) (runIdentity (Identity a))≡ (\x -> f x >>= g) a≡ f a >> g
IdentityT Monad转换器
newtype IdentityT f a = IdentityT { runIdentityT :: f a }instance (Monad m) => Monad (IdentityT m) where return = IdentityT . return m >>= k = IdentityT $ runIdentityT . k =<< runIdentityT minstance MonadTrans IdentityT where lift = IdentityTinstance (MonadIO m) => MonadIO (IdentityT m) where liftIO = IdentityT . liftIO
newtype IdentityT f a = IdentityT { runIdentityT :: f a }
IdentityT 类型是个 newtype,也就是对现有类型的封装。该类型有两个类型参数:内部 Monad 类型参数 f,以及值类型参数 a。
IdentityT f 类型封装了一个封装在内部 Monad f 中的值:f a,用 runIdentity 字段可以取出这个值。
Identity 是一个用于占位的 Monad转换器。instance (Monad m) => Monad (IdentityT m) where
如果 m 是个 Monad,那么 IdentityT m 也是一个 Monad。
对比 Monad 类型类的定义,可知 return 函数的类型签名为:
return :: IdentityT m a
而 bind 函数的类型签名为:
(>>=) :: a -> (a -> IdentityT m b) -> IdentityT m bm >>= k = IdentityT $ runIdentityT . k =<< runIdentityT m
证明 IdentityT 符合Monad法则: 1. return a >>= f ≡ f areturn a >>= f≡ (IdentityT . return) a >>= f≡ IdentityT (m a) >>= f≡ IdentityT $ runIdentityT . f =<< runIdentityT (IdentityT (m a))≡ IdentityT $ runIdentityT . f =<< m a≡ IdentityT $ runIdentityT (f a)≡ f a2. m >>= return ≡ m假设 m = IdentityT (n a)m >>= return≡ IdentityT $ runIdentityT . return =<< runIdentityT m≡ IdentityT $ runIdentityT . (IdentityT . return) =<< runIdentityT (IdentityT (n a))≡ IdentityT $ runIdentityT . (IdentityT . return) =<< n a≡ IdentityT $ runIdentityT (IdentityT (n a))≡ IdentityT (n a) ≡ m 3. (m >>= f) >>= g ≡ m >>= (\x -> f x >>= g)(m >>= f) >>= g≡ (IdentityT $ runIdentityT . f =<< runIdentityT m) >>= g≡ IdentityT $ runIdentityT . g =<< runIdentityT (IdentityT $ runIdentityT . f =<< runIdentityT m)≡ IdentityT $ runIdentityT . g =<< (runIdentityT . f =<< runIdentityT m)≡ IdentityT $ (runIdentityT m >>= runIdentityT . f) >>= runIdentityT . gm >>= (\x -> f x >>= g) ≡ IdentityT $ runIdentityT . (\x -> f x >>= g) =<< runIdentityT m≡ IdentityT $ runIdentityT . (\x -> IdentityT $ runIdentityT . g =<< runIdentityT (f x)) =<< runIdentityT m≡ IdentityT $ (\x -> runIdentityT $ IdentityT $ runIdentityT . g =<< runIdentityT (f x)) =<< runIdentityT m≡ IdentityT $ (\x -> runIdentityT . g =<< runIdentityT (f x)) =<< runIdentityT m≡ IdentityT $ runIdentityT m >>= (\x -> runIdentityT (f x) >>= runIdentityT . g)根据内部 Monad 的法则:(m >>= f) >>= g ≡ m >>= (\x -> f x >>= g)IdentityT $ (runIdentityT m >>= runIdentityT . f) >>= runIdentityT . g≡ IdentityT $ runIdentityT m >>= (\x -> (runIdentityT . f) x >>= runIdentityT . g)≡ IdentityT $ runIdentityT m >>= (\x -> runIdentityT (f x) >>= runIdentityT . g)
证明 StateT 中 lift 函数的定义符合 lift 的法则。1. lift . return ≡ returnlift . return $ a≡ IdentityT (m a)≡ return a2. lift (m >>= f) ≡ lift m >>= (lift . f)假设 m = n a 并且 f a = n b于是 m >>= f = n blift (m >>= f)≡ lift (n b)≡ IdentityT (n b)lift m >>= (lift . f)≡ IdentityT (n a) >>= (\x -> lift . f $ x)≡ IdentityT $ runIdentityT . IdentityT . f =<< runIdentityT (IdentityT (n a))≡ IdentityT $ n a >>= f≡ IdentityT (f a)≡ IdentityT (n b)
- Haskell语言学习笔记(26)Identity, IdentityT
- Haskell语言学习笔记(1)
- Haskell语言学习笔记(2)
- Haskell语言学习笔记(4)Functor
- Haskell语言学习笔记(5)Applicative
- Haskell语言学习笔记(6)Monad
- Haskell语言学习笔记(8)Monoid
- Haskell语言学习笔记(14)Foldable
- Haskell语言学习笔记(16)Alternative
- Haskell语言学习笔记(17)MonadPlus
- Haskell语言学习笔记(18)Traversable
- Haskell语言学习笔记(21)Array
- Haskell语言学习笔记(22)MaybeT
- Haskell语言学习笔记(29)CPS
- Haskell语言学习笔记(31)ListT
- Haskell语言学习笔记(35)Contravariant
- Haskell语言学习笔记(39)Category
- Haskell语言学习笔记(42)Bifunctor
- [BZOJ1486][HNOI2009]最小圈(二分答案+负环)
- Haskell语言学习笔记(24)MonadWriter, Writer, WriterT
- QDateTime 指定语言,显示时间日期等信息
- Haskell语言学习笔记(25)MonadState, State, StateT
- SpringMVC之分析HandlerMethodArgumentResolver请求对应处理器方法参数的解析过程(一)
- Haskell语言学习笔记(26)Identity, IdentityT
- 输出制定小数位
- Haskell语言学习笔记(27)Endo, Dual, Foldable
- 【LeetCode】540. Single Element in a Sorted Array
- 线段树入门&lazy思想
- 采用eclipse作为IDLE,python或anaconda作为编译器 的配置方法
- [LeetCode] 递归求解二叉树路径之和是否等于给定值(2)
- UVA-11600-Masud Rana
- mysql命令gruop by报错this is incompatible with sql_mode=only_full_group_by