Я думаю, что это не только условно, но и связано с параметрами по сравнению с индексами на некоторых языках с зависимой печатью. Например, Agda и Coq требуют, чтобы параметры приходили перед индексами в определениях типов данных. Мы бы написать
data Vec (A : Set) : Nat -> Set where ...
в Agda, потому что мы хотим, чтобы Set
аргумент, который будет рассматриваться в качестве параметра. Если бы поменять порядок аргументов и писать
data Vec : Nat -> Set -> Set where ...
вместо этого, Set
аргумент будет рассматриваться в качестве индекса. Разумеется, мы все равно будем использовать его в качестве параметра в сигнатурах конструктора, но средство проверки типа Agda пропустит информацию о том, что это параметр.
В Haskell порядок параметров не имеет значения, поэтому использование заказа, который хорошо работает с каррированием, является хорошей идеей.
В Agda, я иногда использую следующие работы вокруг, чтобы получить выделки права:
data Vec' (A : Set) : Nat -> Set
Vec : Nat -> Set -> Set
Vec n A = Vec' A n
{-# DISPLAY Vec' A n = Vec n A #-}
data Vec' A where
nil : Vec zero A
cons : {n : Nat} -> A -> Vec n A -> Vec (succ n) A
Но я не уверен, что дополнительная нагрузка на читателях коды стоит.
Для чего вы стоите, вы не первый, кто наткнулся на это. [Это] (https://blog.jle.im/entry/fixed-length-vector-types-in-haskell-2015.html) сообщение (которое делает экземпляр для большинства упомянутых вами классов) также имеет 'Vec: : Nat -> Тип -> Тип'. – Alec
'Тип -> Nat -> Тип' - это обычно более общий порядок, в математике (' ℝ³' и т. Д.) И курсирующих забытых языках ('std :: array'). Currying - вот что делает заказ Haskell полезным. –
leftaroundabout
[This] (http://stackoverflow.com/a/40252235/3072788) вид трюка с 'Bump' невозможен, если' Nat' не встречается в последней позиции. – Alec