哈斯克尔右转

时间:2012-12-19 04:33:33

标签: haskell shift

仍在努力尝试实施Boyer Moore算法。 几个小时后我就无法让这个讨厌的轮班工作了。 它有效,如果有1:1匹配,即 boyerMoore“你好”“你好”

但它不适用于“howareyou”“是”

我几乎可以肯定我的问题在于带有ifs的boyMoore区域。

我很确定它是boyerMoore函数本身的东西而不是移位方法。只是想知道我是否以正确的方式调用它或者我是否在寻找某些东西?感谢任何帮助。 也很抱歉今天提出这么多问题,只是希望完成这项任务,因为它是我们的最后一项。

boyerMoore :: String -> String -> Bool
boyerMoore [] _ = False
boyerMoore mainString patternString =
    let 
    patternLength = (length patternString)
    position = getPosition patternString (take patternLength(mainString))
    in if (mainString == patternString)
        then True
        else
                if position > -1
                then boyerMoore (patternString) (drop position(mainString))
                else boyerMoore (patternString) (drop patternLength(mainString))

getPosition :: String -> String -> Int
getPosition [] _ = -1
getPosition mainString patternString = shift patternString mainString (length patternString)

shift :: String -> String -> Int -> Int
shift [] _ _ = -1
shift textString patternString lengthVariable =
    if (last patternString) == (last textString)
    then lengthVariable - (length patternString)
    else shift (init patternString) textString lengthVariable

1 个答案:

答案 0 :(得分:3)

boyerMoore的最终等式开始

boyerMoore mainString patternString =

但最后的递归调用都具有

形式
boyerMoore patternString (drop foo mainString)

我对Boyer-Moore的了解很生疏,但我怀疑你想要patternStringmainString交换。

其次,我认为您可能会将the page you link to上的 last()函数与Haskell的last函数混淆。 last给出了你给它的列表的最后一个元素,而 last(),尽管有符号,它有两个参数:要查找的字符和要查看的模式字符串