Haskell 递归地调用show函数
我正在接受一个数据类型MyList,它有一个带列表的尾部和一个头部。需要将其转换为反向字符串,如haskell数据类型列表Haskell 递归地调用show函数,haskell,recursion,show,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]" 您基本上要调用show两次:您不需要这样做,一旦您得到了实现show所需的字符串。因此,与此相反: Prelude
showList :: MyList a -> String
showlist (MyList h t) = show(showlist(t) ++ show( h : [] ))
我对showList[1,2,3]
"\"[3][2]\"[1]"
您基本上要调用show两次:您不需要这样做,一旦您得到了实现show所需的字符串。因此,与此相反:
Prelude> show [1,2,3]
"[1,2,3]"
您将获得:
Prelude> show $ show [1,2,3]
"\"[1,2,3]\""
这是因为为了印刷,哈斯克尔需要逃离那些带\
让我们回到您的定义,您正在尝试定义MyList a->String类型的函数,因此基本上我们只需要在a类型的元素上调用show,我假设h是a类型的,并且该类型是show的一个实例:
我假设您的列表类型如下:
data MyList a = Nil | MyList a (MyList a)
所以你会发现我不知道你为什么要在显示以下内容时反转列表:
Prelude> showList (MyList 1 (MyList 2 Nil))
"[2][1]"
如果您愿意,您可以通过使用来稍微改进您的显示功能:
因此,您将得到:
Prelude> showList (MyList 1 (MyList 2 Nil))
"1,2,"
我留给你们一个练习,如何正确地放置,,[和]同样地打印:
"[1,2]"
除非使用-xOverloadedList,否则showList[1,2,3]的类型似乎都不好。请始终在有关错误或意外输出的问题中添加一个,这样我们才知道您在做什么。当给定字符串时,show不等同于id。
Prelude> showList (MyList 1 (MyList 2 Nil))
"1,2,"
"[1,2]"