レコードタイプを使用して、出力をより明確にすることができます。
data Loan = Loan {final :: Double,
rate :: Double,
loan :: Integer,
years :: Int}
deriving Show
printloans :: [Loan] -> IO()
printloans = mapM_ print
printloans loans
またはprintloans loans'
ghciプロンプトで使用します。
編集:の定義を含めるのを忘れましたdp
。これは、指定された小数点以下の桁数に丸めるためのものです。
dp :: Int -> Double -> Double
n `dp` a = (/ 10.0^n).fromInteger.round.(* 10.0^n) $ a
リストを直接使用する方法は次のとおりです。
loans = [Loan {final = (2 `dp`) $ fromInteger amt*(1+ir)^yrs,
rate = ir,
loan = amt,
years = yrs}
| ir <- [0.005*x | x <- [4..10]],
amt <- [1000*x | x <- [1..3]],
yrs <- [1..4]
]
ただし、モナディックスタイルが好きな場合は、次を使用できます。
loans' = do
ir <- [0.005*x | x <- [4..10]]
amt <- [1000*x | x <- [1..3]]
yrs <- [1..4]
return Loan {final = (2 `dp`) $ fromInteger amt*(1+ir)^yrs,
rate = ir,
loan = amt,
years = yrs}
これはコンマが少ないという利点があり、<-
行の順序を変更して回答の順序を変更する方が簡単です。レコードにエクストラを追加してLoan
、それらを使用して計算できます。次のような出力が得られます。
*Main> printloans loans'
Loan {final = 1020.0, rate = 2.0e-2, loan = 1000, years = 1}
Loan {final = 1040.4, rate = 2.0e-2, loan = 1000, years = 2}
Loan {final = 1061.21, rate = 2.0e-2, loan = 1000, years = 3}
Loan {final = 1082.43, rate = 2.0e-2, loan = 1000, years = 4}
Loan {final = 2040.0, rate = 2.0e-2, loan = 2000, years = 1}
Loan {final = 2080.8, rate = 2.0e-2, loan = 2000, years = 2}
...
...
編集:
あなたは他の場所であなたがのような出力が欲しいと私に言いましたir_5% yrs_3 amt_4000 tot_4360.5
。それは醜いですが、これがそのようなことをする方法です:
loans'' = do
ir <- [0.005*x | x <- [4..10]]
amt <- [1000*x | x <- [1..3]]
yrs <- [1..4]
let final = (2 `dp`) $ fromInteger amt*(1+ir)^yrs
return $ "final_" ++ show final
++ ", ir_" ++ show ((2 `dp`) $ ir*100.0) -- rounded away a rounding error in 3.5%
++ "%, amt_" ++ show amt
++ ", yrs_" ++ show yrs
あなたがするときあなたはmapM_ putStrLn loans''
次のような出力を得る
final_1020.0, ir_2.0%, amt_1000, yrs_1
final_1040.4, ir_2.0%, amt_1000, yrs_2
final_1061.21, ir_2.0%, amt_1000, yrs_3
final_1082.43, ir_2.0%, amt_1000, yrs_4
final_2040.0, ir_2.0%, amt_2000, yrs_1
....
しかし、レコードタイプの方がはるかに優れていると思います。出力が読みやすく、文字列をいじることが少なくなります。