参数类型类名
问题描述:
说我们有一个异构的列表参数类型类名
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)
答
我不知道我理解的动机,但是,是的,你可以用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)
真棒!我只是玩类型级计算,这是我想要的。 – 2014-12-03 13:01:33