2013-01-04 133 views
0

我對Haskell的類型表達了兩個問題:哈斯克爾類型的表達式

問題1 -

我想聲明一個類型節點

data NODE = Node String ATTR 

和類型屬性包含3個子型如下:

來源布爾

目標布爾

鬼詮釋

data ATTR = Source Bool | Target Bool | Ghost Bool 

但上面的聲明不符合該ATTR可以包含子類型,如的任何組合中的要求:

  • ATTR可以同時包含Source Bool和Target Bool
  • ATTR可以包含Source Bool,Target Bool和Gho ST詮釋一次
  • ATTR甚至可以是空的(僅僅包含)

問題2 -

我想聲明一個類型圖,其中的圖可以含有1個或多個語句(STMTS),或者如果圖表爲空,則不包含語句。再次

data GRAPH = Graph String STMTS 
data STMTS = STMT | STMTS 

但是,正如你看到的遞歸數據類型支桿會重複infinitively:所以我聲明如下。

+0

這聽起來像功課,所以這裏有一些提示。 Q1:考慮使用「也許」。 Q2:您需要考慮列表的另一個定義:data NonEmptyList a = Single a |許多a(NonEmptyList a)。不要擔心無限的數據結構; Haskell吃早餐。 –

回答

1

問題1我會說使用類似

data Attr = Attr (Maybe Bool) -- Source 
       (Maybe Bool) -- Target 
       (Maybe Bool) -- Ghost 

對於第二個問題,我會使用類似

data Graph = Graph [STMT]