Goe*_*ens 5 haskell types where-clause
我试图理解本文中的代码.它解释了使用归纳图,这似乎非常好,并且在某些时候它定义了深度优先搜索归纳图.它的代码如下:
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)
Run Code Online (Sandbox Code Playgroud)
我不明白这两行:
go (n:ns) (match n -> (Just c, g)) =
n : go (Graph.neighbors' c ++ ns) g
Run Code Online (Sandbox Code Playgroud)
似乎它正在定义函数go,它将列表作为第一个参数,它是模式匹配的(n:ns).然而,第二个论点我不明白:(match n -> (Just c, g)).->这里的运营商是什么意思?通过查看运算符,它可以是以下三种情况之一:
由于没有case语句,也没有lambda表达式的反斜杠转义变量,因此它只能是函数类型映射运算符.在这种情况下,我不知道它是如何绑定这些变量的值,c并且g?究竟是什么意思,怎么能在争论中出现?
提前致谢!
->在这种情况下,既不表示函数类型,也不表示lambda-definition或case-mapping.这是一种视图模式.
go (n:ns) (match n -> (Just c, g)) =
n : go (Graph.neighbors' c ++ ns) g
Run Code Online (Sandbox Code Playgroud)
相当于
go (n:ns) g'
| (Just c, g) <- match n g'
= n : go (Graph.neighbors' c ++ ns) g
Run Code Online (Sandbox Code Playgroud)
其中图案后卫 (Just c, g) <- match n g'又短于
go (n:ns) g' = case match n g' of
(Just c, g) -> n : go (Graph.neighbors' c ++ ns) g
(Nothing, g) -> ...
Run Code Online (Sandbox Code Playgroud)
该Nothing条款需要代表go定义的后一条款.