8

以下程序在 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) 没有
由文字 fromInteger' 产生的实例:fromInteger 1 = one 1' at fromInteger.hs:17:16
Possible fix: add an instance declaration for (Monoid Integer)
In the pattern: 1
In the definition of

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

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

4

1 回答 1

7

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

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

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

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

fromInteger x | x == integerOne = one
于 2010-10-19T14:40:00.057 回答