鍋あり谷あり

テーマを決めずに適当に書いています。

初めてのhaskell

初めての haskell は、既約分数クイズ*1
この日記の最初の日に書いたものと同様、スターン・ブロコット木 / ファレイ列 を使わないもの。
gcd も使わない。

import System
import Numeric

h m (n,d) | (n*2)<d = irrx m ( d-n, d )
          | True    = []
v m (n,d) | (n+d)<m = irrx m ( n, n+d )
          | True    = []
irrx m r = [r] ++ (h m r) ++ (v m r)
irr m = [(0,1)] ++ irrx m (1,1)

argToNum x  = fst $ head $ readDec $ head x
main = getArgs >>= \a -> putStr $ show $ irr $ argToNum a

もっともっと簡単に書けるとしか思えないんだが、今の私にはこれ以上簡単には書けない。
コマンドライン引数をとるのが大変だった。

再帰呼び出しができる普通の言語にとって明瞭なアルゴリズムで計算しようとしたせいか、haskell では書きにくいと感じた。
スターン・ブロコット木 / ファレイ列 を使ったもので、http://www.sampou.org/cgi-bin/haskell.cgi?p=Programming%3a%b6%cc%bc%ea%c8%a2%3a%c0%b0%bf%f4%cf%c0&l=jp#1 とは違った実装のものも書いてみようと思う。