Haskell 以预先顺序遍历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 `*' *

我试图创建一个预排序函数来遍历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 `*'
    * 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:[]”

  • 我提前感谢你的帮助

    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]