我想返回列表中元素的前一个元素。我打算得到参数的索引,并使用它来表示反对列表,这样参数是最后一个元素,然后反转它,然后取反列表的第二个元素。我得到了错误:输入elemIndex
是Maybe Int
,而take
函数需要Int
。我想要修复它或者用简单的递归编写代码,是否有更短的使用递归的代码?
precedingElement :: Eq a => a -> [a] -> Maybe a
precedingElement elt lst | lst == [] = error "List is empty"
| elt `notElem` lst = Nothing
| otherwise = Just x where x = snd (reverse (take (elt `elemIndex` lst) lst))
发布于 2016-08-16 14:29:02
这方面的标准解决方案是使用压缩:
import Data.List (find)
preceding :: (a -> Bool) -> [a] -> Maybe a
preceding f xs = fmap snd . find (f . fst) $ zip (drop 1 xs) xs
https://stackoverflow.com/questions/38965291
复制相似问题