Haskell中Applicative上下文内函数列表对值列表的应用方法
Applicative上下文下函数列表对值列表的应用方案
问题场景
给定Applicative类型上下文f,我们有:
F :: f [a -> a]:被上下文包裹的函数列表V :: f [a]:被同一上下文包裹的值列表
需要将F中的函数应用到V的对应值上,得到f [a]类型的结果。
现有尝试的类型问题
你之前的代码存在类型不匹配:
(F <*>) <*> V:<*>操作符要求左侧是f (x -> y)类型,但F是f [a->a],[a->a]并非单参数函数类型,因此F <*>本身类型不合法,无法继续与V组合。(V <*>)(F <*>):同样,F <*>类型错误,且V是f [a],不符合<*>对左侧必须是函数上下文的要求。
解决方案
对应元素应用(函数与值按位置匹配)
如果需要将函数列表和值列表的对应元素逐一应用(即第n个函数作用于第n个值),可以使用liftA2结合zipWith ($):
liftA2 (zipWith ($)) F V
zipWith ($)的类型是[a->a] -> [a] -> [a],负责将两个列表的对应元素做函数应用。liftA2则将这个二元函数提升到Applicative上下文f中,把F和V两个上下文包裹的值组合起来,最终得到f [a]类型的结果。
全量应用(每个函数作用于所有值)
如果需要让每个函数都作用于值列表的所有元素,生成嵌套列表结果f [[a]],可以使用:
liftA2 (\fs vs -> map (\f -> map f vs) fs) F V
这里通过嵌套map,先遍历函数列表,再将每个函数应用到整个值列表的元素上。
内容的提问来源于stack exchange,提问作者Siam
相关产品推荐
相关产品推荐

