data Tree a = Tree a [Tree a]
空のツリーは許可されないことに注意してください。葉はサブツリーの空のリストを持つツリーです。
treeFold :: (a -> [b] -> b) -> Tree a -> b
treeFold f (Tree x s) = f x (map (treeFold f) s)
上記の情報を考えると、サブツリーに折り畳み操作を再帰的に適用し、ルートのラベルに関数を適用し、サブツリーから返される結果を適用することによって、ツリーの折り畳み関数が結果を返す方法がわかりません。
また、マップ関数に引数として渡され、適切にコンパイルおよび実行されるときに 、ツリー Fold 関数が 2 つではなく 1 つの引数しかとらない方法もわかりません。
たとえば、以下のツリー サイズ関数は、ツリーのノードをカウントします。
treeSize :: Tree a -> Int
treeSize = treeFold (\x ys -> 1 + sum ys)
したがって、treeSize treeを実行tree = Tree 4 [Tree 1 [Tree 2 [], Tree 3 []]]
すると、ツリーのサイズが 4 になります。
上記のツリー サイズ関数では、ツリー フォールド関数にも 2 つではなく 1 つの引数が渡されます。また、tree fold 関数に渡される x はどこでも使用されていないため、なぜそこで必要なのですか。これを削除すると、プログラムがコンパイルされなくなり、次のエラー メッセージが表示されます。
Couldn't match type `a' with `[[Int] -> Int]'
`a' is a rigid type variable bound by
the type signature for treeSize :: Tree a -> Int
at treeFold.hs:15:1
In the first argument of `sum', namely `ys'
In the second argument of `(+)', namely `sum ys'
In the expression: 1 + sum ys
どんな助けでも大歓迎です。