【发布时间】:2016-01-25 12:41:27
【问题描述】:
我正在尝试理解this article 中的代码。它解释了归纳图的使用,看起来很不错,并且在某些时候它定义了对归纳图的深度优先搜索。它的代码如下:
dfs :: Graph.Node -> Gr a b -> [Node]
dfs start graph = go [start] graph
where go [] _ = []
go _ g | Graph.isEmpty g = []
go (n:ns) (match n -> (Just c, g)) =
n : go (Graph.neighbors' c ++ ns) g
go (_:ns)
这两行我看不懂:
go (n:ns) (match n -> (Just c, g)) =
n : go (Graph.neighbors' c ++ ns) g
似乎它正在定义函数go,它将一个列表作为第一个参数,它与(n:ns) 进行模式匹配。但是,第二个参数我不明白:(match n -> (Just c, g))。运算符-> 在这里是什么意思?通过查找运算符,它可以是以下三种情况之一:
- 函数类型映射运算符。
- Lambda 定义运算符。
- 外壳构造中的分隔符。
由于没有case 语句,也没有用于 lambda 表达式的反斜杠转义变量,因此只能是函数类型映射运算符。在这种情况下,我不明白它是如何将值绑定到这些变量c 和g?它到底是什么意思,怎么可能出现在争论中?
提前致谢!
【问题讨论】:
标签: haskell types where-clause