【问题标题】:Haskell why does "Num x" require "Show x"?Haskell为什么“Num x”需要“Show x”?
【发布时间】:2013-10-11 21:49:46
【问题描述】:

最近我看了一下 Haskell,使用 LYAH

我在搞乱类型类并编写了这个快速测试函数:

foo :: (Num x) => x -> String
foo x = show x ++ "!"

但这会产生这个错误:

test.hs:2:9:
    Could not deduce (Show x) arising from a use of `show'
    from the context (Num x)
    bound by the type signature for foo :: Num x => x -> String
    at test.hs:1:8-29
    Possible fix:
      add (Show x) to the context of
        the type signature for foo :: Num x => x -> String

但根据 LYAH 的说法:

要加入 Num,类型必须已经是 Show 和 Eq 的朋友。

如果Num 中的所有内容都是ShowEq 的子集,为什么我需要将类型签名更改为foo :: (Num x, Show x) => x -> String 才能正常工作?难道不应该可以推断出Num 也可以显示吗?

【问题讨论】:

    标签: haskell


    【解决方案1】:

    LYAH 中的信息是旧的。 release notes for GHC 7.4.1 说:

    Num 类不再有 Eq 或 Show 超类。

    你需要写,

    foo :: (Num x, Show x) => x -> String
    

    (实际上,您写的foo 不需要Num x,因此您可以省略它以避免不必要的约束。)

    【讨论】:

    • 那么Num 的哪些子类没有EqShow 了?我没有看到任何获得这些的清单(或者实际上为什么它被改变了。)
    • 以前是class (Eq a, Show a) => Num a where {...},现在是class Num a where {...}。没有必要将 EqShow 作为超类:Num 实例并不意味着其中任何一个类的实例(如 Ord 意味着 Eq),也不依赖于它们( Num 没有法律,其“方法”的默认定义不引用 EqShow)。我认为这就是为什么Num 成为一个独立类的原因。更少的要求意味着该类允许更多的实例,例如Num b => Num (a -> b)
    • 重要的是要注意这是一个 GHC 更改; Haskell 标准仍然需要ShowEq 超类。严格来说,这使得 GHC 成为一个不符合 Haskell 的编译器;但是,无论如何,这种变化很可能会进入下一个标准,就像很快Applicative 将成为Monad 的超类一样。
    【解决方案2】:

    used to beNum 的实例也是 ShowEq 的实例,但那是 no longer the case

    您还需要添加 Show 约束。

    【讨论】:

      【解决方案3】:

      Haskell,982010 都要求 Num 的所有实例也是 Show 和 Eq 上的实例。这在很大程度上是历史的偶然。

      GHC 是最流行的 Haskell 编译器,它与这里的标准不同,不需要任何 pragma。这样做是为了让应用函子成为 Num 的实例并享受重载语法的好处。

      【讨论】:

        【解决方案4】:

        你不应该写吗:

        (Num x) => x -> String
        

        代替

        (Num x) x -> String
        

        据我所知,这种继承至少已经过时了。

        【讨论】:

          猜你喜欢
          • 2011-04-14
          • 2011-01-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多