String 比较Haskell中的字符串

String 比较Haskell中的字符串,string,haskell,String,Haskell,我是Haskell的新手,如果问题很简单,我道歉 如果一个字符串包含在另一个字符串中,如banna和banana,如何与Haskell进行检查 到目前为止,这就是我所拥有的,但它似乎不能正常工作: isElementString :: String -> String -> Bool isElementString (y:ys) (x:xs) = elem y (x:xs) && isElementString (ys) (xs) 非常感谢 考虑简单地迭代第二个字

我是Haskell的新手,如果问题很简单,我道歉

如果一个字符串包含在另一个字符串中,如banna和banana,如何与Haskell进行检查

到目前为止,这就是我所拥有的,但它似乎不能正常工作:

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

非常感谢

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

isElementString :: String -> String -> Bool
isElementString [] _                            = True
isElementString _ []                            = False
isElementString s@(x : xs) (y : ys) | x == y    = isElementString xs ys
                                    | otherwise = isElementString s ys
其思想是迭代,直到遇到第一个字符串中的所有字符,或者直到到达第二个字符串的末尾。在前一种情况下,我们得出结论,第一个字符串包含在第二个字符串中;在后一种情况下,情况并非如此,因为我们在第一个字符串中仍然有要匹配的字符,但在第二个字符串中没有要匹配的字符

使用数据。列表的isInfixOf::Eq a=>[a]->[a]->[a]->Bool

isInfixOf函数接受两个列表,如果第一个列表完整地包含在第二个列表中的任何位置,则返回True

例如:

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

谢谢!你能解释一下s和@的意思吗?我在课堂上还没有,所以我有点困惑。@允许您将匹配的模式绑定到您使用的模式之外的另一个名称。s与x:xs是相同的东西。这里实际上不需要它,您可以改为编写otherse=isElementString x:xs ys。这对测试用例不起作用。班纳不是香蕉的中缀。