为RoseTree编写Functor实例时fmap定义类型报错求助
错误原因
你写的代码中,children 是 [Rose a] 类型的子树列表,你直接对其调用 fmap f 存在类型不匹配问题:
这里外层的 fmap 是列表类型的Functor实例方法,要求传入的参数函数可以处理列表的元素类型(也就是 Rose a),但你传入的 f 类型是 a -> b,只能处理节点存储的值,无法处理 Rose a 类型的子树。
修正后的代码
instance Functor Rose where fmap f (MkRose a children) = MkRose (f a) (fmap (fmap f) children)
代码逻辑说明
- 直接用
f a处理当前Rose树的根节点值,这部分逻辑你原来的写法是正确的。 - 对子树列表
children做映射时,外层的fmap是列表的Functor方法,用来遍历所有子树。 - 传入列表fmap的参数是
fmap f,也就是Rose类型自身的Functor映射方法,递归将函数f应用到每一棵子Rose树上,完成整棵树的映射。
内容的提问来源于stack exchange,提问作者Ukiyo-e
相关产品推荐
相关产品推荐

