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

Haskell list comprehension (print sqrt for element of list)

我有 GHCi,版本 7.8.3。我想计算可被 10 整除的 sqrt 项目的总和。

如果我写[ 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'

如何更改命令,正确的程序?

问题出在当你使用mod时,数字的类型必须是Integral a => a,而当你使用sqrt时,数字的类型必须是Floating a => a。 GHC 知道没有符合这两个约束的类型,尽管因为你在 GHCi 中执行它,无论出于何种原因,错误消息大多是无用的。错误消息是这样的,因为 GHCi 使用 print,调用 show,出于某种原因,这是第一个被检查的约束。由于不存在具有约束 ShowIntegralFloating 的类型,因此不进行类型检查。

您的其他两个示例进行了类型检查,因为它们仅使用了 modsqrt 之一。在应用 sqrt:

之前,您可以使用 fromIntegral 将两者结合使用
sum [sqrt $ fromIntegral x | x <- [10..100], x `mod` 10 == 0]