縮寫形式(這將解決我的問題的一個方法至少)如何查看類型是否是Haskell中的類的實例?
我怎樣才能做這樣的事情:
try_to_show :: a -> String
try_to_show val = if (val is instance of Show) (show val) else "Cannot show"
我可能做這完全錯了(的unhaskell方式) ;我只是在學習,所以請讓我知道是否有更好的方法來解決這個問題。
上下文:我在寫一堆樹結構。我想重用我的prettyprint
函數二叉樹。儘管不是所有的樹都可以使用通用的Node
/Branch
數據類型;不同的樹需要不同的額外數據。因此,要重用prettyprint
功能我想創建一個類不同的樹會的實例:
class GenericBinaryTree a where
is_leaf :: a -> Bool
left :: a -> a
node :: a -> b
right :: a -> a
這樣,他們只需要實現方法來檢索左,右,以及當前節點的值,prettyprint沒有按」 t需要了解內部結構。
然後我得到了到這裏:
prettyprint_helper :: GenericBinaryTree a => a -> [String]
prettyprint_helper tree
| is_leaf tree = []
| otherwise = ("{" ++ (show (node tree)) ++ "}") : (prettyprint_subtree (left tree) (right tree))
where
prettyprint_subtree left right =
((pad "+- " "| ") (prettyprint_helper right)) ++ ((pad "`- " " ") (prettyprint_helper left))
pad first rest = zipWith (++) (first : repeat rest)
我也得到了Ambiguous type variable 'a0' in the constraint: (Show a0) arising from a use of 'show'
錯誤(show (node tree))
這裏是最基本的樹數據類型和實例的定義(我的其他樹木有其他領域的例子但他們無關的通用prettyprint
功能)
data Tree a
= Branch (Tree a) a (Tree a)
| Leaf
instance GenericBinaryTree (Tree a) where
is_leaf Leaf = True
is_leaf _ = False
left (Branch left node right) = left
right (Branch left node right) = right
node (Branch left node right) = node
我可以定義node :: a -> [String]
並處理樹的每個實例/類型的字符串化,但是這感覺更整潔。根據prettyprint
,我只需要一個字符串表示法,但如果稍後添加其他通用二叉樹函數,我可能需要實際值。
那麼我該如何編寫這個工作節點值是否是Show
的一個實例呢?或者還有什麼其他方式可以解決這個問題?在面向對象的語言中,我可以很容易地檢查一個類是否實現了一些東西,或者一個對象是否有方法。
,因爲它不是一個需要showable樹,我不能使用類似
prettyprint :: Show a => a -> String
,這是一個需要showable樹(按功能node
返回)內的值。我也嘗試將node
改爲Show b => a -> b
而沒有運氣(還有一堆其他類型的class/preconditions /不管/我甚至不知道我在做什麼)。
,你可以讓一切都顯示的實例:'實例顯示,其中顯示_ =「」' –
aavogt