回答編集履歴

2

表現の修正

2024/12/12 04:36

投稿

tamoto
tamoto

スコア4252

test CHANGED
@@ -7,12 +7,13 @@
7
7
  = f 1 (f 2 (const []))
8
8
  ```
9
9
 
10
- 質問のここまではいですが、
10
+ 質問のここまでは問題ないです
11
11
  実際の結果となるリストを生成しているのは `f` の `x : k (Set.insert x ss)` この部分であって、
12
- この Set は単に**重複の検出にしか利用していない**のです。
12
+ この Set は単に重複の検出にしか利用していないわけです
13
13
 
14
14
  その点を意識したうえでこの関数を読み解くと、
15
15
  この場合は `f 1 (f 2 (const []))` を先に展開すればよく、
16
+
16
17
  ```haskell
17
18
  f2 :: Set.Set Int -> [Int]
18
19
  f2 s = f 2 (const []) s
@@ -25,9 +26,9 @@
25
26
  = if Set.member 1 s then f2 s else 1 : f2 (Set.insert 1 s)
26
27
  ```
27
28
 
28
- このようになります。
29
+ このようにできます。
29
30
 
30
- 最後にこの関数に `{}` を入れると、
31
+ 最後にこの関数に `{}` を入れる
31
32
 
32
33
  ```haskell
33
34
  f1 {} = if Set.member 1 {} then f2 {} else 1 : f2 {1} -- Set.member 1 {} == false
@@ -36,14 +37,16 @@
36
37
  = 1 : [2]
37
38
  = [1, 2]
38
39
  ```
40
+
39
41
  このような順序で解決します。
40
42
 
41
- よって、質問の展開例は、if を暗黙に解決していますが、展開の順序としては正しいものだ思われます。
43
+ よって、質問の展開例は、if を暗黙に解決していますが、展開の順序としては正しいといえます。
44
+
42
45
  おそらくリストの順序を保持しながら重複を排除するための関数なのかなと想定されますが、
43
46
  順序を保持しなくてもよいのであれば `g = Set.toList . Set.fromList` で済んでしまうので、
44
47
  無用に複雑な感じにも見えてしまいますね。
45
48
 
46
49
  `foldr` の結果型を関数にするのはよくあるテクニックですが、素直に展開しようとするとちょっと混乱しがちなので、
47
50
  `f :: Int -> (a -> b) -> (a -> b)` のとき、
48
- `foldr f initial [1, 2, 3, 4] == f 1 . f 2 . f 3 . f 4 $ initial`
51
+ `foldr f initial [1, 2, 3, 4] a == (f 1 . f 2 . f 3 . f 4 $ initial) a`
49
- のように関数合成の連結の形るものだと意識すると良いかもしれません。
52
+ のように関数合成の連結をすべて処理した後改めて引数を適用するものだと意識すると良いかもしれません。

1

結論部分の追記

2024/12/12 03:20

投稿

tamoto
tamoto

スコア4252

test CHANGED
@@ -37,3 +37,13 @@
37
37
  = [1, 2]
38
38
  ```
39
39
  このような順序で解決します。
40
+
41
+ よって、質問の展開例は、if 文を暗黙に解決していますが、展開の順序としては正しいものだと思われます。
42
+ おそらくリストの順序を保持しながら重複を排除するための関数なのかなと想定されますが、
43
+ 順序を保持しなくてもよいのであれば `g = Set.toList . Set.fromList` で済んでしまうので、
44
+ 無用に複雑な感じにも見えてしまいますね。
45
+
46
+ `foldr` の結果型を関数にするのはよくあるテクニックですが、素直に展開しようとするとちょっと混乱しがちなので、
47
+ `f :: Int -> (a -> b) -> (a -> b)` のとき、
48
+ `foldr f initial [1, 2, 3, 4] == f 1 . f 2 . f 3 . f 4 $ initial`
49
+ のように関数合成の連結の形になるものだと意識すると良いかもしれません。