首页 > 解决方案 > 为什么这个 Haskell 类型的强制不能编译?

问题描述

啊。以下代码无法编译:

factorsOf number = [(x, quot number x) | x <- [2..toInteger $ floor $ sqrt number], number `mod` x == 0]

抛出以下错误:

请帮忙?我显然没有理解 Haskell 强制。

PS:离开toInteger编译但在运行时引发类型歧义错误。

标签: haskellcasting

解决方案


强烈建议始终使用类型签名开始设计 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
       ]

推荐阅读