【发布时间】:2011-02-10 21:44:02
【问题描述】:
findMult lst n = [x | x <- lst, x `mod` n == 0]
primes num =
let n = [2..num]
x = ceiling (sqrt num)
nsqrt = [2..x]
not_prime = map (findMult n) nsqrt
in diff2 n (concat not_prime)
当我尝试运行它时遇到以下问题
<interactive>:1:0:
Ambiguous type variable `t' in the constraints:
`RealFrac t' arising from a use of `primes' at <interactive>:1:0-8
`Floating t' arising from a use of `primes' at <interactive>:1:0-8
`Integral t' arising from a use of `primes' at <interactive>:1:0-8
Probable fix: add a type signature that fixes these type variable(s)
我尝试使用 fromIntegral,但我认为我没有正确使用,因为这会给我带来编译错误。请帮忙。
这样做的目的是找到直到 num 的所有素数。
【问题讨论】:
-
我认为
num应该是Integral? -
尝试告诉编译器类型是什么,这样它就不必猜测了。给出您期望的类型签名,然后查看是否有错误消息。这里的问题是,我认为你的目的是笼统的;没有明确说明你想要什么。
-
@Robert:鉴于 Floating 和 Integral 不太可能被同一类型实例化,我会说他太矛盾了,不太笼统。作为一般人通常不是问题。此外,除了单态限制之外,标准 Haskell 代码不会因为您遗漏了类型注释而中断。
-
@sepp2k:没有类型注释的正确代码将编译并正常工作,是的,但是如果您没有任何类型注释,错误代码产生的错误可能会更加混乱。
-
@John:是的,但 Robert 听起来好像缺少类型声明会导致错误(或者至少我是这样读的),我只是想澄清事实并非如此.
标签: haskell types primes ambiguous