我试图创建一个遍历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]
我认为以下一行是不正确的。我想我需要写其他表达式,而不是“ 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:[]
答案 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
声明的,因此它不是类型类,而是常规数据类型,例如Bool
或Int
。用法相同:
preorder :: IntTree -> [a]
第二件事是您没有返回任何类型的a
列表(小写字母是变量类型),而是专门返回了Int
列表,因为这就是树所包含的内容。所以你必须这样说:
preorder :: IntTree -> [Int]