以下程序在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:
没有实例(Monoid Integer)
来自文字1' at fromInteger.hs:17:16
fromInteger':fromInteger 1 = one
Possible fix: add an instance declaration for (Monoid Integer)
In the pattern: 1
In the definition of
如何修复它以便1可以转换为Monoids的值one
?所有其他整数在应用于Prelude.undefined
时可能(或应该)产生(Monoid a) => fromInteger
。
请注意我与Haskell的专家相反,所以请原谅我,以防答案显而易见。
答案 0 :(得分:7)
问题是(使用NoImplitPrelude)你只能对范围内有fromInteger
函数的类型使用整数文字。
因此,在您的代码中,您只能使用整数文字来表示Monoid
的实例,因为在您的代码中,Integer
不是Monoid
的实例,您无法使用文字1
代表整数1。
要解决此问题,您可以创建另一个模块,该模块会导入前奏并定义integerOne :: Integer = 1
。
然后,您可以将fromInteger
功能定义为:
fromInteger x | x == integerOne = one