6

次のコードを使用して、データ ツリーの折りたたみ可能なインスタンスを作成しようとしています。

data Rose a = a :> [Rose a]
    deriving (Eq, Show)

instance Foldable Rose where
    fold (a:>b) =  a <> (map fold b)

ただし、このコードは機能していません。エラーが発生します。

Could not deduce <m ~ [m]>
from the context <Monoid m>
  bount by the type signature for fold :: Monoid m => Rose m -> m
...
In the return type of a call of 'map'
...

なぜ/どのように機能させるのか知っている人はいますか?

4

1 に答える 1

6

を書くときは、リストのインスタンスをfold b使用しています。Foldableしたがって、foldはモノイド値のリストを 1 つの値に折り畳みます。このモノイド値の型はたまたまですRose a(それがリストの構成要素です)。しかし、それはおそらくあなたが望むものではありません。

foldMap foldそこの代わりに使ってみてくださいfold。このようにして、最初Rose aにリスト内のすべての個人を折りたたみ、次に結果をまとめます。

于 2013-10-11T14:55:03.380 に答える