回答編集履歴

3

念のため、getLine が毎回同一の値を返している(=参照透過である)ことを追記

2024/06/15 06:03

投稿

actorbug
actorbug

スコア2381

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

文言変更

2024/06/15 02:49

投稿

actorbug
actorbug

スコア2381

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`を呼び出す
@@ -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

透明→透過

2024/06/15 02:37

投稿

actorbug
actorbug

スコア2381

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`を呼び出す