string - 如何在 Haskell 中列出开始/结束索引?
问题描述
我正在尝试制作一个以两个字符串作为参数的 Haskell 函数,第一个是我们要在第二个参数中定位的字符串,并返回一个包含每次出现的开始和结束索引的元组列表。例如,
indexTuples :: String -> String -> [(Int, Int)]
indexTuples "aa" "foobaarfoobaar"
Output: [(4,5), (11,12)]
到目前为止,我已经创建了一个查找索引的帮助函数(我试图不使用除 Prelude 方法之外的任何其他方法,而是自己实现)。
我的辅助函数接受一个字符串和一个字符并返回索引,如下所示:
findPos :: (Num a1, Enum a1, Eq a2) => [a2] -> a2 -> [a1]
findPos str c = [index | (x, index) <- zip str [0..], x == c]
(我在这里找到了这个解决方案。)这个函数将带有无限数字列表的字符串压缩成元组,然后选择字符等于参数的元组c
并返回每个元组的索引。这给了我这个输出:
Ok, one module loaded.
ghci> findPos "blablabla" 'b'
[0,3,6]
但是我该怎么做才能让它接受两个字符串呢?像这样:
ghci> findPos "blablabla" "bl"
[(0,1), (3,4), (6,7)]
我试图将c
char 从 char 更改为 string 对象,但随后在ghci
.
解决方案
一个(非空)字符串有一个头元素 a Char
:
indexTuples :: String -> String -> [(Int, Int)]
indexTuples [] _ = []
indexTuples (c:cs) str =
在另一个字符串中找到了它的索引,--所有出现的它们的列表,--使用你已经拥有的函数findPos
,
let
ixs = findPos str c
我们尝试每一个
len = length cs
fits = [ (i,i+len) | i <- ixs, cs == (take len $ drop i str)]
这就是我们的答案。
in
fits
推荐阅读
- ios - AVAudioSession 和触觉反馈
- flutter - 如何从 AsyncSnapshot 获取文档名称
- kotlin - Micronaut-Core:如何创建动态端点
- java - Java 套接字写入问题
- reactjs - 如何在此 graphql 查询中按 ID 过滤
- .net - SpecFlowPlusRunnerAssemblyHook 抛出异常 Invalid URI: The hostname could not be parsed
- messagebox - 汇编器上的代码“初始化器幅度对于指定大小而言太大”的问题
- java - Spring MVC 找不到映射
- firebase - 如何在 Firebase 实时数据库中处理所需的关系?
- java - 如何只显示我的 3 个数组的逻辑大小?