[英]Haskell : how to use “deriving Show” and functor?
问题1:我有树型的定义:
data Tree a = Node a (Tree a) (Tree a) |Empty
使用Show类型类实现show函数。 像节点10(节点20空(节点6空空))(节点30空空))的树应该显示为(10(20×6)30)。 因此,具有两个空分支的节点不应为括号。
我的代码如下:
data Tree a = Node a (Tree a) (Tree a) |Empty deriving (show)
--input
*Main>>Node 10 (Node 20 Empty (Node 6 Empty Empty)) (Node 30 Empty Empty))
--output
*Main>>Node 10 (Node 20 Empty (Node 6 Empty Empty)) (Node 30 Empty Empty))
有没有任何方法可以改变它,让输出是:
(10 (20 x 6) 30)
问题2:
使用仿函数类为这种类型定义fmap?
(我如何实现上面的函数使用函子?)
您可以在此处查看如何为Tree
实现Functor
实例。
如果某些类型是Functor
类型类的实例,则意味着您可以映射它的值并保留它的上下文(使用上面的链接来阅读有关Functor
更多信息)。 例如,如果你有tree :: Tree Int
在每个节点中有一些值,那么你可以使用fmap (\\ _ -> 'A') tree
用'A'
字符替换所有这些值。 结果将是Tree Char
,但它仍然是一Tree
。
要打印某些值,需要将其转换为String
。 将tree :: Tree a
转换为String
会产生String
但不再生成Tree Int
。 这就是为什么你不能使用fmap
来实现这样的转换。
要做到这一点,你必须遍历Tree a
。 只有使用fmap
才能做的就是将所有值转换为String
,然后在遍历树时以某种顺序连接它。
当然,你会实现Show
:
instance Show a => Show (Tree a) where
show Empty = "()"
show (Node x Empty Empty) = show x
show (Node x Empty y) = "(" ++ show x ++ " x " ++ show y ++ ")"
show (Node x Empty y) = "(" ++ show x ++ " " ++ show y ++ " x)"
show (Node x y z) = "(" ++ show x ++ " " ++ show y ++ " " ++ show z ++ ")"
然而,这会有点滥用Show
,因为它应该产生可以重建输入的输出......
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.