从首字母和姓氏haskell创建全名

daupos2t  于 2023-03-08  发布在  其他
关注(0)|答案(2)|浏览(166)

作为输入: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 (),因为我只是返回全名,而不是打印到控制台。
谢谢!

y0u0uwnf

y0u0uwnf1#

您要做的是将Char转换为String。即使show具有正确的类型(Char -> String),它也会以不同的方式进行转换。例如,show 'a'"'a'",而不是"a"
所以你需要一个函数来把'a'转换成"a",因为StringChar的列表,你可以通过这样的函数从Char构建一个String

charToString :: Char -> String
charToString c = [c]

有了它,intercalate ". " $ map charToString initials就给了你"H. B"
注意,charToString等价于(:[]),所以也可以写成intercalate "." $ map (:[]) initials

but5z9lq

but5z9lq2#

从某种意义上说,intercalate是一个错误的函数,您需要将 * ". " *append到每个首字母(或者更准确地说,对于每个首字母,prepend". "加上一个首字母),而不仅仅是用". "分隔首字母。

> concatMap (: ". ") initials ++ surname
"H. B. Curry"

concatMap将给定函数应用于首字母的每个字符,然后将它们连接成一个字符串,并将姓氏附加到该字符串。
concatMap分解为单独的步骤,

> map (: ". ") initials
["H. ","B. "]
> concat (map (: ". ") initials)
"H. B. "
> (concat . map (: ". ")) initials
"H. B. "

因为concatMap f = concat . map f

> concatMap (: ". ") initials
"H. B. "

相关问题