我正在接收一个数据类型MyList,它有一个带有列表和头部的尾部。需要将其转换为像haskell数据类型列表一样的反向字符串。
showList :: MyList a -> String
showlist (MyList h t) = show(showlist(t) ++ show( h : [] ))
我正在为showList [1,2,3]
找到这种疯狂"\"[3][2]\"[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]"