gpt4 book ai didi

list - 映射列表,最后一个列表元素除外

转载 作者:行者123 更新时间:2023-12-04 09:06:28 24 4
gpt4 key购买 nike

我如何最好地映射列表的所有元素,除了最后一个列表元素?

假设我们有一个列表 let l = [1,2,3,4]并想得到[2,3,4,4] .

我确实有一个解决方案,但感觉不像是“功能性”的方法(在 ghci 中):

let l = [1,2,3,4]
let len = toIntegral $ length l -- to avoid a type mismatch Integer <-> Int
let l1 = zip l [1..]
let l2 = map (\(x,y) -> if y < len then (x + 1,y) else (x,y)) l1
let l3 = map (fst) l2

不是很好...我希望有更好的方法!由于我是函数式编程的新手,我不知道从哪里开始寻找它。

最佳答案

改写map但是当只有一个元素时做一个特殊情况:

mapBut1 :: (a -> a) -> [a] -> [a]
mapBut1 f [] = []
mapBut1 f [x] = [x]
mapBut1 f (x:xs) = f x : mapBut1 f xs

这现在甚至适用于无限列表,它比计算长度要快得多,并且更具可读性。请注意,这确实将您的函数限制为 a -> a 类型。而不是 a -> b .

或者,你可以做
mapBut1 f (x:y:xs) = f x : mapBut1 f (y:xs)
mapBut1 f other = other

它们是等价的定义,但后者使用的模式匹配少了 1 个。不过,我更喜欢前者,因为正在处理的案件更加明显。

关于list - 映射列表,最后一个列表元素除外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25852801/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com