如何在Haskell中使用fromInteger而不使用隐式前奏?

如何在Haskell中使用fromInteger而不使用隐式前奏?,haskell,ghc,Haskell,Ghc,以下程序在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 on

以下程序在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.hs:17:16处的文本
1'
可能的修复方法:添加(Monoid Integer)的实例声明
在模式中:1
fromInteger的定义中:fromInteger 1=1

我如何修复它,以便1可以转换为幺半群的值
one
?当应用于
(幺半群a)=>fromInteger时,所有其他整数可能(或应该)产生
前奏。未定义的

请注意,我是Haskell的反面专家,因此,如果答案显而易见,请原谅我。

问题是(在无implicitprelude的情况下),对于作用域中有
fromInteger
函数的类型,您只能使用整数文本

因此,在您的代码中,您只能使用整数文本来表示
Monoid
的实例,并且由于在您的代码中,
integer
不是
Monoid
的实例,因此您不能使用文本
1
来表示整数1

要解决此问题,您可以创建另一个模块,该模块导入前奏并定义
integerOne::Integer=1

然后,您可以将
fromInteger
函数定义为:

fromInteger x | x == integerOne = one