需要帮助修复一点Bug

时间:2010-12-03 15:48:41

标签: haskell syntax

我今天发布了一个问题,有人帮了解,但他的代码无效。这是帖子link to the post

的链接

当我运行他的代码时,我收到一个错误:“输入错误解析'。'”

“。”在“\ t”导致错误之后。我是Haskell的新手,所以我不知道它为什么会导致错误。

需要帮助解决这个问题,但是。

感谢

更新

加载代码时出错。这是错误:

Couldn't match expected type `a -> Bool'
           against inferred type `[Bool]'
    In the first argument of `any', namely
        `(map (\ t -> contains t b) c)'
    In the second argument of `(||)', namely
        `any (map (\ t -> contains t b) c)'
    In the expression: a == b || any (map (\ t -> contains t b) c)

需要帮助才能修复它。

感谢

更新

我在进行更改后运行代码:

data Tree a = Leaf a | Branch a [(Tree a)] deriving (Show)

contains :: Tree a -> a -> Bool 
contains (Leaf a) b = a == b
contains (Branch a c) b = a == b or (map (\ t -> contains t b) c)

这是我现在得到的错误:

Occurs check: cannot construct the infinite type:
      a = ([Bool] -> Bool) -> [Bool] -> a
    When generalising the type(s) for `contains'

更新3

请这是我的代码,但在完成所有更改后仍然会出错。我不明白:

data Tree a = Leaf a | Branch a [(Tree a)] deriving (Show)

contains :: Eq a => Tree a -> a -> Bool 
contains (Leaf a) b = a == b
contains (Branch a c) b = a == b || (map (\t -> contains t b) c)

布尔值在我的系统上不起作用所以我必须使用Bool。现在这是我得到的错误:

Couldn't match expected type `Bool' against inferred type `[Bool]'
    In the second argument of `(||)', namely
        `(map (\ t -> contains t b) c)'
    In the expression: a == b || (map (\ t -> contains t b) c)
    In the definition of `contains':
        contains (Branch a c) b = a == b || (map (\ t -> contains t b) c)

如果可行的话,请你运行上面的代码吗?或者可能在某处遗漏了某些东西。 我非常感谢你的时间。我很感激。

感谢

2 个答案:

答案 0 :(得分:2)

在Haskell中将lambda的参数列表与其主体分开的语法是->,而不是像lambda演算中的.

顺便说一下:这已经在您链接的帖子中得到修复。

编辑:他还使用了any错误 - 他将其视为or。它必须是

or (map (\ t -> contains t b) c)

any (\t -> contains t b) c

除此之外,类型签名是错误的(Boolean而不是Bool并且缺少Eq约束。因此,要么将其删除,要么将其更改为:

contains :: Eq a => Tree a -> a -> Bool

答案 1 :(得分:0)

令人惊讶的是,您收到的错误会告诉您确切的错误:您会在Bool的右侧获得||的列表。因此,您需要进一步处理map的结果列表,例如通过应用andor(可能是后者)。见http://hackage.haskell.org/packages/archive/haskell98/latest/doc/html/List.html#v:or