回答編集履歴
2
表現の修正
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
結論部分の追記
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
|
+
のように関数合成の連結の形になるものだと意識すると良いかもしれません。
|