3

リストが回文であるかどうかをテストするために、以下のコードを記述しました。驚いたことに、「== ....の使用から生じる(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
4

3 に答える 3

4

2つのリストが等しいかどうかをテストするには、リスト内の項目が等しいかどうかをテストできる必要があります。したがって、タイプのリストは、それがのインスタンスである[a]ことを確認する必要があります。aEq

また、スタイルの問題として:

x = if c then True else False

で置き換えることができます

x = c
于 2012-05-03T14:52:47.210 に答える
2

タイプクラスをチェックしてEqください:

ghci> :i (==)
class Eq a where
  (==) :: a -> a -> Bool
  ...
    -- Defined in GHC.Classes
infix 4 ==

必要なのは、の型制約ですisPalindrome

また、このコード

if (leftHalf == reverse rightHalf)
              then True
              else False

不必要に長いです。

于 2012-05-03T14:54:00.383 に答える
1

タイプを次のように変更する必要があります。

isPalindrome :: Eq a => [a] -> Bool

そして、これは中心を見つけるのに本当に無関係です、それはただ書くだけで十分xs == reverse xsです-あなたが計算するとき、あなたlength xsはすべてのリストを通り抜けます、そして経済はありません。

于 2012-05-03T18:53:28.060 に答える