haskell - 为什么这个 Haskell 类型的强制不能编译?
问题描述
啊。以下代码无法编译:
factorsOf number = [(x, quot number x) | x <- [2..toInteger $ floor $ sqrt number], number `mod` x == 0]
抛出以下错误:
- “没有因使用 `sqrt' 而产生 (Floating Integer) 的实例”
请帮忙?我显然没有理解 Haskell 强制。
PS:离开toInteger
编译但在运行时引发类型歧义错误。
解决方案
强烈建议始终使用类型签名开始设计 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
]
推荐阅读
- regex - Oracle 中 regexp_like 的匹配模式以有条件地包含一组字符
- vb.net - 如何获取对象的完整类型名称
- jquery - 数据表日期范围过滤功能与搜索框过滤器冲突
- c - 从 C/C++ 访问 SVN 存储库,例如从 SVN 读取对象、它们的版本 nbrs 等
- python - 如何在 Django ORM 中使用 Annotate 和 SUM 返回 Queryset?
- python - 有没有办法从随机森林模型中提取树深度?
- drupal - Drupal 7:视图中的硬编码布局
- c# - RadDataGrid 中没有填写数据
- oauth-2.0 - 监控到达 Keycloak 服务器的请求的方法
- reactjs - React mui自动完成选择不显示价值