syd_sydの日記

2006-06-13

[] throw

Control.Exception.throw,Control.Exception.throwIO

Haskellの例外はIOモナド内でしかcatchすることができませんが、投げるのはどこでもできます:

throwIO :: Exception -> IO a 
throw :: Exception -> a 

throwIOはIOモナドの中で、throwはどこでも。

ただし throwIO ex `seq` a は例外をraiseしない (マニュアルより)。 ややこしいですが、前述の evaluate同様、 IO a 型の値はIOモナドの中でしか効果がないです。このような場合はunsafePerformIOを使うか、素直にthrow exとやりましょう。