寻找和替换

时间:2015-12-24 16:17:39

标签: api haskell

我们有时想在列表中找到一个带有函数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

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

2 个答案:

答案 0 :(得分:6)

编辑:@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

答案 1 :(得分:1)

这个函数当然是map,只要你能以正确的方式组合你的谓词函数和替换函数。

findr check_f replace_f xs = map (replace_if_needed check_f replace_f) xs

replace_if_needed :: (a -> Bool) -> (a -> a) -> (a -> a)
replace_if_needed check_f replace_f = \x -> if check_f x then replace_f x else x

现在你可以做findr isAplha toUpper "a123-bc"

之类的事情了