例外対応 cat
module Main where import System import System.IO import System.IO.Error main = do args <- getArgs case args of [a] -> catch (do cs <- readFile a putStr cs) (\e -> do hPutStrLn stderr ("read fail: " ++ ioeGetErrorString e)) _ -> do hPutStrLn stderr "1 arg must be given" exitWith (ExitFailure 1)
でもこういうことをやるなら明らかに Ruby のほうが短いわけだ。
unless ARGV.size == 1 $stderr.puts "Just 1 arg needed" exit 1 end begin print File.read(ARGV[0]) rescue => err $stderr.puts "read fail: #{err.message}" exit 1 end
Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved.
そんなにHaskellのコードが長いとは思わないけど。。。
main 以下なら(ってそんなのありか?)9行で一行短い。^^;
いや、実は Haskell 版のは exit(1) が一つ少ないですし、
main より下だけ見ても wc で見ると分量が倍くらい違います。
Haskell
10 46 384 t
Ruby
10 25 173 tt
インデントを数えるのは卑怯か。消しましょう。
~/c/test/haskell % sed 's/ *//g' t | wc
10 10 212
~/c/test/haskell % sed 's/ *//g' tt | wc
10 10 148
でもやっぱり 50% 増しですね。
Haskellで一番関心したのはラマヌジャンの
タクシーナンバーを求めるやつ。
1729=1^3+12^3=10^3+9^3
こういうのをエレガントに書けるのはHaskellだけ
だと思う。Schemeじゃこうはいかない。
SICPの2章に出てくるエイトクイーンもHaskell強し!
と思っちゃいます。