【发布时间】:2021-11-11 13:42:37
【问题描述】:
我有两个字符串;一个主字符串,另一个是两个字符中的一个(例如“aa”)。
我想看看我的主字符串是否包含第二个字符串并在主字符串中打印它的索引。
我已尝试将主字符串与自身一起压缩,这样我就可以检查彼此之后出现的每个字母组合(例如,“abab”= (a,b) (b,a) (a,b)) .我用 [1..] 压缩这些元组以获得匹配字符串可能开始的正确索引((a,b)0)。然后我用 fst(fst h) 从元组中提取第一个字母,看看它是否与我的辅助字符串的第一个字母匹配。如果它没有找到任何匹配项,它应该在主字符串 (xs) 的其余部分上再次运行。我使用where 将变量h 声明为head(locateZip x:xs)
locate (x:xs) (y:ys) = if fst(fst h) == y && snd(fst h) == ys then snd h else locate xs (y:ys)
where h = head(locateZip x:xs)
locateZip xs = zip(zip xs(tail xs)) [0..]
snd h用于打印元组的索引。
它应该返回如下内容:
locate "aabba" "aa"
0
locate "bbaab" "aa"
2
我知道这可能看起来不寻常,但我还是新手,无法理解我遇到的错误以及哪些有效,哪些无效。
我在h 上收到错误消息:
Couldn't match expected type: ((Char, b2), b3) with actual type: [((b0, b0), b1)]
where 语句是否正确用于此功能?
【问题讨论】:
-
能否提供一个定位函数的用例?是不是类似于: > locate "abcaad" "aa" 返回一个元组,例如 (3,4),假设字符串位置从零开始?
-
我现在进行了编辑:)
-
我只需要它来处理第一个索引。所以在你的例子中它只需要输出 3
标签: haskell