list - 如何在 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']
格式
解决方案
[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
.
我不知道你为什么想要这个功能,所以我也不建议更好的实现。可能这只是一个学习示例,非常公平。以后请记住:如果您发现自己在使用head
or !!
,则可能是在做一些不习惯且不安全的事情。
推荐阅读
- python - 构建 docker 容器时出现 Unicode 错误
- python - Scipy最小化..'不等式约束不兼容'
- javascript - History.pushState() 在 YouTube 页面上不起作用
- javascript - 是否使用 FormData 以不同的方式序列化嵌套在数组中的对象?
- java - spring boot不加载jsp文件
- javascript - 如何在 php 中接收 Fetch() POST?
- kubernetes - 无法访问 Traefik 仪表板,获得 404。从 Helm 图表安装在 Kubernetes (k3d) 上(在 Ubuntu 20.04 笔记本电脑上)
- python - 从 PiCamera 环形缓冲区读取最后一帧
- react-native - 为什么世博会后台位置在 5 分钟后停止发送位置?
- c# - 在 XML 异常处理期间,如何获取导致异常的 XML 文件中的行号?