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
,出于某种原因,这是第一个被检查的约束。由于不存在具有约束 Show
、Integral
和 Floating
的类型,因此不进行类型检查。
您的其他两个示例进行了类型检查,因为它们仅使用了 mod
或 sqrt
之一。在应用 sqrt
:
之前,您可以使用 fromIntegral
将两者结合使用
sum [sqrt $ fromIntegral x | x <- [10..100], x `mod` 10 == 0]
我有 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
,出于某种原因,这是第一个被检查的约束。由于不存在具有约束 Show
、Integral
和 Floating
的类型,因此不进行类型检查。
您的其他两个示例进行了类型检查,因为它们仅使用了 mod
或 sqrt
之一。在应用 sqrt
:
fromIntegral
将两者结合使用
sum [sqrt $ fromIntegral x | x <- [10..100], x `mod` 10 == 0]