我正在尝试在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
将起作用。
是否还有另一种从这样的数据类型获取值的方法?这是正确的模式吗?
答案 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来帮助缓解至少其中一个问题。