2013-05-15 154 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,它不工作,如果我使用模式匹配 –