【问题标题】:with Preorder to traverse IntTree使用 Preorder 遍历 IntTree
【发布时间】:2019-04-23 07:33:59
【问题描述】:

我正在尝试创建一个预排序函数来遍历 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]
  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:[]

【问题讨论】:

    标签: haskell preorder


    【解决方案1】:

    对于问题 1:

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

    您混淆了类和数据类型。 IntTree 是用data 声明的,所以它不是类型类而是常规数据类型,例如BoolInt。使用方法相同:

    preorder :: IntTree -> [a]
    

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

    preorder :: IntTree -> [Int]
    

    【讨论】:

      【解决方案2】:

      对于问题 1:签名

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

      错了:IntTree 不是类型类,它是普通类型,所以我们可以照原样使用它。

      preorder :: IntTree -> [Int]
      

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

      对于问题 2: :list 中添加一个 element,它具有类型

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

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

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

      preorder (Branch a l r) = l : preorder a ++ preorder r
      

      (最后不用++ []

      【讨论】:

      • 哎呀,你添加了问题 1 部分。我喜欢我们明确的双重答案。
      • @luqui 我在回答问题 2 后意识到有问题 1,所以我首先将答案标记为 Q2-only,然后我开始编辑以完成答案。是的,“分裂”的答案看起来更好,以某种审美方式:)
      • 刚才我已经在您的提示后更正了它。但是下面一行还有一个错误:preorder Empty = []。错误是E:\Haskell\Uebungsblatt_2_Aufgabe_2_a.hs:8:1: error: Equations for `preorder' have different numbers of arguments E:\Haskell\Uebungsblatt_2_Aufgabe_2_a.hs:8:1-19 E:\Haskell\Uebungsblatt_2_Aufgabe_2_a.hs:9:1-35 | 8 | preorder Empty = [] | ^^^^^^^^^^^^^^^^^^^^... [Finished in 0.5s]@chi @luqui
      • @LeonhardFelix 你需要更多括号:preorder Branch a l r = ... 是一个接受 4 个参数的函数,而你想要的是 preorder (Branch a l r) = ...。我相应地编辑了我的答案。
      • @chi 非常感谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-08
      • 2018-03-24
      • 1970-01-01
      • 1970-01-01
      • 2020-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多