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

如何用Haskell重写Python的列表多元素修改示例?

将Python代码转为Haskell实现

首先明确原Python代码的逻辑:遍历1到9的偶数,对每个偶数k,给列表中索引为k、k+2…8的位置各加1,最终偶数索引i(2、4、6、8)的值等于小于等于i的偶数个数(从2开始),奇数索引保持0。


最简洁的实现

直接通过列表推导式,根据索引计算每个位置的值:

result = [ if odd i then 0 else i `div` 2 | i <- [0..9] ]

运行后得到[0,0,1,0,2,0,3,0,4,0],和Python代码结果完全一致。


贴近原代码逻辑的实现(纯函数式方式)

因为Haskell是纯函数式语言,列表不可直接修改,我们可以先实现一个updateAt函数来更新指定索引的元素,再模拟原代码的嵌套循环逻辑:

-- 定义updateAt:给定索引、元素更新函数、列表,返回更新后的新列表
updateAt :: Int -> (a -> a) -> [a] -> [a]
updateAt idx f xs = take idx xs ++ [f (xs !! idx)] ++ drop (idx + 1) xs

-- 初始全0列表
initialZeros = replicate 10 0
-- 原代码中需要处理的偶数(1到9中的偶数)
targetEvens = filter even [1..9]
-- 对每个偶数k,生成需要更新的索引列表:k, k+2...8
getUpdateIndices :: Int -> [Int]
getUpdateIndices k = [k, k+2..8]

-- 通过两次foldl完成嵌套更新:先遍历每个偶数k,再遍历对应的索引更新元素
result = foldl (\currentList k -> foldl (\acc idx -> updateAt idx (+1) acc) currentList (getUpdateIndices k)) initialZeros targetEvens

你的尝试问题所在

  • foldl (+) zeros $ filter even numbers:(+)是数值相加函数,无法直接作用于列表,类型不匹配,Haskell不支持列表间用+操作。
  • map (+ $ filter even numbers) zeros:filter even numbers得到的是列表[2,4,6,8],而+需要的是数值参数,不能直接和列表相加,同样存在类型错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 20:00:47