Haskell platform Haskell型表达式

Haskell platform Haskell型表达式,haskell-platform,template-haskell,haskell,Haskell Platform,Template Haskell,Haskell,关于Haskell类型表达式,我有两个问题: 问题1- 我想声明一个类型节点 data NODE = Node String ATTR 类型ATTR包含3个子类型,如下所示: data GRAPH = Graph String STMTS data STMTS = STMT | STMTS 源布尔 目标布尔 幽灵智力 但上述声明不满足ATTR可以包含任何子类型组合的要求,例如: ATTR可以同时包含源Bool和目标Bool ATTR可以同时包含源Bool、目标Bool和Ghost Int

关于Haskell类型表达式,我有两个问题:

问题1-

我想声明一个类型节点

data NODE = Node String ATTR
类型ATTR包含3个子类型,如下所示:

data GRAPH = Graph String STMTS
data STMTS = STMT | STMTS
源布尔

目标布尔

幽灵智力

但上述声明不满足ATTR可以包含任何子类型组合的要求,例如:

  • ATTR可以同时包含源Bool和目标Bool
  • ATTR可以同时包含源Bool、目标Bool和Ghost Int
  • ATTR甚至可以为空(不包含任何内容)
问题2-

我想声明一个类型图,其中一个图可以包含1个或多个语句(STMT),或者如果图为空,则不包含任何语句。因此,我声明如下:

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

但是,正如您所看到的,递归数据类型STMTS将无限重复

data Attr = Attr (Maybe Bool) -- Source 
                 (Maybe Bool) -- Target 
                 (Maybe Bool) -- Ghost
对于问题2,我将使用以下内容

data Graph = Graph [STMT]

这听起来像是家庭作业,所以这里有一些提示。Q1:考虑使用“可能”。Q2:你需要考虑一个列表的另一个定义:数据非空列表A=单A多A(非空列表A)。不要担心无限的数据结构;哈斯克尔早餐吃它们。