Параметрическое имя класса

Скажем, у нас есть гетерогенный список

data Nil
data Cons a b

Я могу написать такой код для любого типа A

class AList a
instance AList Nil
instance (A x, AList xs) => AList (Cons x xs)

Теперь, есть ли способ обобщить этот код так, чтобы он был параметрическим в A?

Скажем, как это сделал синтаксис

class List (class A) a
instance List (class A) Nil
instance (A x, List (class A) xs) => List (class A) (Cons x xs)
1 ответ

Не уверен, что я понимаю мотивацию, но да, вы можете выразить это с расширением GHC ConstraintKinds:

{-# LANGUAGE EmptyDataDecls #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE MultiParamTypeclasses #-}
{-# LANGUAGE UndecidableInstances #-}
import GHC.Exts (Constraint)
class List (c :: * -> Constraint) a
data Nil
data Cons a b
instance List c Nil
instance (c x, List c xs) => List c (Cons x xs)

licensed under cc by-sa 3.0 with attribution.