木(tree)で遊ぶ」に「ごくやさしい問題をやってみよう」と「課題」が書かれていた。著者を見たら「ふつうのHaskellプログラミング」の監修をされている方だった。おぉ~と思いながら、早速課題に目を通す。(@_@;)問題の意味がわからず。コードが書かれていたので、解説を読みつつ目を通していく。_)o~†(最初読んだとき、何をどうやって再帰的に考えればいいのかわからなかった。)方法を考える結局わからなかったので、自分が理解できる方法で実装することに。上記の解説を読んだおかげで、課題の意味は理解することができた。「末端のノード」を言いかえれば、木における「葉」のこと。個というのは「葉」が一枚あるだけの木のこと。このとき当然ながら他の形はない。これが枝のある木としては一番小さい形。個のときもこの形のものしかない。個のときの木の葉に、それぞれ「最小の木」がぶらさがる形。個の絵は、「木(tree)で遊ぶ」に描かれている。)再帰的な定義を考えるときは「現在の形が、一つ前の形からどのようにして形成されるか?」を考えること。本ニョキニョキ枝が生え、尖端に葉がついたと見ることができる。木が生えたと考えることができる。木が生えているのがわかる。これで「木」に対して再帰的な見方ができるようになった。問題は、どのようにして全ての場合を漏れなく列挙するかということ。(+_+)葉から木を生やす関数ここで最初に必要となる関数が思い浮かんだ。上記のように特定の「葉」からニョキニョキと木が生えてくると見るのであれば、「特定の葉」を指定したら、そこから木が生える関数が欲しい。倣い以下のように定義。型としたのは、各々の葉を識別するラベルを付けるため。これにより、指定したラベルの付いている葉からニョキニョキと木を伸ばすことができるようにする。ラベルは一つの木において一意になるようにしなくてはならない。一意でなければ複数の葉から枝が伸びてしまう。足した値とすることにした。