Class Haskell构造一个包含类的类型

Class Haskell构造一个包含类的类型,class,generics,haskell,type-constructor,Class,Generics,Haskell,Type Constructor,我想构造一个haskell类型: type SinglePP = (String,GLattice) 其中,眩光定义为: class GLattice l where join :: l->l->l .... 我有办法做到这一点吗 type SinglePP a = (String, a) 然后在函数中使用SinglePP时,将a限制为GLattice someFunc :: GLattice a => SinglePP a

我想构造一个haskell类型:

    type SinglePP = (String,GLattice)
其中,眩光定义为:

    class GLattice l where
        join :: l->l->l
        ....
我有办法做到这一点吗

type SinglePP a = (String, a)
然后在函数中使用
SinglePP
时,将
a
限制为
GLattice

someFunc :: GLattice a => SinglePP a -> ()
someFunc a = doMagic a
如果愿意,您可以使用更多类型系统foo并使用存在类型,这样可以避免在每个函数之后使用样板文件,但作为交换,您必须使用语言扩展和带有显式构造函数的
数据
声明。这意味着,当您想要获得
a
时,需要进行更多的模式匹配,但在类型声明中键入的内容更少


但是,大多数类型都可以推断。

使用
扩展名,如下所示:

{-# LANGUAGE ExistentialQuantification #-}

class GLattice l where
    join :: l -> l -> l

data SinglePP = forall a . (GLattice a) => SinglePP String a

这保证了存储在
SinglePP
的第二个字段中的值包含实现
GLattice
类的类型,但不指定类型。这意味着您只能对其使用
GLattice
操作。

对于那些似乎在基本Haskell语法方面有问题的人来说,这似乎有点太多了。存在主义可能会导致奇怪的边缘情况。如果我想从SinglePP获取内容,例如getVarFromPP::(GLattice a)=>SinglePP->a,如果我使用模式匹配,它将不起作用如果我想在列表中表示SinglePP,例如,我想执行以下操作:键入ProgramPoints=[SinglePP]