Haskell构造一个包含类的类

时间:2013-05-15 03:21:34

标签: class generics haskell type-constructor

我想构建一个haskell类型:

    type SinglePP = (String,GLattice)

GLattice定义为:

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

我有办法做到这一点吗?

2 个答案:

答案 0 :(得分:5)

type SinglePP a = (String, a)

然后在函数中使用SinglePP时,将a限制为GLattice

someFunc :: GLattice a => SinglePP a -> ()
someFunc a = doMagic a

如果您愿意,可以使用更多类型system-foo并使用存在类型,这样可以避免每个函数后的样板,但作为交换,您必须使用语言扩展和data声明显式构造函数。这意味着当您想要获得a但在类型声明中输入更少时,可以进行更多的模式匹配。

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

答案 1 :(得分:3)

使用ExistentialQuantification扩展程序,如下所示:

{-# LANGUAGE ExistentialQuantification #-}

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

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

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