search(このページはHaskellではIOがどのように扱われているかを手っ取り早く紹介することを目的としています。学ぶべきことすべてはお伝えできませんが、どのように動作しているかを感覚はつかめると思います。)Haskellでは、副作用は特定の型の値としてエンコードすることで考慮されなければならない、とすることで副作用がある処理と純粋な関数を切り離してきました。a)型の値はアクションです。これは実行されたらaという型の値を生成しますよ、ということを表しています。randomRふつうHaskellの評価ではこのような処理は起き得ません。a)型の値はほぼ実行されないまま残ります。実際、コンパイルされたHaskellプログラム中で本当に実行されるように命令されるIOアクションはmainだけです。world"プログラムは次のように書けます。World!"ここまでいい感じにきていますが、エンド・トゥ・エンドのチェイン・アクションなしでは多くのことはできません。HaskellではIOアクションを繋げる2、3の原則を提示しています。そのうちの1つは以下の例で表されます。y)はxを実行し、結果を破棄し、そのあとyを実行してその結果を返します。すごい、これでもう複数の手続きがあるプログラムが書けてしまいます。"World"このコードは"Hello"と"World"を別々の行に表示します。最初の結果を用いて次の結果が何をするか決めるようなチェイン・アクションの書き方が分かっていません。呼ばれる操作で実現できます。fは最初にアクションxを実行して、その結果をつかんで、fに渡してそれが次のアクションが実行される、という一連のアクションを表しています。一連のアクションが実行されると、その結果は全体の計算結果となります。説明が長くなってしまいましたが、百聞は一見にしかずで、使用例を見ればすぐにわかると思います。"!")これこそ必要としていたものでした。実際この束縛関数は非常によくできていて、先ほどの(>>)も次のように定義できます。y実際に、ある値をなにもしないでそのまま値を返すようなIOアクションに変換することも非常に大事だとわかりました。これはチェイン・アクションの最後のほうで使うと非常に便利です。これによって、チェインの最後のアクションに処理をゆだねるのではなく、自分たちでどう処理して何を返すか決定することができます。aと書け、いま言ったようなことができます。do記法はあらゆるHaskellプログラムで見ることができます。"!")do記法を使った例は実際にdo記法を使わない例と全く同じことであり、Haskellコンパイラによってdo記法を同じものにコンパイルされる。(>>=)の連鎖とアクションの結果を取得するのに適切なラムダ式を想像してみてください。xとなっている行ではアクションxを実行し、結果を変数vに割り当てます。xの位置にアクションでないものを書いてしまうミスをすることがあります。ありがちなのは値を書くことです。bという書き方をすればできます。これは一般的なlet式のようにaをbを同じものと定義しますが、doブロック外のスコープには適用されません。a理由は簡単で、これを許してしまうとHaskellの参照透過性が侵されてしまうからです。―たとえば、unsafeを同じIOアクションに適用しても毎回異なる結果を返します。これはHaskellの関数にはあってはならない振る舞いです。モナドについては一般的なことはほとんどお伝えできていません。ほとんどのモナドは実際はIOとは似ていませんが、バインドとreturnに関しては同じようなコンセプトを持っています。computationの記事を読んでみてください。2つの記事はそれぞれモナドを異なる側面から大まかに説明しています。functionsにあります。Tuyl著)さらにこちらも参照してみてください。HaskellWikiDisclaimers。