gpt4 book ai didi

haskell - 比较整数值和浮点值

转载 作者:行者123 更新时间:2023-12-02 17:28:38 25 4
gpt4 key购买 nike

所以,我正在学习 Haskell,并且经常陷入类型/类型类相关的错误。一些非常明显的愚蠢错误,还有一些让我觉得 haskell 不适合我。无论如何,我有这段代码......

pfactors' ps n
| p > (sqrt n) = []
| m == 0 = p : (pfactors' ps q)
| otherwise = pfactors' (tail ps) n where
p = head ps
(q, m) = divMod n p

pfactors = pfactors' primes

main = print $ pfactors 14

(一些背景知识:pfactors函数应该接受一个数字并返回一个素数列表,这些素数是给定数字的素数因子。primes是一个无限的素数列表)

这给了我这个错误:

p47.hs:10:11:
Ambiguous type variable `a' in the constraints:
`Floating a' arising from a use of `pfactors'' at p47.hs:10:11-26
`Integral a' arising from a use of `primes' at p47.hs:10:21-26
Possible cause: the monomorphism restriction applied to the following:
pfactors :: a -> [a] (bound at p47.hs:10:0)
Probable fix: give these definition(s) an explicit type signature
or use -XNoMonomorphismRestriction

现在我明白这是 p < (sqrt n) 的问题部分,因为它是唯一与 Floating 有关的部分。 。如果我将其更改为 p < n一切正常,我得到了正确的答案。但我真的想检查平方根,那么我该怎么做呢?

顺便说一句,这不是作业,如果感觉像是的话,这是我尝试解决projecteuler.net上的第47个问题

感谢您的帮助。

而且,请不要给我上述项目欧拉问题的解决方案,我想尽可能自己做:)。谢谢。

最佳答案

你的问题是......好吧......你不能比较整数和浮点值:-)你必须明确指示整数和 float 之间的转换。 sqrt::(Floating a) => a -> a 函数适用于 float ,但您主要处理整数,因此您不能免费使用它。尝试这样的事情:

pfactors' ps n
| p > (floor $ sqrt $ fromIntegral n) = []
| m == 0 = p : (pfactors' ps q)
| otherwise = pfactors' (tail ps) n where
p = head ps
(q, m) = divMod n p

在这里,我们使用 fromIntegral::(Integral a, Num b) => a -> b 将整数转换为其他值,允许我们将其用作 的参数开方。然后,我们说 floor 将浮点值转换回整数(请注意,这是向下舍入!)。

其次,我建议养成在顶级声明中添加类型签名的习惯。它不仅能让您更好地掌握语言,而且如果您不这样做,您可能会违反monomorphism restriction .

关于haskell - 比较整数值和浮点值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4415303/

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