Haskell 通过给定跟踪Hakell查找子树
我对这个问题有信心。 问题是编写一个haskell函数跟踪(包括答案中的类型声明行),它将 以路径p和BTree作为输入,返回通过跟踪中的路径而得到的子树 树。 请注意,(trace p Empty)应始终返回空。 到目前为止,这是我的解决方案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
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认为这是非常接近陈试图写,但错误地使用<代码>如果<代码>而不是<代码>案件< /代码>。@陈卡普,如果我的答案帮助你,你会考虑接受它吗?你可以点击答案左边的复选标记,再次感谢你的帮助。我点击了复选标记