我的函数需要2个字符串,并确定第一个字符串是否是第二个输入字符串的子字符串。例如:
isSubb "abc" "abcmhk" -- True
isSubb "abc" "uyabcmhk" -- True
isSubb "abc" "okaibcmhk" -- False
isSubb "abc" "amnabkaaabcmhk" -- gives True
到目前为止,我有:
isSubb :: [Char] -> [Char] -> Bool
isSubb sub str = auxx sub sub str
auxx :: [Char] -> [Char] -> [Char] -> Bool
auxx safe (s:ub) (st:r)
| s:ub == [] = True
| st:r == [] = False
| s == st = auxx safe ub r
| otherwise = auxx safe safe r
但它在auxx
函数上给出了一个非详尽的错误。
非常感谢任何帮助! 谢谢!
答案 0 :(得分:3)
您的auxx
函数需要考虑第二个或第三个参数为[]
的情况(因为您到达那里)。
s:ub == []
和st:r == []
永远不会是True
,因为模式匹配在警卫评估之前发生。
你的功能相当于
auxx safe sub str
| sub == [] = True
| str == [] = False
| head sub == head str = auxx safe ub r
| otherwise = auxx safe safe r
虽然上述方法效率不高,但可以通过模式匹配来改进。
auxx _ [] _ = True
auxx _ _ [] = False
auxx safe (s:ub) (st:r)
| s == st = auxx safe ub r
| otherwise = auxx safe safe r
答案 1 :(得分:3)
在Data.List
中有isInfixOF
函数。
isInfixOf :: Eq a => [a] -> [a] -> Bool
isInfixOf
函数接受两个列表并返回True
iff包含第一个列表,完整且完整,在第二个列表中的任何位置。
Prelude Data.List> isInfixOf "abc" "abcmhk"
True
Prelude Data.List> isInfixOf "abc" "uyabcmhk"
True
Prelude Data.List> isInfixOf "abc" "okaibcmhk"
False
Prelude Data.List> isInfixOf "abc" "amnabkaaabcmhk"
True
您可以编写类似
的功能import Data.List (isInfixOf)
isSubb :: [Char] -> [Char] -> Bool
isSubb sub str = isInfixOf sub str
答案 2 :(得分:-1)
你的定义不正确!
| s == st = auxx safe ub r
给出了问题。看,确定“abc”是否在“afkjskgsbc”中与确定“bc”是否在“fkjskgsbc”中不同。因此,您需要考虑第一个字母可能是也可能不是您正在寻找的字符串的一部分。