我想构建一个haskell类型:
type SinglePP = (String,GLattice)
GLattice定义为:
class GLattice l where
join :: l->l->l
....
我有办法做到这一点吗?
答案 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
操作。