Haskell中如何将嵌套上下文中的函数应用到f上下文包裹的对应值?
实现方案
这个函数的实现可以直接基于Functor和Applicative的基础操作完成,核心逻辑是保留外层g上下文不变,仅对内层f上下文的函数和参数做Applicative应用。
具体实现
nestedApply :: (Applicative f, Applicative g) => g (f (a -> b)) -> f a -> g (f b) nestedApply gWrappedFunc fa = fmap (<*> fa) gWrappedFunc
逻辑说明
- 首先,
<*> fa是对Applicative操作符<*>的部分应用,它的类型为f (a -> b) -> f b,作用是把接收的f层函数和已有的f a做应用,得到f层的结果 - 外层通过
fmap把上述操作映射到g上下文中,保留g的结构不变,最终得到g (f b)类型的返回值 - 补充说明:这里其实只要求
g满足Functor约束即可,原类型签名的Applicative g约束可以进一步放宽,因为实现中没有用到g的Applicative特性。
示例验证
我们可以用嵌套的常见类型做测试,比如外层g取Maybe,内层f取[]:
-- 测试输入 gWrappedFunc = Just [(+1), (*2)] fa = [1,2,3] -- 调用函数 nestedApply gWrappedFunc fa -- 输出结果:Just [2,3,4,2,4,6]
内容的提问来源于stack exchange,提问作者Chaot1c
相关产品推荐
相关产品推荐

