2013-01-04 87 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]