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

Haskell如何将Rose (Board, Int)转为Rose Int,解决fmap报错问题

报错原因

你自定义的Rose类型没有实现Functor类型类,因此无法直接使用fmap函数做结构映射。

解决方案

方案1:开启扩展自动派生Functor实例(最省事)

在源文件头部添加语言扩展声明,然后直接在Rose的派生列表里加Functor即可,编译器会自动生成符合要求的fmap实现:

-- 源文件第一行加这个
{-# LANGUAGE DeriveFunctor #-}

data Rose a = MkRose a [Rose a]
    deriving (Eq, Show, Functor) -- 新增派生Functor

修改后你原有代码里的fmap snd bs'可以直接正常运行。

方案2:手动实现Functor实例

不想开扩展的话可以手动写实例实现,逻辑非常简单:

instance Functor Rose where
  fmap f (MkRose val children) = MkRose (f val) (fmap (fmap f) children)

修改后原有fmap代码也可直接使用。

方案3:自定义专用转换函数

如果你不想给Rose加Functor实例,可以单独写一个专门用来提取snd的函数:

extractRoseInt :: Rose (Board, Int) -> Rose Int
extractRoseInt (MkRose (_, intVal) children) = MkRose intVal (map extractRoseInt children)

调用时把原有代码的fmap snd bs'替换成extractRoseInt bs'即可。

内容的提问来源于stack exchange,提问作者ma22om

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:45:04