В Haskell, как изменить порядок множественных типов
Скажи, что у меня есть тип l :: * -> * -> *
, поэтому мне нужно применить 2 типа, например a
, а также b
получить простой тип l ab
.
Как я могу сопоставить тип l :: * -> * -> *
в новый тип m(l) :: * -> * -> *
где m(l) b a
означает то же, что и l ab
для каждого a,b
? Вотa,b
не являются константами. Является ли это возможным? Это неправильно думать об этом?
1 ответ
Решение
type M l a b = l b a
newtype M l a b = M (l b a)
Или не взяв l
как параметр
data L a b = ...
newtype M a b = M (L b a)
type M a b = L b a
Редактировать:
type M l a b = l b a
data L a b = L (a Int) (b Int)
type Z = M L Maybe []
Более того, вы также можете давать явные добрые подписи
type M (l :: k1 -> k2 -> *) (a :: k2) (b :: k1) = l b a