我尝试使用一个函数来计算列表的反向。所以我可以在其他函数中使用它,也就是回文函数,但总是会出错。第一个有效。
这是代码:
rev :: [a] -> [a]
rev [] = []
rev (x:xs) = rev xs ++ [x]
palindrome :: [a] -> Bool
palindrome [] = True
palindrome (x:xs) = if xs == rev (x:xs) then True else False
我必须提到的是,我必须使用签名:[a] -> Bool
总有一天,我会集中精力提出一个大问题来解决初学者列表中常见的两个错误:认为[x]
与任何长度的列表匹配,以及认为列表中的任何函数都必须具有[]
和x:xs
模式。这个问题就是后者的一个例子。当你做同样的事情而不考虑列表长度时,你不需要多个模式!只要palindrome xs = ...
就可以了。考虑到这一点,尝试再次编写palindrome
函数;你的错误将作为副作用被修复。