我想了一年多的复合增长率,但我不关心小数点,所以我试图转换整数到双哈斯克尔
take 52 $ iterate (floor . (*1.1)) 100
的问题是,(floor . (*1.1))
类型是Double -> Integer
,而类型为迭代的第一个参数的预期值为a -> a
。
我尝试了几种方法,但最终以束缚结束了自己。
保持函数应用程序中数值类型一致的首选解决方案是什么?
我想了一年多的复合增长率,但我不关心小数点,所以我试图转换整数到双哈斯克尔
take 52 $ iterate (floor . (*1.1)) 100
的问题是,(floor . (*1.1))
类型是Double -> Integer
,而类型为迭代的第一个参数的预期值为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
你不能围绕中间结果四舍五入,并希望在最后得到正确的答案。为什么不把'floor'移出'iterate'并做'map floor。拿52 $ ...'? – Fixnum
@Fixnum公平点,当我遇到问题时,这只是我试图用ghci运行的东西。 –