我正在尝试编写一个Haskell函数,该函数以两个字符串作为参数。第一个字符串是我们想要在第二个参数中定位的字符串,并返回一个元组列表,其中包含每个出现位置的起始和结束索引。例如,
indexTuples :: String -> String -> [(Int, Int)]
indexTuples "aa" "foobaarfoobaar"
Output: [(4,5), (11,12)]
到目前为止,我已经编写了一个辅助函数来查找索引(我试图仅使用预定义方法而不是额外的方法来实现)。
我的辅助函数接受一个字符串和一个字符,并返回索引,就像这样:
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
从字符类型更改为字符串类型,但是在ghci
中出现了多个错误。
Data.List
中的现有函数,那么您可以编写findPos haystack needle = findIndices (needle `isPrefixOf`) (tails haystack)
。 - Daniel Wagner