Haskell记录语法错误:不在范围内

时间:2014-04-11 19:54:44

标签: haskell types record

我正在尝试在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)

这可以按预期工作。是什么导致我的数据类型定义抛出此错误?在用于定义备用值构造函数时,我是否遗漏了与记录语法相关的内容?

2 个答案:

答案 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)