我最近编写了一些处理字符串的 Scala 代码,找到它的所有子字符串并保留在字典中找到的那些的列表。整个字符串中子字符串的开头和结尾也必须保留以供以后使用,因此最简单的方法似乎就是使用嵌套的 for 循环,如下所示:
for (i <- 0 until word.length)
for (j <- i until word.length) {
val sub = word.substring(i, j + 1)
// lookup sub in dictionary here and add new match if found
}
作为练习,我决定尝试在 Haskell 中做同样的事情。它看起来很简单,不需要子字符串索引 - 我可以使用类似这种方法来获取子字符串,然后调用递归函数来累积匹配项。但如果我也想要索引,它似乎更棘手。
我将如何编写一个函数,该函数返回一个列表,该列表包含每个连续的子字符串及其在“父”字符串中的开始和结束索引?
例如tokens "blah"
会给[("b",0,0), ("bl",0,1), ("bla",0,2), ...]
更新
精选的答案和大量新事物可供探索。在搞砸了一点之后,我已经去了第一个答案,丹尼尔的建议是允许使用[0..]
.
data Token = Token String Int Int
continuousSubSeqs = filter (not . null) . concatMap tails . inits
tokenize xs = map (\(s, l) -> Token s (head l) (last l)) $ zip s ind
where s = continuousSubSeqs xs
ind = continuousSubSeqs [0..]
鉴于我有限的 Haskell 知识,这似乎相对容易理解。