得到“无法匹配'a'与'[a]'...”错误

时间:2016-10-08 19:08:43

标签: haskell

我是Haskell的初学者,我在使用这段代码时遇到了麻烦。任务是为给定的数据类型创建BFS函数。我尝试了很多变化,但问题基本上保持不变:类型不匹配。

data OrdTree a = OrdTree a [OrdTree a] 
             deriving (Show)

root :: OrdTree a -> a
root (OrdTree x _) = x

children :: OrdTree a -> [OrdTree a]
children (OrdTree _ x) = x

bfsTreeList ::  OrdTree a ->  [a]
bfsTreeList ot = (map root [ot]) ++ (map bfsTreeList (children ot))

DFS似乎运作得很好:

dfsTreeList ::  OrdTree a ->  [a]
dfsTreeList ot = root ot : concat (map dfsTreeList (sons ot))

1 个答案:

答案 0 :(得分:1)

尝试根据树的级别进行思考。什么是关卡?这是一个子树列表。

type Level a = [OrdTree a]

接下来,您将需要一个函数,给定一个级别,生成下一个级别。您可能会发现此处的函数concatMap很有用,但并非绝对必要。

nextLevel :: Level a -> Level a
nextLevel = ...

完成此操作后,您将需要一个函数,该函数在给定树的情况下生成其级别列表。这可能是一个无限列表(因为空级别的下一级别也是一个空级别),但在某个点之后它只会填充空级别。在这里,您可能会发现函数iterate很有用。

levels :: OrdTree a -> [Level a]
levels = ...

最后,您可以使用这些部分构建bfsTreeList函数。您将使用levels从树中生成一个级别列表,然后您将切断仅包含空级别的部分,使列表变为有限,然后您将连接列表并检索存储的值: / p>

bfsTreeList :: OrdTree a -> [a]
bfsTreeList = map root . concat . takeWhile (not . null) . levels

以下是您可以用作测试用例的示例树:

exampleTree :: OrdTree Int
exampleTree = OrdTree 1 [ OrdTree 2 [ OrdTree 5 []
                                    , OrdTree 6 []]
                        , OrdTree 3 [ OrdTree 7 []
                                    , OrdTree 8 [OrdTree 9 []]]
                        , OrdTree 4 []]

结果应如下所示:

λ. bfsTreeList exampleTree 
[1,2,3,4,5,6,7,8,9]