gpt4 book ai didi

在 where 子句中的 Haskell 类型映射(-> 运算符)?

转载 作者:行者123 更新时间:2023-12-04 17:08:26 25 4
gpt4 key购买 nike

我正在尝试理解 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 表达式的反斜杠转义变量,它只能是函数类型映射运算符的情况。在这种情况下,我不明白它是如何将值绑定(bind)到这些变量的, cg ?它到底是什么意思,怎么可能出现在争论中?
    提前致谢!

    最佳答案

    ->在这种情况下,既不是函数类型,也不是 lambda 定义,也不是大小写映射。这是一个 view pattern .

    go (n:ns) (match n -> (Just c, g)) =
    n : go (Graph.neighbors' c ++ ns) g

    相当于
    go (n:ns) g'
    | (Just c, g) <- match n g'
    = n : go (Graph.neighbors' c ++ ns) g

    pattern guard (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) -> ...
    Nothing子句需要代替 go 的后面的子句定义。

    关于在 where 子句中的 Haskell 类型映射(-> 运算符)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34992895/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com