2014-12-06 9 views
0

Я новичок Haskell, поэтому прошу прощения, если вопрос очень прост.Сравнение строк в Haskell

Как вы можете проверить с помощью Haskell, если одна строка содержится в другой строке, например, «banna» и «banana».

Это то, что я до сих пор, но это, кажется, не работает должным образом:

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

Большое спасибо!

ответ

0

Рассмотрим просто итерация второй строки, исключая символы из первой строки, как вы столкнетесь с ними:

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

Идея заключается в том, чтобы перебирать либо, пока мы не столкнулись все символы из первой строки или иначе, пока мы достигли конца второй строки. В первом случае мы заключаем, что первая строка содержалась во второй строке; в последнем случае это было не так (поскольку у нас все еще есть символы, которые должны совпадать в первой строке, но во второй строке не осталось символов).

+1

Спасибо большое! Не могли бы вы объяснить, что означает s и @? У меня еще не было этого в классе, поэтому я немного смущен. – redrenoir

+0

@ позволяет вам привязать сопоставленный шаблон к другому имени в дополнение к шаблону, который вы используете. s - это то же самое, что (x: xs). Здесь это действительно не нужно, вы можете просто написать 'иначе = isElementString (x: xs) ys'. –

+0

Спасибо тонну! : D – redrenoir

0

Data.ListisInfixOf :: Eq a => [a] -> [a] -> Bool.

Функция isInfixOf принимает два списка и возвращает True, если первый список содержится, полностью и не поврежден, где-либо в пределах второго.

Пример:

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

Это не работает для тестового примера. «банна» - это не инфикс «банана». –