2013-10-11 27 views
5

試圖讓一個可摺疊的實例用下面的代碼數據樹:數據樹哈斯克爾可摺疊例如

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

«不工作»是沒有用的。它不是typecheck?那麼錯誤信息是什麼?或者它產生了錯誤的結果?在什麼輸入? –

+0

編輯我的帖子與我得到的錯誤消息 – Skyfe

+0

你明白什麼錯誤信息說?如果你慢慢閱讀,我敢打賭你會知道如何解決你的問題。如果不是,你也應該說出你不明白哪部分錯誤。 –

回答

6

當您編寫fold b時,您正在使用列表的Foldable實例。因此fold將monoidal值列表摺疊爲單個值。這種monoidal值的類型恰好是Rose a(這就是你的列表的組成部分)。但這可能不是你想要的。

嘗試使用foldMap fold而不是fold那裏。這樣,您首先將列表中的每個人Rose a摺疊起來,然後將結果摺疊在一起。

+0

謝謝你的工作! – Skyfe