【问题标题】:How to use fromInteger with no implicit prelude in Haskell?如何在 Haskell 中使用没有隐含前奏的 fromInteger?
【发布时间】:2010-10-19 14:29:37
【问题描述】:

以下程序在 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

即:

来自Integer.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 = one

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

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

【问题讨论】:

    标签: haskell ghc


    【解决方案1】:

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

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

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

    然后您可以将fromInteger 函数定义为:

    fromInteger x | x == integerOne = one
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-13
      • 1970-01-01
      相关资源
      最近更新 更多