【问题标题】:How to concatenate and print a list of integers?如何连接和打印整数列表?
【发布时间】:2021-09-17 19:44:57
【问题描述】:

假设我有一个整数列表(x:xs),所以(x:xs) :: Int

我想在同一行连接并打印这些整数。所以当我执行printL [4,3,4] 时,我希望函数将"434" 作为输出。

我试过了:

printL :: [Int] -> String
printL (x:xs) = chr x ++ printL xs

我的想法是,对于列表中的每个元素,它都会占据头部(所以x)。使用chr 函数将其转换为字符串,然后将其与printL xs 连接(这将递归地再次执行相同的步骤)。

如你所见,我被卡住了,而且我刚开始学习,肯定有很多错误。

【问题讨论】:

  • 尝试使用show x 而不是chr x:您不需要将Unicode 代码点转换为字符,而是将数字转换为十进制数字。这是由show 完成的。另外,不要忘记为递归printL [] = ... 添加一个基本情况。 (当你能更流利地使用 Haskell 时,你会写 printL = concatMap show,但目前它有助于练习基础知识)。

标签: haskell


【解决方案1】:

我的想法是,对于列表中的每个元素,它都会占据头部(所以x)。

最终,如果您使用递归,它将调用printL 并带有一个空列表,因此您需要至少涵盖两种情况:一种用于空列表[],另一种用于非空列表(x:xs) .

使用chr 函数将其转换为字符串

chr :: Int -> Char 将给定的 Int 值转换为 unicode 字符,并将您作为参数传递的值作为代码点。因此它不会创建String,而0不会映射到'0'字符,而是映射到'\NUL'字符。为此,您可以使用 intToDigit :: Int -> Char

并将其与printL xs 连接

chr x 返回一个Char,所以你不能连接它。您可以使用(:) 将其添加到printL 生成的Chars 列表中。

所以我们可以解决这三个问题,并将其实现为:

import Data.Char(intToDigit)

printL :: [Int] -> String
printL [] = ""
printL (x:xs) = intToDigit x : printL xs

我们这里使用的递归模式等价于map :: (a -> b) -> [a] -> [b],以intToDigit作为映射函数,因此我们可以将其重写为:

import Data.Char(intToDigit)

printL :: [Int] -> String
printL = map intToDigit

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2014-03-02
    • 2018-08-18
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多