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