2010-10-19 58 views
8

下面的程序产生在ghci中的错误:从字面1' at fromInteger.hs:17:16
Possible fix: add an instance declaration for (Monoid Integer)
In the pattern: 1
In the definition of
产生
否实例(含半幺群整数)
如何在Haskell中使用fromInteger而不隐含前奏?

{-# 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':fromInteger 1 = one

如何解决这个问题,使1可以转换为va lue one为Monoid?所有其他整数在应用于(Monoid a) => fromInteger时可能(或应该)产生Prelude.undefined

请注意,我是Haskell专家的对面,所以如果答案很明显,请原谅我。

回答

7

问题在于(使用NoImplitPrelude),只能对范围中存在fromInteger函数的类型使用整数文字。

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

为了解决这个问题,你可以创建另一个模块来导入前奏并定义integerOne :: Integer = 1

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

fromInteger x | x == integerOne = one