2013-10-11 6 views
5

次のコードでデータツリー用の折り畳み式のインスタンスを作成しようとすると:しかし、このコードは、それが生成するエラーが動作していないデータツリーのHaskellの折り畳み式のインスタンス

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' 
... 

誰でもそれを動作させる理由/方法を知っていますか?

+0

«は機能していません»実際には役に立ちません。型チェックしないのですか?その後、エラーメッセージは何ですか?それとも、それは間違った結果を生み出しますか?どの入力? –

+0

エラーメッセージが表示された投稿を編集しました – Skyfe

+0

エラーメッセージの内容を理解していますか?あなたがそれをゆっくりと読めば、あなたはあなたの問題を解決する方法を知っているでしょう。もしそうでなければ、エラーのどの部分を理解していないのかを言うべきです。 –

答えて

6

fold bと書くと、リストにFoldableインスタンスが使用されています。したがって、foldは、モノイド値のリストを単一の値にフォールドします。このモノイド値のタイプは、Rose a(あなたのリストで構成されているもの)です。しかし、それはおそらくあなたが望むものではありません。

foldの代わりにfoldMap foldを使用してください。この方法では、リスト内のすべての個人Rose aを最初に折りたたみ、結果を一緒に折り畳みます。

+0

ありがとうございました! – Skyfe

関連する問題