1
floor
在Haskell中仅为RealFrac
类型类定义。我不太了解这个类型类,而我的其他代码只使用浮点数。在Haskell中实现浮点数的最佳方式?
我找不到任何功能将Float
投射到Int
。如果有那么floor
将相当于fromIntegral (fromFloating x)
和fract
将被定义为
fract x = x - floor x
然而,正如我说的,我还没有发现,不喜欢什么,我想fromFloating
做任何事情的任何功能。所以这是我能想到的实施fract
的唯一途径:
fract x
| x < 0 = 1 - fract (abs x)
| x < 1 = x
| otherwise = fract (x - 1)
然后当然floor x
将x - fract x
。然而,上面的算法是O(n),它会大幅度减慢速度,所以我希望有一种方法可以做到这一点。
'floor'函数具有以下类型'地板::(RealFrac一个,积分B)=>一 - > B',所以可以将其实例化为一个Float并返回一个Int(https://www.haskell.org/hoogle/?hoogle=floor) – Euge
值得注意的是,Float和Double都是RealFrac的实例,因此您使用的关注点他们而不是使用RealFrac是错位的。 – amalloy
为什么不'fract = snd。 properFraction'? ('fract = \ x - > x - fromIntegral(floor x)'具有正确的类型,几乎可以做你想做的,但对于负数不起作用)。这里完全没有必要将'Float''投射'到'Int'(无论'cast'实际上对你意味着什么)。 – user2407038