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

