[英]Why won't this Haskell type coercion compile?
啊。 以下代码无法编译:
factorsOf number = [(x, quot number x) | x <- [2..toInteger $ floor $ sqrt number], number `mod` x == 0]
引发以下错误:
请帮忙? 我显然不是在嘲笑Haskell的强制。
PS:离开toInteger
编译,但在运行时引发类型歧义错误。
强烈建议始终以类型签名开始设计Haskell函数,然后再编写实现。 在这种情况下,您可能想要
factorsOf :: Integer -> [(Integer, Integer)]
因此,在factorsOf n = ...
,变量n
将具有Integer
类型。 这就是问题所在:您试图获取整数的sqrt
,但sqrt
仅在浮点数上定义。 因此,您需要先转换成这样的数字, 然后再取根。 在根之后,您将要截断为整数,但是floor
已经做到了。 toInteger
。
factorsOf :: Integer -> [(Integer, Integer)]
factorsOf n
= [ (x, n`quot`x)
| x <- [2 .. floor . sqrt $ fromIntegral n]
, n `mod` x == 0
]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.