递归调用show函数

时间:2018-02-21 21:29:54

标签: haskell recursion show

我正在接收一个数据类型MyList,它有一个带有列表和头部的尾部。需要将其转换为像haskell数据类型列表一样的反向字符串。

showList :: MyList a -> String
showlist (MyList h t) =  show(showlist(t) ++ show( h : [] ))

我正在为showList [1,2,3]

找到这种疯狂
"\"[3][2]\"[1]"

1 个答案:

答案 0 :(得分:1)

你基本上打电话给show两次:一旦你得到了一个字符串,就可以实现show所需的全部内容。所以不要这样:

Prelude> show [1,2,3]
"[1,2,3]"
你得到了:

Prelude> show $ show [1,2,3]
"\"[1,2,3]\""

那是因为为了打印" Haskell需要逃脱那些\的人。

让我们回到您的定义,您正在尝试定义MyList a -> String类型的函数,所以基本上我们只需要在类型元素上调用show a(我假设h的类型为a,此类型是Show的实例):

showList :: (Show a) => MyList a -> String
showList Nil = ""
showlist (MyList h t) =  showlist(t) ++ show(h : [])

我假设你的列表类型是这样的:

data MyList a = Nil | MyList a (MyList a)

所以你会得到(我不知道你为什么在展示时扭转名单):

Prelude> showList (MyList 1 (MyList 2 Nil))
"[2][1]"

如果您愿意,可以使用,

来改善您的节目功能
showList :: (Show a) => MyList a -> String
showList Nil = ""
showlist (MyList h t) =  show h ++ "," ++ showlist t

因此,您将获得:

Prelude> showList (MyList 1 (MyList 2 Nil))
"1,2,"

我将您作为练习留给您如何正确放置,[]同样打印:

"[1,2]"