【问题标题】:Maximum Clique finder in Haskell - parse errorHaskell中的最大集团查找器 - 解析错误
【发布时间】:2016-03-20 15:24:05
【问题描述】:

我正在尝试实现 Bron-Kerbosch 算法来查找最大团的数量(最大团是图的子集,其中每两个顶点都连接并且没有更大的团包含它)

https://en.wikipedia.org/wiki/Bron%E2%80%93Kerbosch_algorithm

不幸的是,我收到一个错误:“输入 'res' 上的解析错误” 我似乎无法解决它。我试图用普通的水龙头空间来改变它,但它似乎不起作用。我也没有看到任何错误?有什么想法吗?

    type Clique = [Vertex]
swarming::Clique->[Vertex]->[Vertex]->[Clique]
swarming R P X =
    if null P && null X then [R]
                        else loop R X
                    where
                        loop::[Vertex]->[Vertex]->[Clique]
                        loop[] _    =[]
                        loop(v:R') X=
                            swarming (v:R)(P 'res' v)(X 'res' v)
                            loop P (v:X)

type Vertex = Int
class Graph g where
    size            ::g->Int
    verticies       ::g->[Vertex]
    connected       ::g->Vertex->Vertex->Bool

bron::Graph g=>g->[Clique]
bron g = swarming[] (verticies g) []
    where
        swarming R P X =
                if null P && null X then [R]
                        else loop R X
                    where
                        loop::[Vertex]->[Vertex]->[Clique]
                        loop[] _    =[]
                        loop(v:R) X=
                            swarming (v:R)(P 'res' v)(X 'res' v)
                            loop P (v:X)
                       res::[Vertex]->Vertex->[Vertex]
                       res  vs v = filter(connected g v) vs

【问题讨论】:

  • 我相信你需要使用反引号而不是单引号作为中缀表示法。 P 'res' v 对我来说似乎不是有效的 Haskell。

标签: haskell graph


【解决方案1】:

正如我所见,您的代码有更多错误,而不仅仅是您得到的错误:

  • 首先,正如评论中所说,' 是为单个字符保留的 Char,您要查找的语法是 `res`。

  • 其次,我看到您正在使用制表符,较新版本的 ghc 编译器会警告您,通常现在人们使用空格(这主要是您的口味问题,这取决于您)

我稍微重新排序了您的代码,并以编译的方式对其进行了修改。 undefined 会引发运行时错误,但这种状态比非编译状态要好。

type Clique = [Vertex]
type Vertex = Int

class Graph g where
  size      :: g -> Int
  vertices  :: g -> [Vertex]
  connected :: g -> Vertex -> Vertex -> Bool

我通常以 type/data/class 声明在我的文件顶部,其余部分在其下方的方式组织我的代码。

语法方面,您遇到的下一个错误是使用大写字母作为变量名——这在 haskell 中是不允许的。类型以大写变量开头,小写。

bron 是一个棘手的函数,老实说,我无法完全弄清楚你想要做什么,有两件事让这很难弄清楚。

  1. 在群集和循环中都有“变量”r 和 r - 似乎它们应该不一样,而 p 应该始终相同。 名称阴影不是句法问题,而是逻辑问题,如果两个不同的事物名称不同,它会更容易。

  2. 我明白了

    loop ... = swarming
               loop
    

    这是无效的 haskell 语法 - 你将如何处理 swarming 它未在以下代码部分中使用,请使用 let … in 将这两行拼接在一起

这是您的代码的其余部分 bron,其中包含编译但不完整的实现

bron :: Graph g => g -> [Clique]
bron g = swarming [] (vertices g) []
  where res :: [Vertex] -> Vertex -> [Vertex]
        res vs v = filter (connected g v) vs

        swarming :: Clique -> [Vertex] -> [Vertex] -> [Clique]
        swarming r [] [] = [r]
        swarming r p x   = loop r x
          where loop :: [Vertex] -> [Vertex] -> [Clique]
                loop [] _    = []
                loop (v:r) x = undefined
                            -- let sw = swarming (v:x) (p `res` v) (x `res` v)
                            -- in loop ??

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 2020-04-02
    • 2012-01-23
    相关资源
    最近更新 更多