我正在尝试在ghci中定义一个多路树数据类型。每个节点都有一个键和一个值。以下是相关代码:
data Tree k v = Empty |
N {key::k,
value::v} [Tree k v]
deriving (Show, Eq)
以下是Ghci的相应输出:
Not in scope: `key'
Not in scope: `value'
我通过使用以下代码分别定义树节点记录来检查记录的语法:
data Node k v = Node { key::k
, value::v}
deriving (Show, Eq)
这可以按预期工作。是什么导致我的树数据类型定义抛出此错误?在用于定义备用值构造函数时,我是否遗漏了与记录语法相关的内容?
答案 0 :(得分:4)
将记录语法与ADT一起使用时,所有构造函数必须具有相同的字段。此外,您尝试将记录和普通构造函数语法与Node { key :: k, value :: v } [Tree k v]
组合在一起。相反,你必须诉诸于构造函数的正常位置参数,如
data Tree k v
= Emtpy
| N k v [Tree k v]
deriving (Eq, Show)
您可以将ADT的记录语法用作
data Tree k v
= RedNode { key :: k, val :: v, children :: [Tree k v] }
| BlackNode { key :: k, val :: v, children :: [Tree k v] }
deriving (Eq, Show)
但我建议将单独的数据类型设为
data Color = Red | Black deriving (Eq, Show)
data Tree k v = Node
{ color :: Color
, key :: k
, val :: v
, children :: [Tree k v]
} deriving (Eq, Show)
因为如果你扩展Color
,你的打字就会减少,我认为它更具惯用性。
答案 1 :(得分:1)
如果您想使用单独的节点类型,您可能正在寻找类似
的内容data Tree k v = Empty | N (Node k v) [Tree k v]
deriving (Show, Eq)
data Node k v = Node { key::k
, value::v}
deriving (Show, Eq)