Ezra Lalonde ezra.lalonde at gmail.com
Tue Nov 17 18:31:19 EST 2009

```Using the same basic structure you did, and foldr, I think below is the
simplest method:

====================
import Data.Maybe

searchList :: (a -> Bool) -> [a] -> Maybe [a]
searchList p xs = foldr (\x acc -> if p x then Just (x: fromMaybe [] acc)
else acc) Nothing xs
====================

ghci> searchList (=='o') "A quick brown fox"
Just "oo"
ghci> searchList (==' ') "A quick brown fox"
Just "   "
ghci> searchList (=='z') "A quick brown fox"
Nothing

>From maybe gets rid of the Maybe, so that our recursive call works:
ghci> fromMaybe [] (Just [1..3])
[1,2,3]

That's why we got the error below when we tried without fromMaybe; on
subsequent applications of foldr, the type would have to change.
====================
<interactive>:1:51:
Couldn't match expected type `[a]'
against inferred type `Maybe [a]'
In the expression: if p x then Just (x : acc) else acc
In the first argument of `foldr', namely
`(\ x acc -> if p x then Just (x : acc) else acc)'
In the expression:
foldr (\ x acc -> if p x then Just (x : acc) else acc) Nothing xs
====================

I have a feeling that using fromMaybe is not the best way, but it gets the
job done for now.

On that note; if somebody with some more experience would chime in, that'd
be awesome. ;)

Ezra

dima.neg wrote:
>
> How can I do this using foldr?
>
> searchList p [] = Nothing
> searchList p (x:xs)
> 		| p x = Just (x:filter p xs)
> 		| otherwise = searchList p xs
>
>
> I try this:
> searchList p xs = foldr (\x acc -> if p x then Just (x:acc) else acc)
> Nothing xs
> but don't work.
>
> Thanks
>

--
View this message in context: http://old.nabble.com/Recursive-to-foldr-tp26368900p26399795.html