Haskell列表理解(列表元素的打印sqrt)

时间:2015-03-17 12:57:25

标签: list haskell list-comprehension

我有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'

如何更改命令,该程序是否正确?

1 个答案:

答案 0 :(得分:5)

问题来自以下事实:当您使用mod时,数字的类型必须为Integral a => a,而当您使用sqrt时,数字的类型必须为{{} 1}}。 GHC不知道哪种类型适合这两种约束,尽管因为您在GHCi中执行它,无论出于何种原因,错误消息都是无用的。错误消息是这样的,因为GHCi使用调用Floating a => a的{​​{1}},并且出于某种原因,这是第一个被检查的约束。由于没有包含约束printshowShow的类型,因此它不会进行类型检查。

您的另外两个示例是类型检查,因为它们只使用IntegralFloating中的一个。在应用mod之前,您可以使用sqrt将两者的组合工作:

fromIntegral