import Debug.Trace
data Tree a = Nil | Branch (Tree a) a (Tree a) deriving (Eq, Show)
instance Foldable Tree where
foldr _ ini Nil = ini
foldr f ini (Branch l x r) = trace (show x) (foldr f (f x (foldr f ini r)) l)
? No instance for (Show a) arising from a use of ‘show’
Possible fix:
add (Show a) to the context of
the type signature for:
foldr :: forall a b. (a -> b -> b) -> b -> Tree a -> b
? In the first argument of ‘trace’, namely ‘(show x)’
In the expression: trace (show x) (foldr f (f x (foldr f ini r)) l)
In an equation for ‘foldr’:
foldr f ini (Branch l x r)
= trace (show x) (foldr f (f x (foldr f ini r)) l)
我不明白問題是什么。我將非常感謝您的幫助
uj5u.com熱心網友回復:
問題是它foldr必須適用于Tree a任何element -type a,包括[Integer] -> Double您無法顯示的型別。因此不可能show x在定義中使用。這并不重要,這只是為了除錯目的,而您只想除錯,比如說,這種Tree Int情況 - 編譯器需要讓實體可用于它可能使用的所有型別。
作為一種解決方法,您可以首先將該功能實作為Show-restricted 版本,然后僅在除錯后將其更改為Foldable沒有trace部件的方法。
foldrTree :: Show a => (a -> b -> b) -> b -> Tree a -> b
foldrTree _ ini Nil = ini
foldrTree f ini (Branch l x r) = trace (show x) (foldrTree f (f x (foldr f ini r)) l)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/528484.html
標籤:哈斯克尔
上一篇:GHCI與編譯函式的區別
