有理数の計算

前回の記事へ、id:nobusunさんからツッコミをいただいて、原因判明。Haskellの変数名は、小文字英数から始めないといけなかったんですね。で、id:nobusunさんが示していただいた、ソースに変更。

$ cat yuuri.hs
data Yuuri  = Yu Integer Integer

yAdd::Yuuri -> Yuuri -> Yuuri
yAdd (Yu s b ) (Yu s' b') =  Yu (s*b'+s'*b) (b*b')

変数が短く、シングルクォートも使っているところが、いかにもHaskellっぽいです。で、実行してみます。

$ ghci yuuri.hs

Loading package base-1.0 ... linking ... done.
Compiling Main             ( yuuri.hs, interpreted )
Ok, modules loaded: Main.
*Main> yAdd (Yu 2 3) (Yu 3 2)

Top level:
    No instance for (Show Yuuri)
      arising from use of `print' at Top level
    Probable fix: add an instance declaration for (Show Yuuri)
    In a 'do' expression: print it

ロードは、成功したけど、新たに問題が。エラーメッセージをみるとYuuriはShowのインスタンスでないから、表示させてあげないってことみたい。ということで、

$ cat yuuri.hs
data Yuuri  = Yu Integer Integer deriving Show

yAdd::Yuuri -> Yuuri -> Yuuri
yAdd (Yu s b ) (Yu s' b') =  Yu (s*b'+s'*b) (b*b')
$ ghci yuuri.hs

Loading package base-1.0 ... linking ... done.
Compiling Main             ( yuuri.hs, interpreted )
Ok, modules loaded: Main.
*Main> yAdd (Yu 2 3 ) (Yu 3 2)
Yu 13 6