RWH

3.8まで読んだ。3.7のあとの練習問題は、2がどうもうまく解けてない気がしてならないなぁ。もう少し考えてみよう。

toList :: List a -> [a]
-- toList (Cons x xs) = (:) x (toList xs)
toList (x `Cons` xs) = (:) x (toList xs)
toList Nil = []

1は同型なものだから、中置にすると本当に同じになる。

追記 11/24 22:21

data Tree a = Node a (Maybe(Tree a)) (Maybe(Tree a))
              deriving (Show)

やっぱりこうにしか書けないなあ。返値はTree aなのに引数はMaybe (Tree a)なのがちょっと気に入らないけど。

追記 11/25 22:27

コメントより、

TreeのルートからEmptyのときを表せますか?

とのことだけど、ルートノードだけで、子を持たないツリーってことでいいのかなぁ? それなら、

t = Node 1 Nothing Nothing

でいいよね。

追記 11/26 20:51

さらにコメントより、

ルートノードも値を持たないという意味のEmptyです。

あー、そうか。

t = Empty

なるツリーがあっていいのか。となるとこれじゃ表現できないなあ。

data Tree2 a = Node (Maybe a) (Maybe (Tree2 a)) (Maybe (Tree2 a))
               deriving (Show)

なる型だと、途中にNothingなノードを持つツリーができてしまうからちょっとアレか。とはいえ構成子を1つしかもたないような型という条件だとちょっとすぐには思いつかないや。なにかもっとスマートな解があるのかなあ。
あとせめてこのエントリへのコメントだけでも一貫した名前を名乗って欲しかったり。別に本名を名乗れとか言ってるわけじゃないし。名前に_だけとかないわー。