Эти две функции не очень похожи, если вы посмотрите на них. То же самое - первые три «тривиальных» случая, но последний случай делает разные вещи в обеих функциях. Вы также можете пропустить первые два случая в любой из этих функций, поскольку они проверяют одно и то же в тех же списках. Так что myIsInfixOf
также работает так:
myIsInfixOf :: (Eq a) => [a] -> [a] -> Bool
myIsInfixOf (a:as) [] = False
myIsInfixOf listA listB | helpFunction listA listB = True
| otherwise = myIsInfixOf listA (tail listB)
Это действительно не то же самое, что helpFunction
, и не повторяет нетривиальный код.
Также вы действительно хотите, чтобы вторая функция работала независимо от первой, поскольку вы хотите проверить каждую позицию в listB
, совпадает ли каждый символ listA
с символами в listB
. Чтобы сделать это в императивной программе, вам понадобятся вложенные циклы, здесь вам нужна вложенная рекурсия, лучше всего выполненная с помощью вспомогательной функции, как вы сделали. Проблема не в том, что listA
каким-то образом будет потеряна без помощи helpFunction, проблема в том, что алгоритм требует, чтобы helpFunction
выполнял список независимо от myIsInfixOf
.
Если вы хотите избежать ручной реализации рекурсии myIsInfixOf
, используя больше функций из стандартной библиотеки, вы можете использовать any
и tails
. Для helpFunction
вероятно, реальная рекурсия - путь, но вы могли бы упростить весь последний случай до:
helpFunction (x:xs) (y:ys) = (x == y) && helpFunction xs ys