为什么此Haskell类型的强制转换无法编译?

时间:2018-12-27 10:05:05

标签: haskell casting

U。以下代码无法编译:

allprojects {
        repositories {
            jcenter()
            maven {
                url "https://maven.google.com"
            }
        }
    }

引发以下错误:

  • “没有因使用'sqrt'而引起的(Floating Integer)实例”

请帮助?我显然不是在嘲笑Haskell的强制力。

PS:放弃factorsOf number = [(x, quot number x) | x <- [2..toInteger $ floor $ sqrt number], number `mod` x == 0] 进行编译,但在运行时引发类型歧义错误。

1 个答案:

答案 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
       ]