如何在Haskell中重新列表列表?

Dan*_*nyJ 1 haskell element list

palindromize :: [a] -> [a]
palindromize [] = []
palindromize [x] = [x]
palindromize (x:xs) = (x:xs) ++ reverse(x:xs)
Run Code Online (Sandbox Code Playgroud)

我在haskell中执行了这个代码但是在中间元素中我不想看到double,怎么做呢?(另一种方式我不想看到原始列表的最后一个元素)我应该使用头部或尾部还是什么?

像那样:palindromize"mad"=="女士"palindromize"race"=="racecar"

Wil*_*sem 6

我们可以使用tail :: [a] -> [a]获取包含列表中所有元素的列表,第一个除外.事实上,Haskell中的列表在概念上被定义为链表,tail因此可以被视为链表节点尾部的"getter".

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

palindromize :: [a] -> [a]
palindromize [] = []
palindromize xs = xs ++ tail (reverse xs)
Run Code Online (Sandbox Code Playgroud)

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

palindromize :: [a] -> [a]
palindromize l = l ++ drop 1 (reverse l)
Run Code Online (Sandbox Code Playgroud)