1

私はこれに30分以上苦労しています。私はそれが単純なことだと知っていますが、私は Haskell の型が苦手で、私と非常によく似た問題に対する受け入れられた回答を読んだ後でさえ、私はまだ自分の問題を解決できません - ましてやそれを理解することはできません!

コード:

p108 = [filter (\[a,b] -> a>0 && b>0) (diophantinepairs n) | n <- [1..]]

diophantinepairs :: Integer -> [[Integer]]
diophantinepairs n = nub$map sort b
    where
        a = divisors n
        b = [[(n-d), n - (n^2)/d] | d <- a]

エラー :

249:39:
    No instance for (Fractional Integer)
      arising from a use of `/'
    Possible fix: add an instance declaration for (Fractional Integer)
    In the second argument of `(-)', namely `(n ^ 2) / d'
    In the expression: n - (n ^ 2) / d
    In the expression: [(n - d), n - (n ^ 2) / d]

ありがとう、サム。

4

2 に答える 2

8

これらの種類のエラーの読み方は次のとおりです。

No instance for (Fractional Integer)

翻訳: あなたのプログラムにはがありますが、そのクラスIntegerのメソッドの 1 つを使用しています。Fractional

arising from a use of `/'

翻訳: 関連するメソッドは/Fractionalクラスの一部です。 Integerは ではないため、整数にFractionalは適用できません。/

解決策:代わりにdivorを使用します。quot

ghci私は簡単に同じエラーを得ることができます:

Prelude> (1 :: Integer) / (2 :: Integer)

<interactive>:2:16:
    No instance for (Fractional Integer)
      arising from a use of `/'
    Possible fix: add an instance declaration for (Fractional Integer)
    In the expression: (1 :: Integer) / (2 :: Integer)
    In an equation for `it': it = (1 :: Integer) / (2 :: Integer)

別の修正: の代わりに a などの型を使用しますFractionalRationalInteger

Prelude> (1 :: Integer) `div` (2 :: Integer)
0
Prelude> :m + Data.Ratio
Prelude Data.Ratio> (1 :: Rational) / (2 :: Rational)
1 % 2
于 2013-01-24T01:32:10.013 に答える
4

一部の言語とは異なり、/は整数で動作するようにオーバーロードされていません。これは理にかなっています。整数の「除算」は有理除算と同じではありません。ハスケルで

(/) :: Fractional a => a -> a -> a

しかし、私が言ったように、それがあなたが得る理由でIntegerはありませんFractional

No instance for (Fractional Integer)

代わりに、整数除算を実行するquotまたは関数を使用できます。div

于 2013-01-24T01:34:38.323 に答える