如何理解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>
答案 0 :(得分:5)
这种类型错误信息有点不友好,我想。
这里实际发生的是你的表达式有类型
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
Integer
或Double
。但它们都不适合这里,每个都只是其中一个类Integral
和Fractional
的成员。
然后,在默认失败后,GHCi会给出一条错误消息,告诉您一个它无法满足的约束。特别令人困惑的是,碰巧选择与失败原因无关的那个......
无论如何,为了解决你的问题:%
不是分割两个有理数的函数,它是从类似整数的分子和分母构造一个有理数的函数。要改为划分,请使用
4.3 / 1.2 :: Rational
:: Rational
告诉GHCi你想要一个理性的(而不是它本来会选择的默认Double
),并且浮点符号 可以创建一个{ {1}} - 它是Rational
类型类提供的功能之一。