Haskell 以预先顺序遍历IntTree
我试图创建一个预排序函数来遍历IntTree 树类如下所示Haskell 以预先顺序遍历IntTree,haskell,preorder,Haskell,Preorder,我试图创建一个预排序函数来遍历IntTree 树类如下所示 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 `*' *
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]
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:[]
关于问题1:签名
preorder :: (IntTree c) => c->[a]
错误:IntTree
不是类型类,它是普通类型,因此我们可以按原样使用它
preorder :: IntTree -> [Int]
最后的类型必须是Int
,因为我们生成的是整数列表,而不是任何a
的[a]
列表
关于问题2:
:
将元素添加到列表前,它具有类型
(:) :: a -> [a] -> [a]
因此,它不会连接两个列表。为此,请使用
(++) :: [a] -> [a] -> [a]
如
(无需在末尾使用+[]
)对于问题1:
preorder :: (IntTree c) => c->[a]
您混淆了类和数据类型IntTree
是用data
声明的,因此它不是typeclass,而是常规数据类型,例如Bool
或Int
。其使用方式相同:
preorder :: IntTree -> [a]
第二件事是,您没有返回任何类型的列表a
(小写字母是类型变量),而是专门返回Int
s的列表,因为这是树包含的内容。所以你必须这么说:
preorder :: IntTree -> [Int]
该死,你增加了一个问题1部分。我喜欢我们的单音双音答案。@luqui我在回答问题2后意识到有一个问题1,所以我首先将答案标记为仅Q2,然后开始编辑以完成答案。是的,“分开”的答案看起来更好,从某种美学角度来看:)刚才我在你的tipps后纠正了它。但是在下面的行中仍然有一个错误:
preorderempty=[]
。错误是:E:\Haskell\Uebungsblatt\u 2\u Aufgabe\u 2\u a。hs:8:1:错误:“预订单”的方程式有不同数量的参数E:\Haskell\Uebungsblatt\u 2\u Aufgabe\u 2\u a。hs:8:1-19 E:\Haskell\Uebungsblatt\u 2\u Aufgabe\u 2\u a。hs:9:1-35 ^预订单为空=[]^^^^^^^^^^^^。。。[在0.5s内完成]
@chi@luqui@LeonhardFelix您需要更多的括号:preorder Branch a l r=…
是一个包含4个参数的函数,而您需要的是preorder(Branch a l r)=…
。我据此编辑了我的答案。@chi非常感谢
preorder :: IntTree -> [a]
preorder :: IntTree -> [Int]