以下程序在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:
没有实例()
产生于文字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= one
我如何修复它,使1可以转换为值one的Monoids?当应用于Prelude.undefined时,所有其他整数都可能(或应该)生成(Monoid a) => fromInteger。
请注意,我是一个相反的专家哈斯克尔,所以请原谅我,如果答案是显而易见的。
发布于 2010-10-19 14:40:00
问题是(使用NoImplitPrelude),您只能对作用域中有fromInteger函数的类型使用整数字面值。
因此,在您的代码中,您只能使用整数字面值来表示Monoid的实例,因为在您的代码中,Integer不是Monoid的实例,所以不能使用文字1来表示integer 1。
要解决这个问题,您可以创建另一个模块,它导入前奏并定义integerOne :: Integer = 1。
然后,您可以将fromInteger函数定义为:
fromInteger x | x == integerOne = onehttps://stackoverflow.com/questions/3969413
复制相似问题