kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

Reasoned Schemer (52) 10章 conj2

(define (conj2 g1 g2)
  (lambda (s) (append-map-inf g2 (g1 s))))

disj2と似てるような似てないような

disj2append-infを呼んでるけどconj2append-map-infを呼ぶ
disj2g1g2sに適用されるけどconj2g2だけ
g1g2が非対称なんだ

append-mapってなんだっけ

append-map is like map, but it uses append instead of cons to build its result.

consのかわりにappendを使うmapということらしい
else以外の形を見ると確かにそう
elseは何をやっているかというとsuspensionだったらforceしてるだけ

consのかわりにappendを使うとどうなるかって微妙にイメージできてないんだけど

> (append-map-inf (lambda (l) (map sub1 l)) '((1) (2 3) (4 5 6)))
(0 1 2 3 4 5)
> (map (lambda (l) (map sub1 l)) '((1) (2 3) (4 5 6)))
((0) (1 2) (3 4 5))

あんまりすっきりした例が思いつかなかったけどこういうことかな

(g1 s)はsubsitutionのstreamだから
(append-map-inf g2 (g1 s))(g1 s)の各要素(substitution)に
g2を適用した結果(substitutionのstream)をappend-infする
substitutionのstreamをappend-infすると全体がひとつの大きなstreamになる、
ってことであってるかな

ちょっと実例がほしい

> (append-map-inf (== 'olive x) ((== 'oil y) empty-s))
(((#(x) . olive) (#(y) . oil)))
> ((conj2 (== 'olive x) (== 'oil y)) empty-s)
(((#(y) . oil) (#(x) . olive)))
> (append-map-inf (== 'olive x) ((== 'oil x) empty-s))
()
> ((conj2 (== 'olive x) (== 'oil x)) empty-s)
()

なんかちゃんとできてるところがびっくりする
なんでこうなるんだっけ(わかってない

disj2のとき、substitutionのstreamって結局何なの?と思ったけど
思考を放棄してたやつ、手掛かり増えたかな?
何か見えた気もするんだよな