【问题标题】:Grouping a string into a list of substrings of a certain size将字符串分组到一定大小的子字符串列表中
【发布时间】:2018-02-22 21:21:34
【问题描述】:

我拿起了一本 Haskell 书并一直在编写函数,我正在尝试编写一个函数,该函数接受一个字符串,然后创建一个子字符串列表,并且可以选择每个子字符串中有多少个字母。

我才刚刚开始 Haskell,所以完全不确定从哪里开始。

我尝试过使用 group 功能,但整个概念让我很困惑。另一个名为 break 的函数显然会中断,但它只创建一个由两个列表组成的元组,原始列表在条件边界处分隔

【问题讨论】:

  • 那是书中的第一个作业?也许您可以从编写函数签名开始
  • 我见过函数签名,例如 int->int->bool,但我不明白如何开始使用它编写程序。
  • 基本上一个程序一个函数:它把输入变成输出。但我暂时忽略这一点,您可以首先将 Haskell 视为一种查询语言,因此只需实现一个函数。签名有什么不清楚的地方?
  • 我被推荐使用 hoogle website for haskell,假设我们有签名 Int -> Int -> Bool,我要为我想要制作的程序使用什么签名?跨度>
  • 你能更详细地解释一下你的函数应该做什么吗?您是否希望它采用 "hello there!" 之类的字符串并将其分解为 3 个字符的子字符串,例如 ["hel", "lo ", "the", "re!"] ?如果您编辑了问题以添加示例,那将有所帮助。

标签: string list haskell grouping


【解决方案1】:

这个问题有点含糊,但听起来你想要的是一个函数,它接受一个 int 和一个字符串,然后返回一个长度为 int 的字符串列表。

首先确定你的函数的类型。

Int -> String -> [String]

Prelude 有一个名为 splitAt 的函数,它将接受一个 int 并将一个列表分成一对。例如

splitAt 3 "123456789" = ("123", "456789")

你可以使用这个递归来创建你想要的函数。

foo :: Int -> String -> [String]
foo i ""  = []
foo i str = let (x, y) = splitAt i str
            in x : foo i y

foo 3 "123456789" = ["123", "456", "789"]

请注意,splitAt 适用于任何列表,并且字符串只是字符列表。

因此,您可以编写一个更通用的函数,该函数适用于您提供的任何列表。

goo :: Int -> [a] -> [[a]]
goo i []  = []
goo i xs = let (x, y) = splitAt i xs
            in x : goo i y 

【讨论】:

    【解决方案2】:

    我知道您希望自己编写此函数。仅供参考,Haskell 在 Data.List.Split 包中有一个名为 chunksOf 的内置函数(请参阅文档 here)。让我们转向 GHCI repl 来看看它的实践:

    > Prelude > import Data.List.Split
    > Prelude Data.List.Split > chunksOf 3 "abcdefg"
         ["abc","def","g"]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-25
      • 1970-01-01
      • 2023-03-28
      相关资源
      最近更新 更多