我尝试过的事情:
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']
格式
答案 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
或!!
,则可能是在做一些单字而又不安全的事情。