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

Haskell高阶函数中如何跟踪索引?自定义函数实现问题

修正Haskell高阶函数的列表推导式问题

你的代码问题在于列表推导式里用了两个独立的生成器x <- t和y <- [1..length(t)],这会生成笛卡尔积——每个元素x都会和所有的索引y组合,所以结果长度是原列表长度的平方(10*10=100个元素),而不是你需要的一一对应关系。

要实现元素与索引的配对处理,有两种简洁的修正方式:

方式一:用zip结合列表推导式

zip函数可以把两个列表的元素一一配对,这里我们把原列表和从1开始的整数列表配对,再遍历配对后的元组:

higherOrd :: [a] -> (a -> Int -> b) -> [b]
higherOrd t f = [f x idx | (x, idx) <- zip t [1..]]

方式二:用zipWith直接实现

zipWith本身就是高阶函数,它会把两个列表的对应元素传递给指定函数处理,完全符合你的需求:

higherOrd :: [a] -> (a -> Int -> b) -> [b]
higherOrd t f = zipWith f t [1..]

测试调用higherOrd [1..10] (+),两种写法都会返回你期望的结果:[2,4,6,8,10,12,14,16,18,20]。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 16:02:24