2014-12-03 42 views
4

说我们有一个异构的列表参数类型类名

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) 

回答

3

我不知道我理解的动机,但是,是的,你可以用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) 
+0

真棒!我只是玩类型级计算,这是我想要的。 – 2014-12-03 13:01:33