金融工学の計算(1)〜ディスカウントファクター(DF):Haskell編その2
前回のエントリーでは、DFを求める以前に、Haskellの引数の扱い方でてこずってしまったので、「引数とってみました」までしか行きませんでした。
df_args.hs
import System main :: IO () main = do args <- getArgs putStrLn $ concat args
すると、こんなコメントをいただきました。
main = putStrLn . unwords =<< getArgs
なるほど、確かにやりたいことはこれ、ですね。一応この本で、これがモナドと関数合成を使っているのはわかるのですが、まったく思いつきませんでした。オブジェクト脳になってしまっている。。早く関数脳を養いたいです。
さて今回は、その引数を利率r、期間tに分けてみたいと思います。(すごいスローペースですが、Haskell初心者なのであしからず。)
引数を2つの値に分けるのに悩んだのですが、パターンマッチングを使うと簡単に分けることができて、変数に当てはめる(束縛される?)ことができました。
df_args2.hs
import System main :: IO () main = do args <- getArgs putStrLn $ argsStr args argsStr :: [String] -> String argsStr [r,t] = concat ["rate=", r, "&", "term=", t]
実行結果です。
$ runghc df_args2.hs 1.0 2.0 rate=1.0&term=2.0
引数を取るところまでは、前回と同じですが、その後引数を2つに分けて名前をつけています。
argsStr :: [String] -> String argsStr [r,t] = concat ["rate=", r, "&", "term=", t]
関数の型の定義は、Stringのリストを引数に取り、Stringを返す、ということですね。
また、その引数の最初と2番目を、それぞれrとtに束縛しています。(束縛されている?まだよくわかりません。。)
関数の中身ですが、こういうのは、Rubyであれば、
"rate=#{r}&term=#{t}"
とするんでしょうが、Haskellではリストを使う、というのを思い出し、こうしてみました。
簡単なことをするのも、難しい。。知ってれば、もっとうまいやり方もあるんでしょうけどね。
ある程度イディオムに慣れるまでが、壁ですね。
で、Haslellの実装は、Stringのリストを作り、concat関数(リストのリストをフラットにする)を使ってStringを得ています。
さてさて、次回こそはDFの計算をしたいですね。(いけるかな。。)