【问题标题】:Identifying a specific index in a list of strings and removing everything in the list beyond that index in Haskell在 Haskell 中识别字符串列表中的特定索引并删除列表中该索引之外的所有内容
【发布时间】:2017-03-24 18:15:57
【问题描述】:

我最近开始学习haskell,遇到了这个我似乎无法克服的问题。

我的输入是一个字符串列表,每个字符串包含 3 个字符。我想要做的是在某个点拆分列表,并让输出成为该点之前的列表。

例子:

Main> listsplitter ["AAA", "BBB", "CCC", "STP", "DDD"]
Main> ["AAA", "BBB", "CCC"]
Main> listsplitter ["AAA", "STP", "BBB", "CCC", "DDD"]
Main> ["AAA"]

在这种情况下,STP 是停止输出字符串的标识字符串。

如果可以以类似的方式拆分字符串,或者甚至更简单,那也会很有用。由于这个字符串列表更进一步,我正在处理一个字符串。像这样:

Main> stringsplitter "AAABBBCCCSTPDDD
Main> "AAABBBCCC"
Main> stringsplitter "AAASTPBBBCCCDDD"
Main> "AAA"

我还应该提一下,我想实现这个不导入数据模块。

感谢您的宝贵时间!

【问题讨论】:

  • 除非这恰好是一个要求您明确编写递归算法的练习,否则您正在寻找takeWhile
  • 啊!谢谢!这正是我想要的。不敢相信我自己没有找到。哦,好吧。
  • 查看 hoogle 和此处提到的其他内容:stackoverflow.com/tags/haskell/info

标签: string list haskell indexing split


【解决方案1】:

第一个问题的解决方案分为两部分:

  1. 找到takeWhile函数
  2. 编写一个谓词以与takeWhile 一起使用,一旦你找到它

对于 (1),您可以尝试在 Hoogle 中搜索 [a] -> [a] 之类的内容,这不是您想要的完整类型签名,而是其中的一部分,然后滚动匹配;你很快就会找到takeWhile

对于 (2),您显然想要涉及 (==)(/=) 的内容。玩弄你可能会想出的一点:

keep :: String -> Bool
keep x = x /= "STP"

你可以通过使用部分应用来简化它:

keep :: String -> Bool
keep = (/= "STP")

最后你只需将 (1) 和 (2) 部分结合起来:

listSplitter :: [String] -> [String]
listSplitter = takeWhile (/= "STP")

要解决stringSplitter的第二个问题,你不能简单地使用takeWhile,因为它一次只能看一个项目,你需要看更多。使用Data.List 和/或Data.List.Split 中的某些东西可能有一种优雅的方式来做到这一点(练习:找到一种优雅的方式),但使用从列表头部开始的模式匹配递归地实现自己也很容易:

stringSplitter :: String -> String
stringSplitter [] = []
stringSplitter ('S':'T':'P':_) = []
stringSplitter (x:xs) = x : stringSplitter xs

【讨论】:

    猜你喜欢
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 2019-08-20
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    相关资源
    最近更新 更多