作为输入:initials = "HB"
,surname = "Curry"
,输出应为全名:H. B. Curry
,其中.
穿插在首字母和姓氏之间
我有:intersperse '.' initials ++ "." ++ surname
,它给出H.B.Curry
(不正确,因为没有空格)
为了插入字符串". "
而不是字符'.'
,我需要第二个参数是字符串列表。
因此,我尝试了map show initials
,预期为["H", "B"]
,但得到了["'H'", "'B'"]
这意味着intercalate ". " $ map show initials
给出了'H'. 'B'
而不是我想要的H. B
。
这个线程How to use show to print character without single quotes?使用了我不想使用的IO ()
,因为我只是返回全名,而不是打印到控制台。
谢谢!
2条答案
按热度按时间y0u0uwnf1#
您要做的是将
Char
转换为String
。即使show
具有正确的类型(Char -> String
),它也会以不同的方式进行转换。例如,show 'a'
是"'a'"
,而不是"a"
。所以你需要一个函数来把
'a'
转换成"a"
,因为String
是Char
的列表,你可以通过这样的函数从Char
构建一个String
。有了它,
intercalate ". " $ map charToString initials
就给了你"H. B"
。注意,
charToString
等价于(:[])
,所以也可以写成intercalate "." $ map (:[]) initials
。but5z9lq2#
从某种意义上说,
intercalate
是一个错误的函数,您需要将 *". "
*append到每个首字母(或者更准确地说,对于每个首字母,prepend". "
加上一个首字母),而不仅仅是用". "
分隔首字母。concatMap
将给定函数应用于首字母的每个字符,然后将它们连接成一个字符串,并将姓氏附加到该字符串。将
concatMap
分解为单独的步骤,因为
concatMap f = concat . map f
,