如何在haskell中将[1,2]转换为['1','2']?

时间:2019-02-10 17:33:20

标签: list dictionary haskell

我尝试过的事情:

fn l = map conv l

conv l = show l

然后fn [1,2] == ["1","2"]

但这是一个字符串数组。我想要一个字符数组。

所以我知道将字符串转换为char,我们可以使用以下代码:

"1" !! 0 == '1'。因此,使用相同的逻辑:

conv l = (show l) !! 0

但是这次我回来了"12"

我假设map会将字符组合在一起形成一个字符串,但是我希望它以['1', '2']格式

1 个答案:

答案 0 :(得分:2)

[1,2,3]['1','2','3']["1","2","3"]列表,而不是数组。与许多功能性语言一样,Haskell在列表上做了很多工作,基本上只是使用数组作为优化。

这包括字符串:在Haskell中,字符串(意思是Prelude.String)只是字符列表。因此,正如罗伯特·齐格蒙德(Robert Zigmond)所评论的那样, ['1','2']"12"完全相同的东西 ,只是用不同的语法编写。

因此,如果GHCi在测试结果中向您显示"12",则表示您已正确完成:您会得到一个字符列表。如果您使用了类型签名,这会更加明显,就像您总是应该做的那样:

fn :: [Int] -> [Char]
fn = map conv
 where conv l = show l !! 0

请注意,这会导致您最初使用的版本不正确conv l = show l时出现编译时类型错误。

如果由于某种原因您实际上需要使用['1','2']形式的输出,则可以轻松地编写一个合适的显示函数:

import Data.List (intercalate)

showPlainList :: [Char] -> String
showPlainList l = "[" ++ intercalate "," (map show l) ++ "]"
GHCi> showPlainList $ fn [1,2]
"['1','2']"

我要指出的是,尽管您的函数可以正常工作,但它还是有缺陷的,即它只能在非负一位数字列表上正常工作。 !!运算符通常是一种代码气味,并且不安全(当您访问末尾时,它将失败,即,在这种情况下,show的结果为空。

我仍然不知道为什么要使用此功能,因此我也不会建议更好的实现。可能这只是一个学习示例,足够公平。将来要记住:如果您使用head!!,则可能是在做一些单字而又不安全的事情。