当前位置:  开发笔记 > 编程语言 > 正文

寻找和替换

如何解决《寻找和替换》经验,为你挑选了1个好方法。

有时我们想在列表中找到一个带有函数的元素a -> Bool并使用函数替换它a -> a,这可能会产生一个新的列表:

findr :: (a -> Bool) -> (a -> a) -> [a] -> Maybe [a]
findr _ _ [] = Nothing
findr p f (x:xs) 
  | p x = Just (f x : xs)
  | otherwise = case findr p f xs of Just xs -> Just (x:xs)
                                     _ -> Nothing

主模块中是否有与此类似的功能?



1> CR Drost..:

编辑:@gallais指出你最终只更改了第一个实例; 我以为你在改变每个实例.

这样做break :: (a -> Bool) -> [a] -> ([a], [a])可以为您提供不满足谓词的最长前缀,然后是列表的其余部分.

findr p f list = case break p list of
             (xs, y : ys) -> Just (xs ++ f y : ys)
             (_, [])      -> Nothing

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有