比较Haskell中的字符串

时间:2014-12-06 13:28:25

标签: string haskell

我是Haskell的新手,所以如果问题非常基本,我会道歉。

如果一个字符串包含在另一个字符串中,如何检查Haskell,例如" banna"和"香蕉"。

这是我到目前为止所做的,但它似乎无法正常工作:

isElementString :: String -> String -> Bool 
isElementString (y:ys) (x:xs) = elem y (x:xs) && isElementString (ys) (xs)

非常感谢!

2 个答案:

答案 0 :(得分:0)

考虑简单地迭代第二个字符串,在遇到第一个字符串时从第一个字符串中删除字符:

isElementString :: String -> String -> Bool
isElementString [] _                            = True
isElementString _ []                            = False
isElementString s@(x : xs) (y : ys) | x == y    = isElementString xs ys
                                    | otherwise = isElementString s ys

我们的想法是迭代,直到我们遇到第一个字符串中的所有字符,否则直到我们到达第二个字符串的末尾。在前一种情况下,我们得出结论,第一个字符串包含在第二个字符串中;在后一种情况下,它不是(因为我们仍然有第一个字符串中匹配的字符,但第二个字符串中没有字符匹配它们)。

答案 1 :(得分:0)

使用Data.List' s isInfixOf :: Eq a => [a] -> [a] -> Bool

isInfixOf函数接受两个列表并返回True iff包含第一个列表,完整且完整,在第二个列表中的任何位置。

示例:

λ> isInfixOf "Haskell" "I really like Haskell."
True
λ> isInfixOf "Ial" "I really like Haskell."
False