C++ ときどき ごはん、わりとてぃーぶれいく☆

USAGI.NETWORKのなかのひとのブログ。主にC++。

haskell の標準エラー出力、C++的に言うところの std::cerr 的なそれのメモ

Haskell標準エラー出力

import System.IO

main :: IO ()
main = case f of
  Right a -> putStr a
  Left  a -> hPrint stderr a

f :: Either String String
f = ...

※EitherのLeftもRightもStringなのは、この例ではそれぞれ標準エラー出力と標準出力へと出力しているのでShowのインスタンスの具体例として。

↓C++的に↑に似た感じの表現をすると

<iostream>

struct f { ... };

int main() {
  f a = ... ;
  if( a.isSucceeded() )
    std::cout << a.result();
  else
    std::cerr << a.error();
}

※f.isSucceededをHaskellのEitherの代わり、f.errorとf.resultをそれぞれHaskellのEitherのLeftとRightに当たる感じで定義してあるという想定。

でっていう?

あんまりエラー出力を使うコード例を見掛けない気がしたのでメモ。ちなみにC#的に言う System.Diagnostics.Debug.Write に当たる役割は haskell 的には Debug.Trace.trace