金融工学の計算(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の計算をしたいですね。(いけるかな。。)