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

如何使用fmap仅修改函数的输入类型或输出类型

核心逻辑说明

首先明确fmap的本质:它是Functor类型类的核心方法,签名为 fmap :: Functor f => (a -> b) -> f a -> f b,设计逻辑就是仅修改上下文中包裹的值,不会改变上下文本身的结构。所以你不可能仅靠fmap实现 a -> a 到 Maybe a -> a 的转换——后者直接丢弃了Maybe上下文,超出了fmap的能力范围。


具体实现方案

1. 把a -> a转换为Maybe a -> a(修改输入类型,拆除输入的Maybe上下文)

你需要额外处理Maybe的两种分支场景:

安全实现(推荐)

使用标准库的maybe函数,签名为 maybe :: b -> (a -> b) -> Maybe a -> b,你只需要指定Nothing场景下的默认返回值,就能直接组合你的目标函数:

-- 示例:原函数为 (+1),Nothing场景默认返回0
convertedFunc :: Maybe Int -> Int
convertedFunc = maybe 0 (+1)

调用效果:

  • 输入Just 2 → 返回3
  • 输入Nothing → 返回0

不安全实现(仅在可保证输入一定为Just时使用)

如果你的业务逻辑能100%确认输入的Maybe值永远是Just x,也可以用fromJust直接取值,但注意输入为Nothing时会直接抛出运行时错误:

import Data.Maybe (fromJust)

convertedFuncUnsafe :: Maybe Int -> Int
convertedFuncUnsafe = (+1) . fromJust

2. 仅修改输出类型(把a -> a转换为a -> Maybe a,给输出套上下文)

如果是反过来要给输出增加Maybe上下文,直接用Just构造器和原函数组合即可:

convertedOutput :: Int -> Maybe Int
convertedOutput = Just . (+1)

调用效果:输入2 → 返回Just 3


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 19:54:04