31

1年複利で増やしたいけど小数点は気にしないのでやってみた

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

問題は、 iterate の最初の引数で期待される型が であるのに対し、 の型(floor . (*1.1))がであるということです。Double -> Integera -> a

私はいくつかのアプローチを試みましたが、結び目で自分自身を結ぶことになりました.

関数の適用全体で数値型の一貫性を維持するための推奨される解決策は何ですか?

4

1 に答える 1

38

Intanを aに変換する通常の方法は、型を持つDoubleを使用することです。これは、型 ( and ) を任意の数値型(インスタンスである) に変換することを意味します。fromIntegral(Integral a, Num b) => a -> bIntegralIntIntegerbDouble

あなたのケースは、私が推奨する aDoubleをに変換したいように聞こえますが、入力が であることを確認する必要があります。このために、次の関数を使用できますIntfloorDoublefromIntegral

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

ただし、各ステップで切り捨てを行っているため、不正確な結果が得られます。私はすることをお勧めします

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