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