1年複利で増やしたいけど小数点は気にしないのでやってみた
take 52 $ iterate (floor . (*1.1)) 100
問題は、 iterate の最初の引数で期待される型が であるのに対し、 の型(floor . (*1.1))
がであるということです。Double -> Integer
a -> a
私はいくつかのアプローチを試みましたが、結び目で自分自身を結ぶことになりました.
関数の適用全体で数値型の一貫性を維持するための推奨される解決策は何ですか?
Int
anを aに変換する通常の方法は、型を持つDouble
を使用することです。これは、型 ( and ) を任意の数値型(インスタンスである) に変換することを意味します。fromIntegral
(Integral a, Num b) => a -> b
Integral
Int
Integer
b
Double
あなたのケースは、私が推奨する aDouble
をに変換したいように聞こえますが、入力が であることを確認する必要があります。このために、次の関数を使用できますInt
floor
Double
fromIntegral
take 52 $ iterate (floor . (* 1.1) . fromIntegral) 100
ただし、各ステップで切り捨てを行っているため、不正確な結果が得られます。私はすることをお勧めします
take 52 $ map floor $ iterate (* 1.1) $ fromIntegral 100