如何对返回二元组的函数执行Maybe.map?实现指定类型转换
解决思路与实现
首先得揪出一个小问题:你给出的目标类型签名(a->b->(a,b)) -> Maybe a -> (Maybe a, b)有点矛盾——返回值里的b没有输入来源呀!合理的目标类型应该是(a->b->(a,b)) -> Maybe a -> b -> (Maybe a, b),也就是需要额外传入一个b参数才能得到结果。
接下来我们就用Maybe.map(在Haskell里就是fmap)来实现这个转换逻辑,核心思路很简单:
- 对于
Maybe a类型的值ma,我们用Maybe.map提取出对应a值在原函数中生成的二元组第一个元素,得到Maybe a(如果你的原函数是标准的配对函数\x y -> (x,y),那这一步其实就是保留原ma的结构); - 把这个处理后的
Maybe a和输入的b组成新的二元组,就得到了我们想要的结果。
通用实现代码
transform :: (a -> b -> (a, b)) -> Maybe a -> b -> (Maybe a, b) transform f ma b = (fmap (\x -> fst (f x b)) ma, b)
简化版本(针对标准配对函数)
如果你的原函数就是最基础的配对函数(比如f = \x y -> (x, y)),那代码可以直接简化,因为fst (f x b)就是x本身:
transform :: (a -> b -> (a, b)) -> Maybe a -> b -> (Maybe a, b) transform _ ma b = (ma, b)
举个实际例子
- 当
ma = Just 5,b = "hello",原函数f = \x y -> (x + 1, y)时,调用transform f ma b会返回(Just 6, "hello"); - 当
ma = Nothing,不管b传入什么值,都会返回(Nothing, b)。
这样就完全符合你想要的转换逻辑啦!
内容的提问来源于stack exchange,提问作者Akshay Kumar
相关产品推荐
相关产品推荐

