Haskell中如何生成空类型?构建四叉树时Group空实例实现方法
Haskell四叉树的空节点处理方案
你当前的Group类型定义有个关键问题:子节点nw/ne/sw/se被声明为Group类型,这意味着每个Group必须包含四个Group实例,会陷入无限递归,根本没法构造出实际的节点。Haskell里没有空指针,所以要用Maybe类型来解决这个问题——Maybe a可以表示两种状态:Nothing(空/无值)或者Just a(有具体值)。
修改后的类型定义
把四个子节点的类型改成Maybe Group,这样就能用Nothing表示空节点,Just Group表示存在子节点:
data Group = Group { idf :: Int, name :: String, lat :: Int, long :: Int, nw :: Maybe Group, ne :: Maybe Group, sw :: Maybe Group, se :: Maybe Group } deriving Show
构造实例示例
- 叶子节点:所有子节点都用
Nothing表示没有子节点
main :: IO() main = do let leaf = Group { idf = 0, name = "Ababa", lat = 32, long = 40, nw = Nothing, ne = Nothing, sw = Nothing, se = Nothing } print leaf
- 带子节点的节点:用
Just把子节点包起来赋值给对应字段
main :: IO() main = do let child = Group { idf = 1, name = "SubGroup", lat = 33, long = 41, nw = Nothing, ne = Nothing, sw = Nothing, se = Nothing } let parent = Group { idf = 0, name = "Parent", lat = 32, long = 40, nw = Just child, ne = Nothing, sw = Nothing, se = Nothing } print parent
核心逻辑说明
Maybe是Haskell用来处理"可能存在也可能不存在"值的标准类型,完美适配四叉树叶子节点没有子节点的场景。- 原类型定义的递归没有终止条件,而
Nothing就是递归的终止标志,让你能构造出合法的树结构。
内容的提问来源于stack exchange,提问作者sSalvi
相关产品推荐
相关产品推荐

