【问题标题】:Haskell - Function that splits up a [char] into a StringHaskell - 将 [char] 拆分为字符串的函数
【发布时间】:2026-01-24 10:40:01
【问题描述】:

我想要一个函数,它可以在输入一些新行的同时将数组转换为字符串。

基本上假设我有列表:[1234567890] 我想用一个整数传递它,然后将该列表作为格式如下的字符串返回:

(如果 Int 为 5,则为 5)

"12345"
"67890"

我想我可以这样做:

split :: Int -> [char] -> String
split n (x:xs) = split (take n-1 (x:xs)) -- I'm trying to make this recursive

我还将假设数组的长度可以被我传入的 Int 整除。

【问题讨论】:

  • 不清楚您要做什么。 Char 的列表已经是 String(这就是 String 的字面定义),但您的输出示例显示两个字符串,而不是一个。
  • 我基本上只是想格式化列表。如果有一种方法可以输出 2 个很棒的字符串,我也在考虑尝试在上面定义的长度的末尾推送一个 \n 字符。
  • 我不明白预期的输出类型是什么:如果您想准确返回两个字符串,请使用.... -> (String, String)。如果要返回多个,请使用... -> [String]

标签: haskell


【解决方案1】:

为此,您必须使split 递归,但在您的递归步骤中,它没有收到相同数量的参数,并且您尝试传递部分参数。 n 可以在每个步骤中保持不变,并且当您在每个步骤中将take n 排除在列表之外时,您还必须在其余步骤中删除这些 n 元素。

splitN _ [] = ""
splitN n l = (take n l) ++ "\n" ++ (splitN n $ drop n l)

【讨论】:

  • 这与 OP 的类型签名不匹配
  • @FyodorSoikin 对,在您对问题发表评论后才看到。
  • 好的,谢谢我的评论!我的输出看起来像“12345\n67890”。你有什么额外的想法吗? split 函数的顶部看起来像 split :: Int -> [Char] -> [Char]
  • 看起来是这样的,因为 ghci 只是这样显示 \n 字符。您会看到,当您真正打印输出时,已格式化,例如putStrLn (splitN 5 "1234567890")。现在这真的取决于你想用它做什么。
  • 啊,是的,谢谢@donttry,非常感谢您的帮助!