я пытаюсь определить функцию isInfixOf, и я пришел к решению (надеюсь, что это работает хорошо :-))
, но из-за рекурсии природы Haskell, я написал другую функцию (помощи), что
почти дублируйте код функции isInfixOf.Есть ли способ сохранить переменную от изменения внутри рекурсий, в haskell?
это код:
myIsInfixOf :: (Eq a) => [a] -> [a] -> Bool myIsInfixOf [] [] = True myIsInfixOf [] list = True myIsInfixOf list [] = False myIsInfixOf listA listB | helpFunction listA listB == True = True | otherwise = myIsInfixOf listA (tail listB)
helpFunction :: (Eq a) => [a] -> [a] -> Bool helpFunction [] [] = True helpFunction [] list = True helpFunction list [] = False helpFunction (x:xs)(y:ys) | x == y = helpFunction xs ys | otherwise = False
я сделал функцию помощи, потому что я нужен первый элемент myIsInfixOf функции, неприкасаемой.
Если я не делаю эту helpFunction, первый элемент функции myIsInfixOf, всегда уменьшайте на один элемент, что не очень хорошо, потому что мне нужно итерации по всему второму элементу функции myIsInfixOf и проверить равенство с первый его элемент.
с помощью helpFunction мой первый элемент списка неприкосновенен, и только второй элемент уменьшает каждую рекурсию (что хорошо).
Итак, могу ли я сохранить где-нибудь, мой первый элемент myIsInfixOf, без перекодирования почти всего?
спасибо. :-)
Не работает ли 'helpFunction' все функции предиката isInfixOf? – liwp
я не думаю :-). myIsInfixof отправьте helpFunction оба его элемента. функция справки проверяет, находится ли первый элемент внутри второго. если да, я получаю Истину за ответ. Если нет, функция myIsInfixOf вызывается с точно первым элементом и хвостом второго элемента. таким образом я исследую первый элемент со всем вторым элементом функции. – Elimelech
Никогда не нужно использовать '... == True'; '...' достаточно. – ephemient