我想做像:
x `mod` 1.0 == 0 // => int
但似乎mod仅适用于int ... help! 编辑: 我想检查给定的数字是否为三角形,http://en.wikipedia.org/wiki/Triangle_number所以我的想法是检查n1是否为Int ...
(n *(n + 1))/ 2 = s => n1 =( - 1 + sqrt(1 + 787-8))/ 2
答案 0 :(得分:7)
要确定某个Float
或Double
是否与Haskell中的Integer
无法区分,请同时使用floor
和ceiling
。类似的东西:
if floor n == ceiling n
then "It was some integer."
else "It's between integers."
可能还有一些奇特的东西可以用浮点数表示二进制,由RealFloat类型类公开:
http://hackage.haskell.org/packages/archive/base/latest/doc/html/Prelude.html#t%3ARealFloat
答案 1 :(得分:2)
检查数字是否为三角形的更好方法是生成三角数列表,然后查看您的候选人是否在其中。由于这是一个学习问题,我将给出提示而不是答案。
使用列表推导生成三角形数字。
因为它们是有序的,你可以知道你是否已经过去了。
如果您使用大数字,另一种方法是使用二进制搜索来缩小可能会导致候选人的行数。
答案 2 :(得分:0)
总编辑:
好的,我仍然不确定你在这里要做什么。
Data.Fixed
对非整数值的确有一个mod'
函数。mod
和sqrt
操作,则必须在适当的类型之间手动转换。 fromIntegral
会将任何整数类型转换为任意数字类型,floor
,ceiling
和round
会将小数类型转换为整数类型。