我想在一年内实现复合增长,但我不关心小数点,所以我尝试了
take 52 $ iterate (floor . (*1.1)) 100
问题在于 (floor . (*1.1))
的类型是 Double -> Integer
,而 iterate 函数的第一个参数期望的类型是 a -> a
。我尝试了几种方法,但最终陷入了困境。
如何在函数应用过程中保持数字类型一致?
Int
转换为Double
的方法是使用fromIntegral
函数,它的类型为(Integral a, Num b) => a -> b
。这意味着它将一个Integral
类型(Int
和Integer
)转换为任何数值类型b
,其中Double
是其实例之一。Double
转换为Int
,我建议使用floor
,但您必须确保输入是一个Double
。为此,您可以使用fromIntegral
函数。take 52 $ iterate (floor . (* 1.1) . fromIntegral) 100
然而,这会给你不准确的结果,因为你在每一步都进行了截断。我建议这样做:
然而,这样做会导致结果不准确,因为在每一步都进行截断。我建议进行以下操作:
take 52 $ map floor $ iterate (* 1.1) $ fromIntegral 100
fromIntegral
只执行一次,(* 1.1)
仍然重复,而floor
只执行必要的次数,尽管可以提出一个论点来转置map floor
和take 52
。 - bheklilrtake 52 . map floor . iterate (* 1.1) . fromIntegral $ 100
- Davorak
floor
移出iterate
,并使用map floor . take 52 $ ...
? - Fixnum