繁体   English   中英

如何理解Haskell的“1.2%3.4”的错误消息?

[英]How to understand error messages for “1.2 % 3.4” for Haskell?

如何理解Haskell的“1.2%3.4”的错误消息?

Prelude> :m +Data.Ratio
Prelude Data.Ratio> 4.3 % 1.2

<interactive>:11:1:
    No instance for (Show a0) arising from a use of ‘print’
    The type variable ‘a0’ is ambiguous
    Note: there are several potential instances:
      instance Show Double -- Defined in ‘GHC.Float’
      instance Show Float -- Defined in ‘GHC.Float’
      instance (Integral a, Show a) => Show (Ratio a)
        -- Defined in ‘GHC.Real’
      ...plus 23 others
    In a stmt of an interactive GHCi command: print it
Prelude Data.Ratio> 

我想,这种类型的错误信息有点不友好。

这里实际发生的是你的表达式有类型

Prelude Data.Ratio> :t 4.3 % 1.2
4.3 % 1.2 :: (Integral a, Fractional a) => Ratio a

Integral a表示类型a必须是整数类,而Fractional a表示它必须是浮点或类似理论。 标准Haskell中没有类型都是。

在评估此表达式以进行打印时,GHCi首先推断其类型,并提供需要打印的附加限制:

(Integral a, Fractional a, Show a) => Ratio a

现在由于评估仍然过于模糊,GHCi尝试将a 默认IntegerDouble 但它们都不适合这里,每个都只是IntegralFractional类中的一个。

然后,在默认失败后,GHCi会给出一条错误消息,告诉您它无法满足的约束条件之一 特别令人困惑的是,碰巧选择与失败原因无关的那个......

无论如何,要解决你的问题: % 不是划分两个有理数的函数,它是从类似整数的分子和分母构造一个有理数的函数。 要改为划分它们,请使用

4.3 / 1.2 :: Rational

:: Rational告诉GHCi你想要一个有理的(而不是它本来会选择的默认的Double ),并且浮点符号确实可以构成一个Rational - 它是Fractional类型类提供的特性之一。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM