Каково правило порядка переменных множественного типа в haskell?


Например, 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
             }
Мне интересно, существует ли правило или принцип порядка переменных типа, когда мы определяем newtype.
1 10

1 ответ:

В этом случае a является последним, потому что мы хотим ParsecT s u m __ быть монадой, таким образом, то, что ищут наши Парсеры, может зависеть от того, что они нашли раньше, и так далее. Если бы 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.