2010-10-19 2 views
8

Следующая программа дает ошибку в GHCI:Как использовать fromInteger без подразумеваемой прелюдии в 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 

А именно:

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 = один

Как исправить это, lue one для моноидов? Все остальные целые числа могут (или должны) давать Prelude.undefined при применении к (Monoid a) => fromInteger.

Обратите внимание, что я являюсь противоположностью эксперта Хаскелу, поэтому, пожалуйста, простите меня, если ответ будет очевиден.

ответ

7

Проблема в том, что (с NoImplitPrelude) вы можете использовать только целые литералы для типов, для которых существует функция fromInteger.

Так что в вашем коде вы можете использовать только целые литералы представляют экземпляры Monoid и с тех пор в вашем коде, Integer не является экземпляром Monoid, вы не можете использовать буквальный 1 для представления Integer 1.

Чтобы исправить это, вы можете создать еще один модуль, который импортирует прелюдию и определяет integerOne :: Integer = 1.

Вы могли бы определить свою fromInteger функцию:

fromInteger x | x == integerOne = one 
Смежные вопросы