Haskell子串测试

时间:2014-10-28 10:32:21

标签: haskell

当我使用sub_string("abberr","habberyry")时,它返回True,显然它应该是False。该函数的要点是在第二个参数中搜索第一个参数。任何想法有什么不对?

sub_string :: (String, String) -> Bool 
sub_string(_,[]) = False
sub_string([],_) = True
sub_string(a:x,b:y) | a /= b = sub_string(a:x,y)
                    | otherwise = sub_string(x,y)

3 个答案:

答案 0 :(得分:5)

让我告诉你为什么它不起作用的提示:

  • 你的功能消耗了初始阶段输入叮咬的“abber”和“habber”。
  • 现在剩下“r”和“yry”。

“r”是“yry”的子集。所以它返回True。为了说明问题的一个更简单的例子:

*Main> sub_string("rz","rwzf")
True

答案 1 :(得分:3)

首先,您需要切换前两行。 _将匹配[],这对您匹配时很重要,比如substring "abc" "abc"。其次,用惯用的Haskell编写一个带有两个参数的函数,而不是一个带有参数的函数。所以你的代码应该开始了:

substring :: String -> String -> Bool 
substring [] _ = True
substring _ [] = False
substring needle (h : aystack)
    | ...

现在我们谈到这两个列表都不为空的棘手情况。这是substring as bs上的递归问题:您将"abc"的结果作为"axbxcx"的子字符串(因为"abc"将匹配{{1}首先,然后在字符串的其余部分中查找'a';子字符串算法将跳过"bc"以查找'x'中的"bc",这将匹配"bxcx"并在'b'中查找"c",这将返回"xcx"

相反,你的病情需要更彻底。如果您愿意使用True中的函数,则可以:

Data.List

否则您需要编写自己的 | isPrefixOf needle (h : aystack) = True | otherwise = substring needle aystack ,例如:

isPrefixOf

答案 2 :(得分:2)

正如Sibi已经指出的那样,你的函数测试子序列。回顾上一个练习,它可能是isPrefixof (hackage documentation),这只是一种说法startsWith的奇特方式,它与您编写的函数非常相似。 如果那不是上一个练习,那就现在就做!

然后根据sub_string

撰写isPrefixOf
sub_string (x, b:y) = isPrefixOf ... ?? ???

填写点数"?"自己。