history

青木日記 RSS

<前の日 | この月 | 次の日>

2003-05-03

Haskell / 例外補足

例外対応 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
本日のツッコミ(全4件) [ツッコミを入れる]
nobsun (2003-05-05 10:01)

そんなにHaskellのコードが長いとは思わないけど。。。
main 以下なら(ってそんなのありか?)9行で一行短い。^^;

あおき (2003-05-05 16:05)

いや、実は Haskell 版のは exit(1) が一つ少ないですし、
main より下だけ見ても wc で見ると分量が倍くらい違います。

Haskell
     10 46 384 t
Ruby
     10 25 173 tt

あおき (2003-05-05 17:28)

インデントを数えるのは卑怯か。消しましょう。

~/c/test/haskell % sed 's/ *//g' t | wc
     10 10 212
~/c/test/haskell % sed 's/ *//g' tt | wc
     10 10 148

でもやっぱり 50% 増しですね。

笹川 賢一 (2003-05-06 23:58)

Haskellで一番関心したのはラマヌジャンの
タクシーナンバーを求めるやつ。
1729=1^3+12^3=10^3+9^3
こういうのをエレガントに書けるのはHaskellだけ
だと思う。Schemeじゃこうはいかない。
SICPの2章に出てくるエイトクイーンもHaskell強し!
と思っちゃいます。

名前
メールアドレス

<前の日 | この月 | 次の日>
2002|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|04|05|06|09|10|
2009|07|
2010|09|

Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved. LIRS