Haskell 通过给定跟踪Hakell查找子树

Haskell 通过给定跟踪Hakell查找子树,haskell,Haskell,我对这个问题有信心。 问题是编写一个haskell函数跟踪(包括答案中的类型声明行),它将 以路径p和BTree作为输入,返回通过跟踪中的路径而得到的子树 树。 请注意,(trace p Empty)应始终返回空。 到目前为止,这是我的解决方案 data BTree a = Empty | BNode a ( BTree a ) ( BTree a ) deriving (Show) data Dir = Lft |Rght type Path = [Dir] tr

我对这个问题有信心。 问题是编写一个haskell函数跟踪(包括答案中的类型声明行),它将 以路径p和BTree作为输入,返回通过跟踪中的路径而得到的子树 树。 请注意,(trace p Empty)应始终返回空。 到目前为止,这是我的解决方案

data BTree a = Empty 
             | BNode a ( BTree a ) ( BTree a ) deriving (Show)
data Dir = Lft |Rght
type Path = [Dir]

tree = BNode 1 (  BNode 2 (BNode 4 (Empty) (Empty)) (BNode 5 (Empty) (Empty)) ) ( BNode 3 Empty Empty)

tree1 = BNode 1 (  BNode 2 (BNode 4 (Empty) (Empty)) (BNode 5 (Empty) (Empty)) ) (  BNode 2 (BNode 4 (Empty) (Empty)) (BNode 5 (BNode 3 Empty Empty) (Empty)) )

-- 1.
trace :: Path -> BTree a -> BTree a
trace  p Empty =  Empty 
trace [] a =  a 
trace  (x:xs) (BNode b left right) = if x == Lft then trace xs left else trace xs right
然后我得到了

No instance for (Eq Dir) arising from a use of ‘==’

    • In the expression: x == Lft
      In the expression:
        if x == Lft then trace xs left else trace xs right
      In an equation for ‘trace’:
          trace (x : xs) (BNode b left right)
            = if x == Lft then trace xs left else trace xs right
   |
14 | trace  (x:xs) (BNode b left right) = if x == Lft then trace xs left else trace xs right
   |                                         ^^^^^^^^

运算符
=
是的成员,因此如果要在
Dir
类型上使用运算符
=
,则必须为其派生
Eq
类型类:

data Dir = Lft | Rght deriving Eq
但是,更好的方法是使用模式匹配,而不是与
=
进行比较:

trace  p Empty =  Empty 
trace [] a =  a 
trace (Lft:xs) (BNode _ left _) = trace xs left 
trace (Rght:xs) (BNode _ _ right) = trace xs right

答案很好,但是通过将最后两个case合并到
trace(dir:dirs)(BNode x left right)=trace dirs$case dir of{Lft->left;Rght->right}
(当然,在真正的源文件中,我们会使用空格而不是大括号),它会变得更整洁一些@ Amg合金,我认为这是一个绝对先进的绝对Novii认为这是非常接近陈试图写,但错误地使用<代码>如果<代码>而不是<代码>案件< /代码>。@陈卡普,如果我的答案帮助你,你会考虑接受它吗?你可以点击答案左边的复选标记,再次感谢你的帮助。我点击了复选标记