Если мы десагар [[]]
как [] []
, то очевидно, что он плохо связан, потому что [] :: * -> *
.
Если вы на самом деле хотели получить «список списков», вам нужно составить два конструктора типа:вид * -> *
.Вы не можете сделать это без небольшого шаблона, потому что в Haskell нет лямбды на уровне типа.Вы можете сделать это, однако:
newtype Comp f g a = Comp { unComp :: f (g a) }
Теперь вы можете написать:
type ListList = Comp [] []
И написать функции, используя это:
f :: ListList Int -> ListList Int
f = Comp . map (map (+1)) . unComp
Композиция функтора, подобная этой, имеет приложенияв нескольких областях, в частности, "Типы данных a la carte" Свиерстры