例如,ParsecT在其定义中有多个类型变量。
newtype ParsecT s u m a
= ParsecT {unParser :: forall b .
State s u
-> (a -> State s u -> ParseError -> m b)
-> (ParseError -> m b)
-> (a -> State s u -> ParseError -> m b)
-> (ParseError -> m b)
-> m b
}
我们可以这样做吗?
newtype ParsecT m a s u -- Only the order of s u m a is changed to m a s u.
= ParsecT {unParser :: forall b .
State s u
-> (a -> State s u -> ParseError -> m b)
-> (ParseError -> m b)
-> (a -> State s u -> ParseError -> m b)
-> (ParseError -> m b)
-> m b
}
我想知道在定义新类型时是否存在关于类型变量顺序的规则或原则。
答案 0 :(得分:16)
在这种情况下,a
是最后一个因为我们希望ParsecT s u m __
成为monad,这样,我们的解析器所寻找的内容可能取决于他们之前找到的内容,依此类推。如果最后u
出现,我们就无法写
instance Monad m => Monad (ParsecT s u m) where ...
m
是倒数第二个,因为我们希望ParsecT s u
成为'monad transformer'
class MonadTrans t where
lift :: m a -> t m a
instance MonadTrans (ParsecT s u) where ...
如果我们先放m
,那么这个实例是不可能的。 s
和u
的排序似乎没有任何类似的原因。