首页 > 解决方案 > 如何在 haskell 中将 [1, 2] 转换为 ['1', '2']?

问题描述

我试过的:

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']格式

标签: listdictionaryhaskell

解决方案


[1,2,3],['1','2','3']并且["1","2","3"]列表,而不是数组。Haskell 和许多函数式语言一样,用列表做了很多事情,基本上只是使用数组作为优化。

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

因此,如果 GHCi 向您显示"12"测试结果,则表示您做对了†</sup>:您确实得到了一个字符列表。如果您使用了类型签名,这将更加明显,就像您应该做的那样:

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']"

†</sup>我应该说,虽然你的函数确实可以正常工作,但它有很大的缺陷,即它只能在非负一位数的列表上正常工作。运算符通常是代码气味,并且不安全(当!!您访问结束时它会失败,即在这种情况下对于show.

我不知道你为什么想要这个功能,所以我也不建议更好的实现。可能这只是一个学习示例,非常公平。以后请记住:如果您发现自己在使用heador !!,则可能是在做一些不习惯且不安全的事情。


推荐阅读