【问题标题】:Haskell ambiguous typeHaskell 模糊类型
【发布时间】: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


【解决方案1】:

当您在预期为浮点值的地方使用整数值时,您会收到类似的错误消息(反之亦然)。

在这种情况下,问题是您在num 上调用sqrt,它以浮点值作为参数,使编译器认为num 是浮点值。但也可以使用num 作为n 的上限,这是一个整数值列表(因为它被用作findMult 的参数,它需要一个整数值列表)。

所以在调用sqrtnum 之前调用fromIntegral 就可以了,像这样:

x = ceiling (sqrt (fromIntegral num))

【讨论】:

    【解决方案2】:

    您可以将所有平方都取到极限,而不是取平方根。

    -- instead of
    {- x = ceiling (sqrt num)
       nsqrt = [2..x] -}
    -- avoid sqrt
    nsqrt = takeWhile (\x -> (x-1)^2 < num) [2..]
    -- or even avoid multiplication altogether
    nsqrt = map fst . takeWhile ((< num) . snd) . zip [2..] $ scanl1 (+) [1,3..]
    

    【讨论】:

      猜你喜欢
      • 2012-12-03
      • 2019-04-22
      • 2016-08-23
      • 1970-01-01
      • 2016-03-31
      • 2015-02-11
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多