如何在 Haskell 中列出 start-/end 个索引?

How can I make a list of start-/end indices in Haskell?

我正在尝试制作一个 Haskell 函数,它接受两个字符串作为参数,第一个是我们要在第二个参数中定位的字符串,return 一个元组列表每次出现的开始和结束索引。例如,

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 和 returns 它们每个的索引。这给了我这个输出:

Ok, one module loaded.
ghci> findPos "blablabla" 'b'
[0,3,6]

但是我该怎么做才能让它接收两个字符串呢? 像这样:

ghci> findPos "blablabla" "bl" 
[(0,1), (3,4), (6,7)] 

我试图将 c 从 char 对象更改为字符串对象,但随后我在 ghci.

中遇到了几个错误

一个(非空)字符串有一个头元素,一个Char:

indexTuples :: String -> String -> [(Int, Int)]
indexTuples []     _   = []
indexTuples (c:cs) str =

在另一个字符串中找到它的索引,-- 一个 list 它们的所有出现,-- 使用你已经拥有的函数 findPos

  let
    ixs = findPos str c

我们一一尝试

    len = length cs
    fits = [ (i,i+len) | i <- ixs, cs == (take len $ drop i str)]

这就是我们的答案。

   in
      fits