2013-05-15 108 views
2

我想构建一个Haskell类型:哈斯克尔构造类型包含

type SinglePP = (String,GLattice) 

凡GLattice被定义为:

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

有没有办法为我做到这一点?

回答

5
type SinglePP a = (String, a) 

,然后当你在一个函数中使用SinglePP,限制a是一个GLattice

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

如果你喜欢,你可以使用更多类型的系统foo和与存在的类型,放手您在每个功能之后都避免使用样板,但是作为交换,您必须使用显式构造函数使用语言扩展和一个data声明。这意味着当你想要获得a时更多的模式匹配,但在类型声明中输入较少。

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

+0

如果我想在列表中表示SinglePP,例如我想要做类似这样的事情:type ProgramPoints = [SinglePP] –

+0

我得到了它的工作,谢谢 –

3

使用ExistentialQuantification延伸,就像这样:

{-# LANGUAGE ExistentialQuantification #-} 

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

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

这可以保证存储在SinglePP的第二个字段中的值认为,实现GLattice类的类型,但没有指定哪些类型。这意味着您只能使用其上的GLattice操作。

+0

对于那些似乎对基本Haskell语法有困难的人来说,这似乎有点太过分了。存在会导致奇怪的边缘情况。 – jozefg

+0

当我想要从SinglePP获取内容时,情况如何?像getVarFromPP::(GLattice a)=> SinglePP - > a,它不工作,如果我使用模式匹配 –