【问题标题】:give a recursive definition when 'show'ing 'string' elements在“显示”“字符串”元素时给出递归定义
【发布时间】:2011-05-30 10:37:18
【问题描述】:

我有以下功能:

convertToStr :: [Int] -> String
convertToStr [] = []
convertToStr (int:ints)
    | length (int:ints) == 1 = ((show (head (drop 0 (int:ints)))) ++ ", ")
    | length (int:ints) == 2 = ((show (head (drop 0 (int:ints)))) ++ ", ") ++ ((show (head (drop 1 (int:ints)))) ++ ", ")

从上面可以看出,我已经设法从这个输入中得到以下输出:

> convertToStr [3,5]
"3, 5, "

然而,我似乎对能够编写递归定义感到困惑。我想将[Int] 元素中任意长度的列表转换为具有该列表的字符串,并且不对其进行限制。

【问题讨论】:

  • 请意识到drop 0 基本上什么都不做。它需要一个列表,并从中删除 0 个元素。此外,您应该尝试更适应pattern matching
  • 这听起来像是功课;基本思想是转换第一个数字,然后使用递归来转换其余的。

标签: string list haskell


【解决方案1】:

如果没有显式递归,您可以像这样使用 mapintersperse 来实现

convertToString :: [Int] -> String
convertToString = concat . (intersperse ", ") . map show

编辑:手动递归就像

cts [] = ""
cts (x:xs)
   | null xs = show x 
   | otherwise = show x ++ ", " ++ cts xs

【讨论】:

  • 使用这种方法,我个人更喜欢模式匹配 [x] 而不是使用 null xs 保护。
【解决方案2】:

首先,你的函数有点乱。我建议您查看一些适合您任务的库函数。我建议intercalate,它接受一个列表(字符串),在它们之间放置一些东西(比如", ")并连接它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    相关资源
    最近更新 更多