首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递归显示数据类型

递归显示数据类型
EN

Stack Overflow用户
提问于 2017-04-29 07:05:00
回答 1查看 99关注 0票数 1

我有以下递归数据类型:

代码语言:javascript
复制
data Person boss action = Person{
  salary  :: Float,
  subordinates :: [Person boss action],
  act :: action
  b :: boss
 }

我需要一个函数来打印当前人员的所有字段,然后重复调用该函数。据我所见,秀只能有一个论点。我试过这样的方法:

代码语言:javascript
复制
instance (Show boss, Show action) => Show (Person boss action) where
    show  p =  (show (salary p) (act p) (b p)) map (\x -> show x) (subordinates p)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-29 07:21:11

由于show返回String,您可以通过`++连接show的多个调用:

代码语言:javascript
复制
instance (Show boss, Show action) => Show (Person boss action) where
    show  p =  "salary: " ++ show (salary p) ++ " act " ++ show (act p) ++ " b " ++ show (b p) ++ " subordinates " ++ intercalate "i " (map show (subordinates p))

例如,这段代码

代码语言:javascript
复制
import Data.List                                                                                                                                                                                        

data Person boss action = Person {
salary  :: Float,
subordinates :: [Person boss action],
act :: action,
b :: boss
}

instance (Show boss, Show action) => Show (Person boss action) where
    show  p =  "salary: " ++ show (salary p) ++ " act " ++ show (act p) ++ " b " ++ show (b p) ++ " subordinates " ++ intercalate "i " (map show (subordinates p))

main =
    let
        a = Person { salary=1, subordinates=[], act=1, b=1 }
        aa = Person { salary=2, subordinates=[a], act=2, b=2 }
    in
        do
            putStrLn $ show aa

输出

代码语言:javascript
复制
salary: 2.0 act 2 b 2 subordinates salary: 1.0 act 1 b 1 subordinates

顺便提一句,注意

代码语言:javascript
复制
map (\x -> show x) ...

可以写成

代码语言:javascript
复制
map show ...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43692797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档