回答編集履歴
3
念のため、getLine が毎回同一の値を返している(=参照透過である)ことを追記
test
CHANGED
@@ -23,13 +23,15 @@
|
|
23
23
|
```
|
24
24
|
これを先ほどの処理に通すと、以下の動作になります。
|
25
25
|
|
26
|
-
1. まず、`>>=`の前の`getLine`を「Haskellの世界で」評価し、一行読み込むというコマンドが返る
|
26
|
+
1. まず、`>>=`の前の`getLine`を「Haskellの世界で」評価し、「一行読み込むというコマンド」が返る
|
27
|
-
2. 一行読み込むというコマンドを「Haskellの外で」実行する
|
27
|
+
2. 「一行読み込むというコマンド」を「Haskellの外で」実行する
|
28
28
|
3. その結果を x とすると、`(\str1 -> getLine >>= (\str2 -> print str1 >> print str2)) x`が「Haskellの世界で」評価され、`getLine >>= (\str2 -> print x >> print str2)`が返る
|
29
|
-
4. また`>>=`が現れたので、その前の`getLine`を「Haskellの世界で」評価し、一行読み込むというコマンドが返る
|
29
|
+
4. また`>>=`が現れたので、その前の`getLine`を「Haskellの世界で」評価し、「一行読み込むというコマンド」が返る
|
30
|
-
5. 一行読み込むというコマンドを「Haskellの外で」実行する
|
30
|
+
5. 「一行読み込むというコマンド」を「Haskellの外で」実行する
|
31
31
|
6. その結果を y とすると、`(\str2 -> print x >> print str2) y`が「Haskellの世界で」評価され、`print x >> print y`が返る
|
32
|
-
7. `>>`が現れたので、その前の`print x`を「Haskellの世界で」評価し、xを出力するというコマンドが返る
|
32
|
+
7. `>>`が現れたので、その前の`print x`を「Haskellの世界で」評価し、「x を出力するというコマンド」が返る
|
33
|
-
8. xを出力するというコマンドを「Haskellの外で」実行する
|
33
|
+
8. 「x を出力するというコマンド」を「Haskellの外で」実行する
|
34
|
-
9. その結果を無視して、`print y`を「Haskellの世界で」評価し、yを出力するというコマンドが返る
|
34
|
+
9. その結果を無視して、`print y`を「Haskellの世界で」評価し、「y を出力するというコマンド」が返る
|
35
|
-
10. yを出力するというコマンドを「Haskellの外で」実行する
|
35
|
+
10. 「y を出力するというコマンド」を「Haskellの外で」実行する
|
36
|
+
|
37
|
+
上記の 1.と4.で`getLine`を評価した結果が、どちらも「一行読み込むというコマンド」という同一の値である(=参照透過である)ことに注意してください。
|
2
文言変更
test
CHANGED
@@ -9,7 +9,7 @@
|
|
9
9
|
main = print $ getLine `seq` length [getLine]
|
10
10
|
```
|
11
11
|
|
12
|
-
あとは、Haskellの処理系が、mainを
|
12
|
+
あとは、Haskellの処理系が、mainを以下のように処理していると考えれば、「Haskellの世界で」の評価は参照透過だとみなせます。
|
13
13
|
|
14
14
|
1. 値がIOモナドによるコマンドだった場合は、「Haskellの外で」コマンドを実行する
|
15
15
|
2. 値が`a >>= f`という形だったら、まず`a`を「Haskellの世界で」評価し、それで返ってきたIOモナドによるコマンドを「Haskellの外で」実行し、その結果を引数に「Haskellの世界で」`f`を呼び出す
|
@@ -21,7 +21,7 @@
|
|
21
21
|
```haskell
|
22
22
|
main = getLine >>= (\str1 -> getLine >>= (\str2 -> print str1 >> print str2))
|
23
23
|
```
|
24
|
-
これを先ほどの処理に
|
24
|
+
これを先ほどの処理に通すと、以下の動作になります。
|
25
25
|
|
26
26
|
1. まず、`>>=`の前の`getLine`を「Haskellの世界で」評価し、一行読み込むというコマンドが返る
|
27
27
|
2. 一行読み込むというコマンドを「Haskellの外で」実行する
|
1
透明→透過
test
CHANGED
@@ -9,7 +9,7 @@
|
|
9
9
|
main = print $ getLine `seq` length [getLine]
|
10
10
|
```
|
11
11
|
|
12
|
-
あとは、Haskellの処理系が、mainをこのように処理していると考えれば、「Haskellの世界で」の評価は参照透
|
12
|
+
あとは、Haskellの処理系が、mainをこのように処理していると考えれば、「Haskellの世界で」の評価は参照透過だとみなせます。
|
13
13
|
|
14
14
|
1. 値がIOモナドによるコマンドだった場合は、「Haskellの外で」コマンドを実行する
|
15
15
|
2. 値が`a >>= f`という形だったら、まず`a`を「Haskellの世界で」評価し、それで返ってきたIOモナドによるコマンドを「Haskellの外で」実行し、その結果を引数に「Haskellの世界で」`f`を呼び出す
|