haskell - 为什么这个 Haskell 类型的强制转换不能编译?

标签 haskell casting

呃。以下代码编译失败:

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

抛出以下错误:

  • “(Floating Integer) 没有因使用 `sqrt' 而产生的实例”

请帮忙?我显然不是在摸索 Haskell 强制转换。

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

最佳答案

强烈建议始终使用类型签名 开始设计 Haskell 函数,然后才编写实现。在这种情况下,您可能想要

factorsOf :: Integer -> [(Integer, Integer)]

因此,在 factorsOf n = ... 中,变量 n 的类型为 Integer。这就是问题所在:您试图对整数求平方根,但 sqrt 仅在 float 上定义。所以你需要在取根之前转换成这样的数字。在根之后,您会想要截断回一个整数,但是 floor 已经这样做了。不需要 toInteger

factorsOf :: Integer -> [(Integer, Integer)]
factorsOf n
     = [ (x, n`quot`x)
       | x <- [2 .. floor . sqrt $ fromIntegral n]
       , n `mod` x == 0
       ]

关于haskell - 为什么这个 Haskell 类型的强制转换不能编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53943183/

相关文章:

haskell - 在 Haskell 中创建临时目录

haskell - 按自定义字段对 Hakyll 项目列表进行排序

haskell - 使用 foldr 获取符合条件的第一个项目

haskell - 如何使用 Cabal 将 Haskell 依赖项的版本固定到底层 native 依赖项的版本?

mysql - 无法转换变量 MYSQL

haskell - 使用 wxhaskell 绘制缩放位图

c# - 无法在泛型方法中将类型更改为可为空

c++ - 如何正确地将 time_t 转换为 long int?

Swift 转换导致应用程序崩溃

C# 将数组类型的对象转换为 T,其中 T 是数组?