Каково правило порядка переменных множественного типа в 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 ответ:
В этом случае
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.