与预审遍历IntTree

时间:2019-04-23 07:34:00

标签: haskell preorder

我试图创建一个遍历IntTree的预订函数。

Tree类如下

data IntTree = Empty | Branch IntTree Int IntTree deriving (Show, Eq)

我有两个问题 1.我收到如下所示的错误。

E:\Haskell\Uebungsblatt_2_Aufgabe_2_a.hs:7:14: error:
    * Expected kind `* -> Constraint', but `IntTree' has kind `*'
    * In the type signature: preorder :: (IntTree c) => c -> [a]
  |
7 | preorder :: (IntTree c) => c->[a]

  |              ^^^^^^^^^
[Finished in 0.5s]

我不明白为什么。它们发生在下一行

preorder :: (IntTree c) => c->[a]
  1. 我认为以下一行是不正确的。我想我需要写其他表达式,而不是“ l:preorder a:preorder r:[]”

preorder Branch a l r = l : preorder a : preorder r:[]

感谢您的提前帮助!

main :: IO ()    -- This says that main is an IO action.
main = return () -- This tells main to do nothing

data IntTree = Empty | Branch IntTree Int IntTree deriving (Show, Eq)


preorder :: (IntTree c) => c->[a]
preorder Empty = []
preorder Branch Empty x Empty = [x]
preorder Branch a l r = l : preorder a : preorder r:[]

2 个答案:

答案 0 :(得分:2)

问题1:签名

preorder :: (IntTree c) => c->[a]

是错误的:IntTree不是类型类,它是普通类型,因此我们可以按原样使用它。

preorder :: IntTree -> [Int]

最终类型必须为Int,因为我们生成的是整数列表,而不是任何[a]的{​​{1}}列表。

对于问题2: a list 之前添加一个 元素,其类型为

:

因此,它不连接两个列表。为此,请改用

(:) :: a -> [a] -> [a]

相同
(++) :: [a] -> [a] -> [a]

(无需在最后使用preorder (Branch a l r) = l : preorder a ++ preorder r

答案 1 :(得分:2)

对于问题1:

preorder :: (IntTree c) => c->[a]

您正在混淆类和数据类型。 IntTree是用data声明的,因此它不是类型类,而是常规数据类型,例如BoolInt。用法相同:

preorder :: IntTree -> [a]

第二件事是您没有返回任何类型的a列表(小写字母是变量类型),而是专门返回了Int列表,因为这就是树所包含的内容。所以你必须这样说:

preorder :: IntTree -> [Int]