我今天发布了一个问题,有人帮了解,但他的代码无效。这是帖子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)
如果可行的话,请你运行上面的代码吗?或者可能在某处遗漏了某些东西。 我非常感谢你的时间。我很感激。
感谢
答案 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
的结果列表,例如通过应用and
或or
(可能是后者)。见http://hackage.haskell.org/packages/archive/haskell98/latest/doc/html/List.html#v:or