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

时间:2010-10-19 14:29:37

标签: 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

即:

  

fromInteger.hs:17:16:
     没有实例(Monoid Integer)
       来自文字1' at fromInteger.hs:17:16
Possible fix: add an instance declaration for (Monoid Integer)
In the pattern: 1
In the definition of
fromInteger':fromInteger 1 = one

如何修复它以便1可以转换为Monoids的值one?所有其他整数在应用于Prelude.undefined时可能(或应该)产生(Monoid a) => fromInteger

请注意我与Haskell的专家相反,所以请原谅我,以防答案显而易见。

1 个答案:

答案 0 :(得分:7)

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

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

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

然后,您可以将fromInteger功能定义为:

fromInteger x | x == integerOne = one