Haskell String子串函数

时间:2013-11-17 23:20:48

标签: string function haskell substring

我的函数需要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函数上给出了一个非详尽的错误。

非常感谢任何帮助! 谢谢!

3 个答案:

答案 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”中不同。因此,您需要考虑第一个字母可能是也可能不是您正在寻找的字符串的一部分。