+ Counter +
++ 最後に、Counter の実装を行なってみたいと思います。 +
++ アクセスするたびに、Count がインクリメントされていくようなサイトを作成します。 +
++ ここでは、Thread-safe な State である Data.IORef を用います。 +
+# HG changeset patch
# User Daichi TOMA
Pong benchmark (req/s)
+ Preliminary Warp Cross-Language Benchmarks
- 次に単純な Routing を行う Web Site 実装してみたいと思います。
+ 次に単純な Routing を行うサイトを実装してみたいと思います。
http://localhost:3000/ の後の URL の Path によって 出力する結果を変更してみます。
@@ -688,6 +689,79 @@
http://localhost:3000/hogehoge
+ 最後に、Counter の実装を行なってみたいと思います。
+
+ アクセスするたびに、Count がインクリメントされていくようなサイトを作成します。
+
+ ここでは、Thread-safe な State である Data.IORef を用います。
+
+ Haskell では、変数の更新のような副作用を持つ処理は基本的に許されていません。
+
+ そのため、IO モナドという限られた範囲でのみ行えるようになっています。
+
+ IOモナドは中身に直接触ることのできない抽象データ型です。
+ 状態を外から触ることを禁止することで参照透過性を保っています。
+
+ また、Haskell は遅延評価ですが、初期化などIOでは実行順序が重要になってきます。
+ IO モナドのbindを利用して、計算の実行順序を保証します。
+
+ IOモナドは中身に直接触ることはできません。
+
+ IOモナドからデータを手に入れる唯一の方法は <- を使うことです。
+ 変更する際も、modifyIORefなどの関数を利用します。
+
+ Counter
+
+
+ 変数の更新はできなかったんじゃ?
+
+
+ Data.IORefの使い方
+
+
+ <- を使うことで、純粋なものと不純なものをきっちりと分けています。
+
+ Data.IORefの使い方
+
+
+-- IORef Int という型のデータを作製する
+counter <- newIORef 0
+
+-- データの更新を atomic に行う
+-- atomicModifyIORef には、更新したい IORef a 型の変数と、
+-- IORef が持つ値を受け取って
+-- ( 更新後の値, 戻り値にしたい値 ) というタプルを返す関数を渡す
+incCount:: IORef a -> IO a
+incCount counter = atomicModifyIORef counter (\c -> (c+1, c))
+
+-- 現在のデータの値を受け取る
+currentNum <- readIORef counter
+
+