MonadTrans如何进行第一次法律类型检查?

时间:2018-02-04 19:51:18

标签: haskell

MonadTrans上课法中有一些我不理解的内容。

lift . return的类型为a -> t m a

return的类型为a -> m a

lift . return = return如何检查?

3 个答案:

答案 0 :(得分:2)

鉴于某些monad t上有一些monad变换器mmt m都是monad。因此,return可以实例化为a -> m aa -> t m a

在这种情况下,lift的类型为m a -> t m a。因此,如果我们为a -> m a选择return类型,则lift . return的类型为a -> t m a。这是return的另一种可能的类型,因此等价的类型检查。

以下是用类型注释的整个等价:

(lift :: m a -> t m a) . (return :: a -> m a) = (return :: a -> t m a)

答案 1 :(得分:2)

首先:应该理解return的{​​{1}}和m的{​​{1}}是两个不同的函数,属于两个不同的实例。

函数组合return的约定与通常的数学符号相同,即对于某些类型t m,它必须包含f . gg : x -> y

文档非常清楚地表明f: y -> z的类型是:

x, y, z

也就是说,只要找到lift的{​​{1}},lift :: Monad m => m a -> t m a 基本上就是Monad类型。

我们知道属于m的{​​{1}}类型为lift

因此,类型m a -> t m areturn的两个函数ma -> m a是可组合的,它们的组成是return的{​​{1}}

答案 2 :(得分:1)

首先比较liftreturn的类型:

return ::  Monad m                =>   a ->   m a
lift   :: (Monad m, MonadTrans t) => m a -> t m a

两者都做类似的事情:return将任何类型的值提升为包装第一种类型的monadic类型。 lift将已经包含在monad中的值提升到由monad转换器创建的另一个 monad中。由于原始monad m和转换后的monad t m都有自己的return函数,因此您有两种方法可以将a类型的值放入monad {{1} }}:

  1. 使用已转换的monad t m a
  2. 使用原始return :: a -> t m a,然后return :: a -> m a
  3. 交换图看起来像

    lift :: m a -> t m a

    第一个monad变换器法则规定,从 return a -------> m a \ | \ | lift return \ | \ v +------ t m a a的路径无关紧要。