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

Mar*_*arc 8 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
    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 = 1 1' 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专家的反面,所以请原谅我,以防答案显而易见.

sep*_*p2k 7

问题是(使用NoImplitPrelude),您只能fromInteger对范围内有函数的类型使用整数文字.

因此,在您的代码中,您只能使用整数文字来表示Monoid代码中的实例,因为在代码中,Integer不是实例Monoid,您不能使用文字1来表示Integer 1.

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

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

fromInteger x | x == integerOne = one
Run Code Online (Sandbox Code Playgroud)