gpt4 book ai didi

string - 如何在 Haskell 中制作开始/结束索引列表?

转载 作者:行者123 更新时间:2023-12-04 11:38:53 25 4
gpt4 key购买 nike

我正在尝试创建一个 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]
(我找到了这个解决方案 here 。)这个函数将带有无限数字列表的字符串压缩成元组,然后选择字符等于参数 c 的元组。并返回它们中的每一个的索引。这给了我这个输出:
Ok, one module loaded.
ghci> findPos "blablabla" 'b'
[0,3,6]
但是我该怎么做才能让它接受两个字符串呢?
像这样:
ghci> findPos "blablabla" "bl" 
[(0,1), (3,4), (6,7)]
我试图改变 c从字符到字符串对象,但随后我在 ghci 中遇到了几个错误.

最佳答案

一个(非空)字符串有一个头元素,一个 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

关于string - 如何在 Haskell 中制作开始/结束索引列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69193311/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com