data Tree t = Empty | Node t (Tree t) (Tree t)
Functor インスタンスを作成して使用できます
fmap :: (t -> a) -> Tree t -> Tree a
しかし、(t -> a) の代わりに (Tree t -> a) が欲しいので、t だけでなく (ノード t) 全体にアクセスできるとしたらどうでしょうか?
treeMap :: (Tree t -> a) -> Tree t -> Tree a
treeMap f Empty = Empty
treeMap f n@(Node _ l r) = Node (f n) (treeMap f l) (treeMap f r)
折り方も同じ
treeFold :: (Tree t -> a -> a) -> a -> Tree t -> a
これらのような関数の一般化はありますか?
map :: (f t -> a) -> f t -> f a
fold :: (f t -> a -> a) -> a -> f t -> a