如何在Haskell中使用fromInteger而不使用隐式前奏?
以下程序在ghci中产生错误:如何在Haskell中使用fromInteger而不使用隐式前奏?,haskell,ghc,Haskell,Ghc,以下程序在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 on
{-# 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.hs:17:16处的文本
1'
可能的修复方法:添加(Monoid Integer)的实例声明
在模式中:1
在
fromInteger的定义中:fromInteger 1=1
我如何修复它,以便1可以转换为幺半群的值one
?当应用于(幺半群a)=>fromInteger时,所有其他整数可能(或应该)产生前奏。未定义的
请注意,我是Haskell的反面专家,因此,如果答案显而易见,请原谅我。问题是(在无implicitprelude的情况下),对于作用域中有fromInteger
函数的类型,您只能使用整数文本
因此,在您的代码中,您只能使用整数文本来表示Monoid
的实例,并且由于在您的代码中,integer
不是Monoid
的实例,因此您不能使用文本1
来表示整数1
要解决此问题,您可以创建另一个模块,该模块导入前奏并定义integerOne::Integer=1
然后,您可以将fromInteger
函数定义为:
fromInteger x | x == integerOne = one