从数据类型检索值

时间:2019-07-03 15:58:34

标签: haskell syntax algebraic-data-types

我正在尝试在Haskell中实现对象图,并且我有一个简单的 <div class="wrapper" id="app"> <div class="sidebar"> <!--Tip 1: You can change the color of the sidebar using: data-color="purple | blue | green | orange | red" Tip 2: you can also add an image using data-image tag--> <div class="sidebar-wrapper"> <div class="logo"> <a href="http://www.creative-tim.com" class="simple-text"> <?php echo e(Auth::user()->name); ?> </a> </div> <ul class="nav"> <li class="nav-item active"> <a class="nav-link" href="dashboard.html"> <i class="nc-icon nc-chart-pie-35"></i> <p>Dashboard</p> </a> </li> <li> <a class="nav-link" href="./user.html"> <i class="nc-icon nc-circle-09"></i> 类型,其中包含一个标识符和一个连接节点的列表。

Node

我的问题是对这些类型进行操作-特别是检索值。例如,我想查看节点内的data Node = Node Integer [Node] deriving (Show) 值;也许找到ID = 0的商品

Integer

好的,所以我不能使用nodes = [Node 0 []] [n | n <- nodes, fst n == 0] • Couldn't match expected type ‘(Integer, b0)’ with actual type ‘Node’ • In the first argument of ‘fst’, namely ‘n’ In the first argument of ‘(==)’, namely ‘fst n’ In the expression: fst n == 0 。我也不能使用fst。我可以编写一个函数来提取

之类的值
!!

,现在nodeId :: Node -> Integer nodeId (Node i _) = i 将起作用。

是否还有另一种从这样的数据类型获取值的方法?这是正确的模式吗?

2 个答案:

答案 0 :(得分:8)

从数据构造函数中获取值的唯一方法实际上是对其进行模式匹配。如果需要,您可以定义执行此操作的函数,就像使用nodeId一样,也可以直接进行模式匹配。例如,您可以编写

[n | n@(Node id _) <- nodes, id == 0]

或者,由于列表推导会跳过模式失败的值,因此较短的版本将是

[n | n@(Node 0 _) <- nodes]

答案 1 :(得分:5)

您还可以使用记录语法为字段生成访问器函数:

data Node = Node { nodeId :: Integer,
                   children :: [Node]
                 } deriving (Show)

[n | n <- nodes, nodeId n == 0]

尽管这有污染的缺点;它根据字段名称创建函数。这意味着您不能有两个记录具有相同名称的字段。您也不能拥有与记录的字段名称相同名称的函数。

为@K。 A. Buhr提到GHC does have an extension来帮助缓解至少其中一个问题。