如何回文化 Haskell 中的列表?

How to palindromize a list in Haskell?

palindromize :: [a] -> [a]
palindromize [] = []
palindromize [x] = [x]
palindromize (x:xs) = (x:xs) ++ reverse(x:xs)

我在 haskell 中编写了这段代码,但我不想在中间元素中看到双倍的代码,该怎么做? (另一种方式我不想看到原始列表的最后一个元素) 我应该使用 head 还是 tail 什么的?

像那样: 回文 "mad" == "madam" 回文 "race" == "racecar"

我们可以使用tail :: [a] -> [a]来获得一个列表,其中包含列表的所有元素,除了第一个。实际上Haskell中的列表在概念上被定义为链表,因此tail可以看作是链表节点尾部的"getter"。

我们知道,如果我们反转一个非空列表,那么这个列表至少包含一个元素,所以我们知道这样的 tail 存在。因此,我们在 reverse:

的结果上调用 tail
palindromize :: [a] -> [a]
palindromize [] = []
palindromize xs = xs ++ <b>tail</b> (reverse xs)

我们也可以利用drop :: Int -> [a] -> [a],通过调用drop 1,我们提取一个没有第一个元素的列表,但是drop 1更安全:对于一个空列表drop 1 将 return 空列表。如果我们使用 drop 1,我们也可以摆脱不同的子句:列表的回文就是我们从中删除第一个元素的列表和列表的反向:

palindromize :: [a] -> [a]
palindromize l = l ++ <b>drop 1</b> (reverse l)