gpt4 book ai didi

haskell - Haskell 中的实例声明

转载 作者:行者123 更新时间:2023-12-02 16:55:21 24 4
gpt4 key购买 nike

我有这两个功能:

primes = sieve [2..] 
where
sieve (p:xs) = p : sieve [x|x <- xs, x `mod` p > 0]
isPrime number = number /= 1 && null [x | x <- takeWhile (\x -> x < (ceiling . sqrt) number) primes, mod number x == 0]

问题是,当我尝试加载包含这些函数的模块时,我看到以下错误消息:

[2 of 2] Compiling Main             ( euler37.hs, interpreted )

euler37.hs:6:70:
No instance for (RealFrac Int)
arising from a use of `ceiling'
Possible fix: add an instance declaration for (RealFrac Int)
In the first argument of `(.)', namely `ceiling'
In the expression: ceiling . sqrt
In the second argument of `(<)', namely `(ceiling . sqrt) number'

euler37.hs:6:80:
No instance for (Floating Int)
arising from a use of `sqrt'
Possible fix: add an instance declaration for (Floating Int)
In the second argument of `(.)', namely `sqrt'
In the expression: ceiling . sqrt
In the second argument of `(<)', namely `(ceiling . sqrt) number'

我真的不明白问题出在哪里,因为当我试图从一段代码中创建一个小函数时,据我所知,这会导致这些错误,就在 ghci 中,就像 让 f 数字 x = x < (ceiling . sqrt) 数字我没有看到任何错误消息。

最佳答案

问题是 primes是一个整数列表(由于您使用了 mod ),但是 sqrt对 float 进行运算。如果你这样做x < (ceiling . sqrt . fromIntegral) number ,然后就可以正常工作了。 fromIntegral只是将整数转换为任何其他数字类型:

fromIntegral :: (Integral a, Num b) => a -> b

在这种情况下,由于您没有指定要转换为的任何特定浮点类型,因此它将默认使用 Double 值来计算平方根。您可以通过更改 fromIntegral 来指定其他类型类似 (fromIntegral :: Integer -> Float) .

您在 GHCi 中没有看到此错误的原因是您的条件很好;它只是适用于与您在这里使用的类型不同的类型。仅单独验证一段代码是否正确是不够的。为了让它通过类型检查器,它也必须在上下文中有意义。

您可能需要考虑使用 integer square root algorithm为了准确性。

关于haskell - Haskell 中的实例声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9114439/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com