Haskell中整数到双精度的转换
我想在一年内实现复合增长,但我不在乎小数点,所以我尝试了Haskell中整数到双精度的转换,haskell,numbers,Haskell,Numbers,我想在一年内实现复合增长,但我不在乎小数点,所以我尝试了 take 52 $ iterate (floor . (*1.1)) 100 问题是(floor(*1.1))的类型是Double->Integer,而iterate的第一个参数所期望的类型是a->a 我尝试了两种方法,但最后把自己弄得一团糟 保持函数应用程序中数值类型一致的首选解决方案是什么?将Int转换为Double的常用方法是使用fromIntegral,其类型为(Integral a,Num b)=>a->b。这意味着它将整数类
take 52 $ iterate (floor . (*1.1)) 100
问题是(floor(*1.1))
的类型是Double->Integer
,而iterate的第一个参数所期望的类型是a->a
我尝试了两种方法,但最后把自己弄得一团糟
保持函数应用程序中数值类型一致的首选解决方案是什么?将
Int
转换为Double
的常用方法是使用fromIntegral
,其类型为(Integral a,Num b)=>a->b
。这意味着它将整数
类型(Int
和整数
)转换为任何数值类型b
,其中Double
就是一个例子
您的案例听起来像是要将Double
转换为Int
,我建议您使用floor
,但您必须确保您的输入是Double
。为此,您可以将fromIntegral
函数用于
取52$iterate(floor.(*1.1).from integral)100
然而,这会给你不准确的结果,因为你在每一步都要截断。我建议你这样做
从整数100中提取52$map floor$iterate(*1.1)$
你不能一直把中间结果四舍五入,希望在最后得到正确的答案。为什么不将楼层
移出迭代
并绘制楼层地图。以52$…
?@Fixnum fair point为例,当我遇到这个问题时,这正是我试图在ghci中运行的东西。我还要补充的是,后一个表达式会稍微快一些,因为from integral
只执行一次,(*1.1)
仍在重复,而floor
只执行必要的次数,虽然可以将map floor
和take 52
转换为一个参数,但等价地写为:take 52。地图楼层。迭代(*1.1)。从整数$100开始