Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 递归地调用show函数_Haskell_Recursion_Show - Fatal编程技术网

Haskell 递归地调用show函数

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

我正在接受一个数据类型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> 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]"