2

RWH の第 3 章の質問 5 の要求に基づいて、パディンドロームの存在をテストする関数を作成します。

書いたけど動かない

pCheck :: (Eq a) => [a] -> Bool;
pCheck a = take n a == ( take n $ reverse a )
  where n = floor ( length a / 2 )

実行しようとすると、次のエラーが表示されます。

No instance for (RealFrac Int)
  arising from a use of `floor' at len.hs:13:11-32
Possible fix: add an instance declaration for (RealFrac Int)
In the expression: floor (length a / 2)
In the definition of `n': n = floor (length a / 2)
In the definition of `pCheck':
    pCheck a = take n a == (take n $ reverse a)
             where
                 n = floor (length a / 2)

私は何が間違っているのですか?パディンドロームは でテストできることはわかっていますがa == reverse a、今は自分のやり方でエラーを見つけたいと思っています。

更新: コードのエラーの 1 つが正義の提案によって修正されました。残りの問題を反映するように質問が更新されました。

4

3 に答える 3

5

表現

take n a == take n $ reverse a

として解析されます

(take n a == take n) $ (reverse a)

$演算子が優先されるため、演算子0よりも低くなり==ます。

次の式が必要です。

take n a == (take n $ reverse a)

また、Haskellを尊重し、length aではなく使用してくださいlength (a)length a `div` 2また、ではなくを使用する必要がありますlength a / 2。関数divは整数除算であり、結果として整数になります。

于 2009-11-30T00:20:31.100 に答える
1

2 つの問題。

まず、正義によって指摘された優先順位の問題: 必要(take n $ reverse a)またはtake n (reverse a)

第二に、整数ではなく有理数しか割り切れないので、本当に欲しい

  where n = floor $ (toRational $ length $ reverse a) / 2 

または、正義が指摘したように-これについては私ではなく彼に賛成票を投じてください-div代わりに整数除算を使用(/)してください。toRational

(ここで括弧を取り除くことは可能かもしれませんが、努力する価値があるかどうかはわかりません...)

于 2009-11-30T00:38:12.170 に答える
0

Haskellは、のような式を見たときに、整数と浮動小数点数の間でいかなる種類の自動変換も行いませんlength a / 2Int余りを無視して2つの型の数値を除算する場合は、を使用しますdiv

Prelude> 2 `div` 2
1
Prelude> 3 `div` 2
1
Prelude> 4 `div` 2
2
Prelude> 5 `div` 2
2
Prelude>
于 2009-11-30T18:38:31.780 に答える