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

eDr*_*n55 4 haskell list-comprehension list

我有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'
Run Code Online (Sandbox Code Playgroud)

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

bhe*_*ilr 5

问题来自这样一个事实:当你使用时mod,数字的类型必须是Integral a => a,当你使用sqrt数字的类型必须是Floating a => a.GHC不知道哪种类型适合这两种约束,尽管因为你在GHCi中执行它,无论出于何种原因,错误消息都是无用的.错误消息是这样的,因为GHCi使用print,调用show,并且由于某种原因,这是第一个被检查的约束.由于没有类型的约束Show,Integral以及Floating,它不会键入检查.

你的另外两个例子是类型检查,因为它们只使用mod或中的一个sqrt.fromIntegral在申请之前,您可以将两者的组合使用sqrt:

sum [sqrt $ fromIntegral x | x <- [10..100], x `mod` 10 == 0]
Run Code Online (Sandbox Code Playgroud)