如何最好地映射列表中除最后一个列表元素之外的所有元素?
假设我们有一个清单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 个。不过,我更喜欢前者,因为正在处理的案件更加明显。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)