如何为自定义MyList类型编写Haskell Functor实例?
解决MyList的Functor实例实现问题
你的代码错误核心在于没有遵循Functor的核心要求:将函数f应用到容器内的所有目标元素上,并递归处理嵌套的容器结构,最终输出类型匹配的新容器。
正确的Functor实例实现
instance Functor MyList where fmap f (Elem x xs) = Elem (f x) (fmap f xs) fmap f (Null xs) = Null (fmap f xs) fmap _ Done = Done
代码说明
Elem x xs分支:
原节点的x是a类型,需要用传入的函数f将其转换为b类型;同时递归调用fmap f xs,把后续的MyList a转换为MyList b,最后用转换后的元素和子列表构造新的Elem节点。Null xs分支:Null节点本身不包含a类型元素,但嵌套的xs是MyList a,需要递归调用fmap f xs将其转换为MyList b,再构造新的Null节点。Done分支:Done是终止节点,没有任何需要转换的元素,直接返回自身即可,这里用_忽略未使用的函数参数,更符合Haskell的编码习惯。
测试验证
你可以用以下代码测试这个实例:
testList :: MyList Int testList = Elem 1 (Null (Elem 2 Done)) main = print $ fmap (*2) testList -- 输出结果:Elem 2 (Null (Elem 4 Done))
内容的提问来源于stack exchange,提问作者Nuvo Abrid
相关产品推荐
相关产品推荐

