求Monad实现Functor简化方案,完成CoroMap [Piese]到CoroMap [Vision]转换
实现思路
- 利用列表的Monad特性:列表类型
[]本身是Monad实例,其绑定操作>>=等价于concatMap,可以直接将类型为Piese -> [Vision]的visions函数,提升为[Piese] -> [Vision]的列表转换函数,刚好匹配所需的列表层转换需求。 - 复用已定义的
CoroMap的Functor实例:已实现的CoroMap的fmap会自动处理内层嵌套的ColorMap、RoleMap两层Functor的映射,不需要手动写多层嵌套的fmap,直接将上述列表转换函数传入fmap作用到CoroMap [Piese]上即可完成转换。
代码实现
data CoroMap a = CoroMap (ColorMap (RoleMap a)) instance Functor CoroMap where fmap fn (CoroMap coro) = CoroMap $ fmap (fmap fn) coro visions:: Piese -> [Vision] visions p = [] ihavethis :: CoroMap [Piese] ineedthis:: CoroMap [Vision] -- 核心实现,基于列表Monad的绑定操作 ineedthis = fmap (>>= visions) ihavethis
代码说明
- 核心逻辑中的
(>>= visions)就是所需的[Piese] -> [Vision]函数,等价于\piecelist -> piecelist >>= visions,会遍历列表中每个Piese元素调用visions得到[Vision],最后把所有结果拼接为一个[Vision]列表。 - 如果你需要更通用的转换逻辑,针对任意Monad m和类型为
a -> m b的函数,都可以用fmap (>>= f)把CoroMap (m a)转换为CoroMap (m b),不需要重复编写嵌套映射逻辑。
内容的提问来源于stack exchange,提问作者eguneys
相关产品推荐
相关产品推荐

