[Haskell-cafe] Re: search Data.Tree.Zipper

Jian Fan abemud at gmail.com
Tue Mar 9 14:37:12 EST 2010


Thanks. `mplus` is the glue I was looking for. The original algorithm
has a bug. Following is what I have for now:

searchTree pred rootLoc
 | pred (getLabel rootLoc) = Just rootLoc
 | otherwise = (right rootLoc >>= searchTree pred)
        `mplus` (firstChild rootLoc >>= searchTree pred)

Jian


MightyByte <mightybyte at gmail.com> wrote:
> I haven't tested it, but I think you're looking for something like this:
> 
> searchTree2 :: (a -> Bool) -> TreeLoc a -> Maybe (TreeLoc a)
> searchTree2 pred rootLoc =
>  if pred (getLabel rootLoc)
>    then Just rootLoc
>    else firstChild rootLoc >>= siblings
>  where siblings loc = searchTree2 pred loc `mplus`
>                                (searchTree2 pred =<< right loc)
> 
> 
> On Mon, Mar 8, 2010 at 1:11 PM, Jian Fan <abemud at gmail.com> wrote:
>> Hi,
>>
>> There doesn't seem to be a function to search the tree so
>> I come up with following function:
>>
>> searchTree :: (a -> Bool) -> TreeLoc a -> Maybe (TreeLoc a)
>> searchTree pred rootLoc =
>>  if pred (getLabel rootLoc) then
>>    Just rootLoc
>>    else case firstChild rootLoc of
>>      Just loc -> case searchTree pred loc of
>>        Just loc -> Just loc
>>        Nothing -> case right loc of
>>          Just rLoc -> searchTree pred rLoc
>>          Nothing -> Nothing
>>      Nothing -> Nothing
>>
>> Which feels quite ugly. Any suggestions? Thanks.
>>
>> Jian
>>
>> _______________________________________________
>> Haskell-Cafe mailing list
>> Haskell-Cafe at haskell.org
>> http://www.haskell.org/mailman/listinfo/haskell-cafe
>>



More information about the Haskell-Cafe mailing list