You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 08:36:10