リストが回文であるかどうかをテストするために、以下のコードを記述しました。驚いたことに、「== ....の使用から生じる(Eq a)のインスタンスはありません」というエラーでコンパイルされていません。私の仮定は、コンパイラーはそれを知らず、leftHalf
リストrightHalf
であるということです。
isPalindrome :: [a] -> Bool
isPalindrome [] = False
isPalindrome xs = if (leftHalf == reverse rightHalf)
then True
else False
where leftHalf = take center xs
rightHalf = drop center xs
center = if even (length xs)
then (length xs) `div` 2
else ((length xs) - 1) `div` 2
1)コンパイラにリストであるleftHalf
と伝えるにはどうすればよいですか?
2)これを解決するためにパターンマッチングや他のhaskell言語機能をどのように使用しますか?
編集:ご意見ありがとうございます。ドキュメントのリンクについてはMattFenwickに、エレガントなヒントについてはDuriに特に言及してください。念のため、以下に最終的な解決策を書きますrightHalf
isPalindrome' :: (Eq a) => [a] -> Bool
isPalindrome' [] = False
isPalindrome' xs = if p then True else False
where p = leftHalf == rightHalf
leftHalf = take c xs
rightHalf = take c (reverse xs)
c = div l 2
l = length xs
isPalindrome'
デミが指摘したように改善することができます
isPalindrome'' :: (Eq a) => [a] -> Bool
isPalindrome'' [] = False
isPalindrome'' xs = if (reverse xs) == xs then True else False