String Haskell非穷举模式下的KMP字符串搜索

String Haskell非穷举模式下的KMP字符串搜索,string,algorithm,haskell,String,Algorithm,Haskell,嗨,我尝试在Haskell中实现KMP字符串搜索算法。但是当我尝试运行函数kmp时,它只对这个函数说“非穷举模式”。不管我多么努力地纠正它。我以为我有一切可能的结果。也许我只是瞎了,但我希望有人能帮我 prefix :: String -> [Int] prefix p = hprefix p p 0 hprefix :: String -> String -> Int -> [Int] hprefix [] (i:is) int = [] hprefix (p:ps)

嗨,我尝试在Haskell中实现KMP字符串搜索算法。但是当我尝试运行函数kmp时,它只对这个函数说“非穷举模式”。不管我多么努力地纠正它。我以为我有一切可能的结果。也许我只是瞎了,但我希望有人能帮我

prefix :: String -> [Int]
prefix p = hprefix p p 0

hprefix :: String -> String -> Int -> [Int]
hprefix [] (i:is) int = []
hprefix (p:ps) (i:is) int | (length(i:is)) - (length(p:ps)) == 0 = 0:(hprefix ps (i:is) 0)
                          | p == (head(drop (int) (i:is))) = (int+1):(hprefix ps (i:is) (int+1))
                          | p == i = 1:(hprefix ps (i:is) 1)
                          | otherwise = 0:(hprefix ps (i:is) 0)

hkmp :: String -> String -> [Int]
hkmp p [] = error "leerer Text"
hkmp [] t = error "leeres Pattern"
hkmp p t = kmp p p (take (length p) t) t t

kmp :: String -> String -> String -> String -> String -> [Int]
kmp p (a:as) (b:bs) (t:ts) o | o == [] = error "leerer Text"
                               | p == [] = error "leeres Pattern"
                               | (length p) > (length o) = error "Pattern größer als Text"
                               | (t:ts) == [] = []
                               | (a:as) == [] = ((length(o)) - (length (t:ts))):(kmp p p (take (length p) (drop (length p) (t:ts))) (drop (length p) (t:ts)) o)
                               | (b:bs) == [] = []
                               | a == b = (kmp p as bs (t:ts) o)
                               | (head(drop ((length p) - (length (a:as))) (prefix p))) == 0 = (kmp p p (take (length p) ts) ts o)
                               | otherwise = (kmp p (drop (head(drop ((length p) - (length (a:as))) (prefix p))) p) (take (length p) (drop (head(drop ((length p) - (length (a:as))) (prefix p))) (t:ts))) (drop (head(drop ((length p) - (length (a:as))) (prefix p))) (t:ts))  o)

非常感谢

对于
-fwarn不完整模式
-Wincomplete模式
,GHC将告诉您需要添加哪些模式以避免此错误:

test.hs:5:1: warning: [-Wincomplete-patterns]
    Pattern match(es) are non-exhaustive
    In an equation for ‘hprefix’:
        Patterns not matched:
            [] [] _
            (_:_) [] _
  |
5 | hprefix [] (i:is) int = []
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^...

test.hs:17:1: warning: [-Wincomplete-patterns]
    Pattern match(es) are non-exhaustive
    In an equation for ‘kmp’:
        Patterns not matched:
            _ [] _ _ _
            _ (_:_) [] _ _
            _ (_:_) (_:_) [] _
   |
17 | kmp p (a:as) (b:bs) (t:ts) o | o == [] = error "leerer Text"
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^...
你丢失的图案在警卫面前<代码>(a:as)和类似的东西不能匹配
[]
,即使你为此设置了防护。你应该写得更像:

kmp u[]=错误“leerer Text”
kmp[]\\\\\\=错误“里尔模式”
kmp p|uu| o|(长度p)>(长度o)=错误“模式gröer als文本”
kmp uu[].[]
kmp uu[].[]
kmp【】to=(长度o)-(长度t)):(kmp(取(长度p)(下降(长度p)t))(下降(长度p)t)o)
kmp.[].[]
kmp(a:as)(b:bs)TO | a==b=(kmp作为bs TO)
kmp(a:as)(b:bs)(t:ts)o |(头(下降)(长度p)-(长度(a:as)))(前缀p))==0=(kmp(采取(长度p)ts)ts o)
kmp a t o=(kmp p(下降头(下降头)(下降头)(下降头)(下降头)(下降头)(下降头)(下降头)(下降头)(下降头)(下降头)(下降头)(下降头)(下降头)(下降头)(下降头)(下降头)(下降头)(下降头)(下降头)(下降头)(下降头)(下降头)(下降头)(下降头)(下降头)(下降头)(下降头)(下降头)(下降头)(下降头)(下降头)(下降头)(下降头)(下降头)(下降头)(下降头)(下降头)(下降头)(下降头)(下降头)(下降头

虽然你真的应该考虑进一步打破这一点。这真的很难理解。

很明显,您的
hprefix
kmp
函数不是全部的,因此不是详尽的

要了解原因,请回想
kmp
的第一个(也是唯一一个)等式:

kmp p (a:as) (b:bs) (t:ts) o = ...
这里定义的是
kmp
强制第二个、第三个和第四个参数为非空字符串。因此,为了使
kmp
总计,您必须覆盖这些缺失情况,例如,在
kmp
的模式匹配定义中添加另一个等式,该等式将捕获这些字符串为空的情况:

kmp p s1 s2 s3 o = ...

编译器只是说,如果您在上面提到的位置使用空字符串调用
kmp
,程序可能会在运行时崩溃,因为它没有定义。

当存在非穷举模式时,它会告诉您该模式。请张贴错误。另外,从一看,您可以看到
hprefix[]
没有定义。***Exception:KMP.lhs:(17,3)-(25276):函数kmphprefix中的非穷举模式正在工作。它唯一有问题的kmp您无法将空列表与(t:ts)。。。特别是(t:ts)=[]在编译程序时总是错误地启用警告。至少
-W
,其中包括
-Wincomplete patterns
,可以告诉您缺少哪些模式。谢谢,我添加了:>hprefix[](I:is)int=[]和>kmp[](b:bs)(t:ts)o=((length(o))-(length(t:ts)):(kmp(take(length p)(drop(length p)(t:ts)(t:ts)))(drop(length p)(t:ts))o)>kmp(a:as)[](t:ts)o=]>kmp(a:as)(b:bs)[]o=[]但仍然得到相同的错误