2010-10-19 55 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