U。以下代码无法编译:
allprojects {
repositories {
jcenter()
maven {
url "https://maven.google.com"
}
}
}
引发以下错误:
请帮助?我显然不是在嘲笑Haskell的强制力。
PS:放弃factorsOf number = [(x, quot number x) | x <- [2..toInteger $ floor $ sqrt number], number `mod` x == 0]
进行编译,但在运行时引发类型歧义错误。
答案 0 :(得分:6)
强烈建议始终以 type签名开始Haskell函数的设计,然后再编写实现。在这种情况下,您可能想要
factorsOf :: Integer -> [(Integer, Integer)]
因此,在factorsOf n = ...
中,变量n
的类型为Integer
。这就是问题所在:您试图获取整数的平方根,但是sqrt
仅在浮点数上定义。因此,您需要先将 转换为这样的数字,然后再取根。在根之后,您将要截断为整数,但是floor
已经做到了。不需要toInteger
。
factorsOf :: Integer -> [(Integer, Integer)]
factorsOf n
= [ (x, n`quot`x)
| x <- [2 .. floor . sqrt $ fromIntegral n]
, n `mod` x == 0
]