我有GHCi,版本7.8.3。我想计算sqrt项的总和,它们可以被10整除。
如果我写[ x | x <- [10..100], x `mod` 10 == 0]
或sum [sqrt x | x <- [10..100]]
是正确的。
但是如果我在显示错误时写sum [ sqrt x | x <- [10..100], x `mod` 10 == 0]
:
'<interactive>:39:1:
No instance for (Show t0) arising from a use of ‘print’
The type variable ‘t0’ 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 (GHC.Real.Ratio a)
-- Defined in ‘GHC.Real’
...plus 23 others
In a stmt of an interactive GHCi command: print it'
如何更改命令,该程序是否正确?
答案 0 :(得分:5)
问题来自以下事实:当您使用mod
时,数字的类型必须为Integral a => a
,而当您使用sqrt
时,数字的类型必须为{{} 1}}。 GHC不知道哪种类型适合这两种约束,尽管因为您在GHCi中执行它,无论出于何种原因,错误消息都是无用的。错误消息是这样的,因为GHCi使用调用Floating a => a
的{{1}},并且出于某种原因,这是第一个被检查的约束。由于没有包含约束print
,show
和Show
的类型,因此它不会进行类型检查。
您的另外两个示例是类型检查,因为它们只使用Integral
或Floating
中的一个。在应用mod
之前,您可以使用sqrt
将两者的组合工作:
fromIntegral