haskell中多个类型变量的顺序是什么规则?

时间:2013-05-31 15:10:21

标签: haskell ghc newtype type-variables

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

我想知道在定义新类型时是否存在关于类型变量顺序的规则或原则。

1 个答案:

答案 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,那么这个实例是不可能的。 su的排序似乎没有任何类似的原因。