我想构建一个Haskell类型:哈斯克尔构造类型包含
type SinglePP = (String,GLattice)
凡GLattice被定义为:
class GLattice l where
join :: l->l->l
....
有没有办法为我做到这一点?
我想构建一个Haskell类型:哈斯克尔构造类型包含
type SinglePP = (String,GLattice)
凡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和与存在的类型,放手您在每个功能之后都避免使用样板,但是作为交换,您必须使用显式构造函数使用语言扩展和一个data
声明。这意味着当你想要获得a
时更多的模式匹配,但在类型声明中输入较少。
但是大多数类型都可以推断。
使用ExistentialQuantification
延伸,就像这样:
{-# LANGUAGE ExistentialQuantification #-}
class GLattice l where
join :: l -> l -> l
data SinglePP = forall a . (GLattice a) => SinglePP String a
这可以保证存储在SinglePP
的第二个字段中的值认为,实现GLattice
类的类型,但没有指定哪些类型。这意味着您只能使用其上的GLattice
操作。
对于那些似乎对基本Haskell语法有困难的人来说,这似乎有点太过分了。存在会导致奇怪的边缘情况。 – jozefg
当我想要从SinglePP获取内容时,情况如何?像getVarFromPP::(GLattice a)=> SinglePP - > a,它不工作,如果我使用模式匹配 –
如果我想在列表中表示SinglePP,例如我想要做类似这样的事情:type ProgramPoints = [SinglePP] –
我得到了它的工作,谢谢 –