12

例如,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
             }

我想知道当我们定义一个新类型时,是否有关于类型变量顺序的规则或原则。

4

1 回答 1

17

在这种情况下,a是最后一个,因为我们想ParsecT s u m __成为一个 monad,这样,我们的解析器查找的内容可能取决于他们之前找到的内容,等等。如果u最后来,我们不能写

 instance Monad m => Monad (ParsecT s u m) where ...

m倒数第二,因为我们想ParsecT s u成为一个“单子变换器”

 class MonadTrans t where 
     lift :: m a -> t m a 

 instance MonadTrans (ParsecT s u) where ...

如果我们把第m一个,这个实例是不可能的。s和的排序似乎没有任何类似的原因u

于 2013-05-31T15:22:05.743 回答