Haskell实现函数列表作用于列表对应元素的函数时出现类型匹配错误
问题原因分析
你现有代码的类型不匹配问题来源于两个逻辑错误:
- 列表推导仅遍历了函数列表
f,未同步遍历参数列表xs,无法拿到对应位置的输入参数 - 代码中
f x的写法是把整个函数列表作为函数调用,而f本身是列表类型不可直接调用,因此触发类型错误
正确实现
方案1:使用标准库zipWith实现(无扩展依赖,最简洁)
zipWith可以同步遍历两个列表的对应位置元素,传入($)运算符(函数应用运算符)即可实现对应位置函数作用于参数的逻辑:
functionList :: [a -> b] -> [a] -> [b] functionList = zipWith ($)
方案2:使用并行列表推导实现
如果偏好列表推导写法,开启ParallelListComp扩展后即可同步遍历两个列表:
{-# LANGUAGE ParallelListComp #-} functionList :: [a -> b] -> [a] -> [b] functionList f xs = [ func x | func <- f | x <- xs ]
效果验证
你给出的测试用例均可正常通过:
functionList [\x->x+2] [2] == [4]返回TruefunctionList [\x->x+2, \x->x-2, \x->x*2] [2,3,6] == [4,1,12]返回True
内容的提问来源于stack exchange,提问作者BeanieBarrow
相关产品推荐
相关产品推荐

