多层Functor的fmap2函数实现错误排查求助
问题分析与修正
你的fmap2代码存在两个关键错误:
1. 无限递归且参数类型误用
你的实现fmap2 f f2 = (fmap2 f . fmap f2)有两个致命问题:
- 类型不匹配:
fmap的第一个参数必须是函数,但你传入了f2(类型为f (g a)的Functor实例),直接触发类型错误。 - 无限递归:定义中直接递归调用
fmap2 f,没有任何终止条件,即使类型问题修复,也会触发栈溢出。
2. 正确实现方式
fmap2的本质是将函数逐层映射到嵌套的两层Functor结构中,正确实现要利用Functor的组合性:
fmap2 :: (Functor f, Functor g) => (a -> b) -> f (g a) -> f (g b) fmap2 f = fmap (fmap f)
或者展开为显式参数形式,更直观:
fmap2 f x = fmap (fmap f) x
原理说明
- 对于嵌套结构
f (g a),先用fmap f将函数f映射到内层的g a上,得到g b; - 再用外层的
fmap,将这个“内层映射操作”应用到整个f结构的每个元素上,最终得到f (g b)。
测试你的示例:
fmap2 negate [[1,2], [3]]等价于fmap (fmap negate) [[1,2], [3]],会将每个内层列表的元素取反,得到[[-1,-2],[-3]];fmap2 head [Just "abc",Nothing,Just "def"]等价于fmap (fmap head) [Just "abc",Nothing,Just "def"],内层fmap head将Just "abc"转为Just 'a',Nothing保持不变,外层fmap将逻辑应用到列表每个元素,得到[Just 'a',Nothing,Just 'e']。
内容的提问来源于stack exchange,提问作者coderodde
相关产品推荐
相关产品推荐

