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)
如何更改命令,该程序是否正确?
问题来自这样一个事实:当你使用时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)