2

我想构造一个haskell类型:

    type SinglePP = (String,GLattice)

其中 GLattice 定义为:

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

我有办法做到这一点吗?

4

2 回答 2

5
type SinglePP a = (String, a)

然后当你SinglePP在函数中使用时,限制aGLattice

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

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

然而,大多数类型都可以推断出来。

于 2013-05-15T04:49:12.313 回答
3

使用ExistentialQuantification扩展,如下所示:

{-# LANGUAGE ExistentialQuantification #-}

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

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

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

于 2013-05-15T04:50:35.620 回答