我有两个关于Haskell类型表达式的问题:
问题1 -
我想声明一个类型NODE
data NODE = Node String ATTR
和类型ATTR包含3个子类型如下:
Source Bool
Target Bool
Ghost Int
data ATTR = Source Bool | Target Bool | Ghost Bool
但是上述声明不满足ATTR可以包含任何子类型组合的要求,例如:
问题2 -
我想声明一个类型GRAPH,其中图形可以包含1个或多个语句(STMTS),或者如果图形为空则不包含语句。所以我声明如下:
data GRAPH = Graph String STMTS
data STMTS = STMT | STMTS
但是,再次,如您所见,递归数据类型STMTS将无限重复。
答案 0 :(得分:1)
对于问题1,我会说使用像
这样的东西data Attr = Attr (Maybe Bool) -- Source
(Maybe Bool) -- Target
(Maybe Bool) -- Ghost
对于问题2,我会使用类似
的内容data Graph = Graph [STMT]