【问题标题】:Accessing named fields in a Haskell function访问 Haskell 函数中的命名字段
【发布时间】:2010-02-09 12:12:46
【问题描述】:

我在 Haskell 中定义了一个 Tree 数据类型和一个关联的“size”方法,用于计算树中元素的数量。这以前有效,但是我已更新 Tree 数据类型以使用命名字段,如下定义:

data Tree a = Empty
 | Leaf {value::a}
 | Node {left :: (Tree a), value :: a, right :: (Tree a)}
 deriving (Eq, Ord, Show)

我发现(通过在 GHCi 中玩耍)我可以使用函数(左 n)访问命名字段。但是,当我尝试使用此功能时出现错误:

size :: Tree a -> Int
size Empty    = 0
size (Leaf l)   = 1
size (Node n)   = size (left n) + 1 + size (right n)

GHCi 简单地说“不在范围内:左”和右的等价物。 Tree 定义在一个名为 Tree 的模块中,大小定义在一个名为 Main 的模块中,但是对于未命名的字段,在从 Tree 数据类型访问变量时,我从来没有遇到过范围问题。

【问题讨论】:

    标签: haskell ghci


    【解决方案1】:

    您的size (Node n) 模式需要有一个正确的构造函数。在您的代码中n 提取左侧元素。

    试试这个(如果你真的想使用命名模式):

    size n@(Node _ _ _)   = size (left n) + 1 + size (right n)
    

    甚至:

    size n@(Node {})   = size (left n) + 1 + size (right n)
    

    或者你可以提取模式中的标签:

    size (Node {left=l, right=r})   = size l + 1 + size r
    

    或者干脆忽略标签:

    size (Node l _ r)   = size l + 1 + size r
    

    【讨论】:

    • 我已经尝试了您的所有建议,但仍然收到“不在范围内”错误。我可以在 GHCi 中使用“左”和“右”,但似乎无法在我的主模块中使用它们。
    • 您是否正在导出模块中的名称? (这些名字也是函数)。您的模块代码中需要类似“module TreeModule (Tree Node Leaf left right)”之类的东西。
    • 谢谢 - 我在代码中省略了 left、right 和 value 声明。
    • 或者你可以像这样导出:“module TreeModule (Tree(..))”,它导出所有定义为树数据声明的一部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-16
    • 1970-01-01
    • 2018-08-09
    • 2011-09-26
    相关资源
    最近更新 更多