Мы можем использовать tail :: [a] -> [a]
, чтобы получить список, содержащий все элементы списка, кроме первого. Фактически список в Haskell определяется концептуально как связанный список, и, таким образом, tail
может рассматриваться как «получатель» хвоста узла связанного списка.
Мы знаем, что если мы перевернем непустой список, такой список содержит хотя бы один элемент, поэтому мы знаем, что такой tail
существует. Поэтому мы называем tail
результатом reverse
:
palindromize :: [a] -> [a]
palindromize [] = []
palindromize xs = xs ++ <b>tail</b> (reverse xs)
Мы также можем использовать drop :: Int -> [a] -> [a]
, вызывая drop 1
, мы извлекаем список без первого элемента, но drop 1
более безопасен: для пустой список drop 1
вернет пустой список. Если мы используем drop 1
, мы также можем избавиться от различных предложений: палиндром списка - это список и обратный список, из которого мы отбросили первый элемент:
palindromize :: [a] -> [a]
palindromize l = l ++ <b>drop 1</b> (reverse l)