例如,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
}
我想知道当我们定义一个新类型时,是否有关于类型变量顺序的规则或原则。
最佳答案
在这种情况下,a
是最后一个,因为我们想要 ParsecT s u m __
要成为一个 monad,这样,我们的解析器寻找的东西可能取决于他们之前发现的东西,等等。如果 u
最后来了,我们不能写
instance Monad m => Monad (ParsecT s u m) where ...
m
是倒数第二个,因为我们想要 ParsecT s u
成为一个“单子(monad)变压器” class MonadTrans t where
lift :: m a -> t m a
instance MonadTrans (ParsecT s u) where ...
如果我们把
m
首先,这种情况是不可能的。订购 s
似乎没有任何类似的原因和 u
.
关于haskell - haskell中多个类型变量的顺序规则是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16860473/