2010-10-19 17 views
8

Le programme suivant donne une erreur dans ghci:Comment utiliser fromInteger sans prélude implicite dans Haskell?

{-# 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 

savoir:

fromInteger.hs: 17: 16:
Aucun cas de (Monoid entier)
résultant de l'1' at fromInteger.hs:17:16
Possible fix: add an instance declaration for (Monoid Integer)
In the pattern: 1
In the definition of
littéral fromInteger ': fromInteger 1 = one

Comment puis-je le réparer afin que 1 puisse être converti one pour les monoïdes? Tous les autres entiers peuvent (ou devraient) donner Prelude.undefined lorsqu'ils sont appliqués à (Monoid a) => fromInteger.

S'il vous plaît être conscient que je suis le contraire d'un expert à Haskell alors s'il vous plaît pardonnez-moi au cas où la réponse est évidente.

Répondre

7

Le problème est que (avec NoImplitPrelude) vous ne pouvez utiliser des littéraux entiers que pour les types pour lesquels une fonction fromInteger est incluse.

Donc, dans votre code, vous ne pouvez utiliser les littéraux entiers pour représenter les instances de Monoid et depuis votre code, Integer n'est pas une instance de Monoid, vous ne pouvez pas utiliser le 1 littéral pour représenter le nombre entier 1.

Pour résoudre ce problème, vous pouvez créer un autre module qui importera le prélude et définira integerOne :: Integer = 1.

Vous pouvez ensuite définir votre fonction fromInteger comme:

fromInteger x | x == integerOne = one