当我使用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)
答案 0 :(得分:5)
让我告诉你为什么它不起作用的提示:
“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 ... ?? ???
填写点数"?"自己。