Поэтому я недавно узнал и начал использовать TypeApplications
, и TypeApplications
было интересно, как мы можем вообще знать, какие переменные типа мы назначаем. В документации по TypeApplications
я нашел, упоминается:
Какой порядок используется для создания экземпляров переменных типа?
Влево-вправо порядок переменных типа, появляющихся в foralls. Это самый логичный порядок, который возникает, когда инстанцирование выполняется на уровне переменной типа. Вложенные фолды работают немного по-другому, но в одном месте forall с несколькими переменными имеет место порядок слева направо. (См. Ниже вложенные фолды).
Однако я не нашел упоминания о том, как определяется порядок переменных типа в неявных динамиках. Я попытался рассмотреть различные примеры с -fprint-explicit-foralls
чтобы увидеть, существует ли простой шаблон, но я получаю разные результаты в разных версиях ghci. :/
В версии ghci 8.0.2 я получаю:
> :t (,,)
(,,) :: forall {c} {b} {a}. a -> b -> c -> (a, b, c)
в то время как в версии ghci 8.4.3 я получаю:
> :t (,,)
(,,) :: forall {a} {b} {c}. a -> b -> c -> (a, b, c)
Опять же, может быть, это просто ошибка в том, как форматирование печаталось в 8.0.2, потому что в противном случае приложения типа, похоже, выполняются справа налево с переменными forall, вопреки тому, что говорит документация:
> :t (,,) @Bool
(,,) @Bool :: forall {c} {b}. Bool -> b -> c -> (Bool, b, c)
Итак, переменные типа помещаются в неявные foralls всегда в том порядке, в котором они появляются сначала слева направо в типе body (включая ограничения)?