有时我们想在列表中找到一个带有函数的元素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
Run Code Online (Sandbox Code Playgroud)
主模块中是否有与此类似的功能?
编辑:@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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
52 次 |
| 最近记录: |