changeset 3:50842df0402f

add IORef
author Daichi TOMA <toma@cr.ie.u-ryukyu.ac.jp>
date Sat, 06 Jul 2013 06:24:11 +0900
parents 2b869930dcfc
children 3a7df492ae34
files haskell.html
diffstat 1 files changed, 75 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/haskell.html	Sat Jul 06 05:19:32 2013 +0900
+++ b/haskell.html	Sat Jul 06 06:24:11 2013 +0900
@@ -243,6 +243,7 @@
         <p>
           Pong benchmark (req/s)
           <img class='centered' src='pic/pong.png'>
+        <a href="http://www.yesodweb.com/blog/2011/03/preliminary-warp-cross-language-benchmarks">Preliminary Warp Cross-Language Benchmarks</a>
         </p>
 			</article>
 
@@ -476,7 +477,7 @@
           Routing
         </h3>
         <p>
-          次に単純な Routing を行う Web Site 実装してみたいと思います。
+          次に単純な Routing を行うサイトを実装してみたいと思います。
         </p>
         <p>
           http://localhost:3000/ の後の URL の Path によって 出力する結果を変更してみます。
@@ -688,6 +689,79 @@
           <a href="http://localhost:3000/hogehoge">http://localhost:3000/hogehoge</a>
         </p>
 			</article>
+
+			<article>
+        <h3>
+          Counter
+        </h3>
+        <p>
+          最後に、Counter の実装を行なってみたいと思います。
+        </p>
+        <p>
+          アクセスするたびに、Count がインクリメントされていくようなサイトを作成します。
+        </p>
+        <p>
+          ここでは、Thread-safe な State である Data.IORef を用います。
+        </p>
+			</article>
+
+			<article>
+        <h3>
+          変数の更新はできなかったんじゃ?
+        </h3>
+        <p>
+          Haskell では、変数の更新のような副作用を持つ処理は基本的に許されていません。
+        </p>
+        <p>
+          そのため、IO モナドという限られた範囲でのみ行えるようになっています。
+        </p>
+        <p>
+          IOモナドは中身に直接触ることのできない抽象データ型です。
+          状態を外から触ることを禁止することで参照透過性を保っています。
+        </p>
+        <p>
+          また、Haskell は遅延評価ですが、初期化などIOでは実行順序が重要になってきます。
+          IO モナドのbindを利用して、計算の実行順序を保証します。
+        </p>
+			</article>
+
+			<article>
+        <h3>
+          Data.IORefの使い方
+        </h3>
+        <p>
+          IOモナドは中身に直接触ることはできません。
+        </p>
+        <p>
+          IOモナドからデータを手に入れる唯一の方法は &lt;- を使うことです。<br>
+          &lt;- を使うことで、純粋なものと不純なものをきっちりと分けています。
+        </p>
+        <p>
+          変更する際も、modifyIORefなどの関数を利用します。
+        </p>
+			</article>
+
+			<article>
+        <h3>
+          Data.IORefの使い方
+        </h3>
+<pre>
+-- IORef Int という型のデータを作製する
+counter &lt;- newIORef 0
+
+-- データの更新を atomic に行う
+-- atomicModifyIORef には、更新したい IORef a 型の変数と、
+-- IORef が持つ値を受け取って 
+-- ( 更新後の値, 戻り値にしたい値 ) というタプルを返す関数を渡す
+incCount:: IORef a -&gt; IO a
+incCount counter = atomicModifyIORef counter (\c -&gt; (c+1, c))
+
+-- 現在のデータの値を受け取る
+currentNum &lt;- readIORef counter
+</pre>
+        </p>
+			</article>
+
 			<article>
         <h3>
           そして気づくことなど