31

我想在一年内实现复合增长,但我不在乎小数点,所以我尝试了

take 52 $ iterate (floor . (*1.1)) 100

问题是类型(floor . (*1.1))Double -> Integer,而迭代的第一个参数所期望的类型是a -> a

我尝试了几种方法,但最终把自己打成结。

在函数应用程序中保持数字类型一致的首选解决方案是什么?

4

1 回答 1

38

将 a转换Int为 a的常用方法Double是使用fromIntegral,它的类型为(Integral a, Num b) => a -> b。这意味着它将Integral类型 ( Intand Integer) 转换为任何数字类型b,其中Double的一个实例。

您的情况听起来像是您想将 a 转换为 a DoubleInt我建议floor您这样做,但您必须确保您的输入是 a Double。为此,您可以使用该fromIntegral功能

take 52 $ iterate (floor . (* 1.1) . fromIntegral) 100

但是,这会给您带来不准确的结果,因为您在每一步都进行了截断。我建议做

take 52 $ map floor $ iterate (* 1.1) $ fromIntegral 100
于 2013-08-16T19:46:45.790 回答