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
相关产品推荐
相关产品推荐

