繁体   English   中英

Haskell:如何使用“派生秀”和仿函数?

[英]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 ,因为它应该产生可以重建输入的输出......

http://codepad.org/CDM1v2AY

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM