Haskell显示没有Data.Tree或派生的Tree(显示) [英] Haskell display Tree without Data.Tree or deriving(show)

查看:64
本文介绍了Haskell显示没有Data.Tree或派生的Tree(显示)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好,我的实例在显示Haskell中的树时遇到问题:这是我的代码:

Hi guys I'm having an issue with my instance to show a tree in Haskell: here is my code:

data Tree a b = Branch b (Tree a b) (Tree a b)
          | Leaf a
instance  (Show a, Show b) =>Show (Tree a b) where
show (Leaf x) = " "++show x ++"\n"
show (Branch val l r) = show val ++ "\n" ++" " ++ show l ++ " " ++ show r

这是我的测试用例和输出(这是错误的):

here is my test case and output( which is wrong):

 Branch "<" (Branch "<" (Leaf 'a') (Leaf 'c')) (Branch "<" (Leaf 'g') (Branch     "<" (Leaf 'n') (Leaf 'y'))))
 "<"
  "<"
    'a'
    'c'
  "<"
    'g'
  "<"
    'n'
    'y'

正确的输出

 "<"
  "<"
    'a'
    'c'
  "<"
    'g'
    "<"
      'n'
      'y'

任何帮助都会很棒!

推荐答案

您的显示功能无法知道每行缩进的深度.在子树前面加一个空格是行不通的,因为它们通常会有多于一行.

Your display function has no way of knowing how deeply to indent each line. Prepending a space to your subtrees won't work because they will generally have more than one line.

您需要定义一个以缩进为参数的辅助功能:

You need to define an auxiliary function which takes the indentation as a parameter:

indent n x = concat (replicate n " ") ++ show x ++ "\n"

f n (Leaf x) = indent n x
f n (Branch val l r) = indent n val ++ f (n+1) l ++ f (n+1) r

instance (Show a, Show b) => Show (Tree a b) where
  show tree = f 0 tree

这篇关于Haskell显示没有Data.Tree或派生的Tree(显示)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆