【发布时间】:2018-09-10 05:52:10
【问题描述】:
考虑 State 类型 - 或者至少是简化版本:
newtype State s a = State { runState :: s -> (a, s) }
现在,假设我们要导出 StateT monad 转换器。 transformers 定义如下:
newtype StateT s m a = StateT { runStateT :: s -> m (a, s) }
这里,m 被放置在函数箭头的右侧,但在元组之外。但是,如果我们不知道正确答案,我们可能会将m 放在其他地方:
newtype StateT s m a = StateT { runStateT :: m (s -> ( a, s)) }
newtype StateT s m a = StateT { runStateT :: s -> (m a, s) }
显然transformers 中的版本是正确的,但为什么呢?更一般地说,在定义 monad 转换器时,如何知道将“内部”monad 的类型变量放在哪里?再概括一下,comonad transformers 有没有类似的规则?
【问题讨论】:
标签: haskell monads monad-transformers comonad