8

次のプログラムでは、ghci でエラーが発生します。

{-# LANGUAGE NoImplicitPrelude #-}

import Prelude (Integer, Bool)
import qualified Prelude

class Discrete a where
    (==) :: a -> a -> Bool

instance Discrete Integer where
    (==) = (Prelude.==)

class Monoid a where
    one :: a
    (*) :: a -> a -> a

    fromInteger :: Integer -> a
    fromInteger 1 = one

すなわち:

fromInteger.hs:17:16: リテラル fromInteger から生じる
(Monoid Integer) のインスタンスはありません': fromInteger 1 = one
1' at fromInteger.hs:17:16
Possible fix: add an instance declaration for (Monoid Integer)
In the pattern: 1
In the definition of

one1をモノイドの値に変換できるようにするにはどうすればよいですか? Prelude.undefined他のすべての整数は、 に適用されたときに生成される可能性があります (または生成されるべきです) (Monoid a) => fromInteger

私はHaskellの専門家とは正反対なので、答えが明らかな場合はご容赦ください。

4

1 に答える 1

7

fromInteger問題は、(NoImplitPrelude を使用すると)スコープ内に関数がある型に対してのみ整数リテラルを使用できることです。

したがって、コードでは、 のインスタンスを表すためにのみ整数リテラルを使用できMonoidます。 コードでIntegerは は のインスタンスではMonoidないため、リテラル1を使用して整数 1 を表すことはできません。

これを修正するには、プレリュードをインポートして定義する別のモジュールを作成できますintegerOne :: Integer = 1

fromInteger次に、関数を次のように定義できます。

fromInteger x | x == integerOne = one
于 2010-10-19T14:40:00.057 に答える