The 'deleteBy' function behaves like 'delete',
instead of deleting the first occurrence of element, it deletes the element
based on given predicate function.
For Example, as per following function, two numbers
are equal if their remainders are equal.
check a b = ((a `mod` 10) == (b `mod` 10))
When you execute the following statement,
deleteBy check 20 [2, 3, 5, 100, 123, 400]
It compares the elements based on ‘check’ function.
As per this function 20, 100, 400 are equal, since their remainders are zero,
when divided by 10. It removes 100 from
the list.
*Main> :m Data.List Prelude Data.List> Prelude Data.List> :t deleteBy deleteBy :: (a -> a -> Bool) -> a -> [a] -> [a] Prelude Data.List> Prelude Data.List> let check a b = ((a `mod` 10) == (b `mod` 10)) Prelude Data.List> Prelude Data.List> deleteBy check 20 [2, 3, 5, 100, 123, 400] [2,3,5,123,400] Prelude Data.List> Prelude Data.List> deleteBy check 23 [2, 3, 5, 100, 123, 400] [2,5,100,123,400]
ListUtil.hs
deleteByPredicate :: (a->a->Bool) -> a -> [a] -> [a] deleteByPredicate fun ele [] = [] deleteByPredicate fun ele (x:xs) | (ele `fun` x) = xs | otherwise = x : deleteByPredicate fun ele xs
*Main> :load ListUtil.hs [1 of 1] Compiling Main ( ListUtil.hs, interpreted ) Ok, modules loaded: Main. *Main> *Main> :t deleteByPredicate deleteByPredicate :: (a -> a -> Bool) -> a -> [a] -> [a] *Main> *Main> let check a b = ((a `mod` 10) == (b `mod` 10)) *Main> *Main> deleteByPredicate check 20 [2, 3, 5, 100, 123, 400] [2,3,5,123,400] *Main> *Main> deleteByPredicate check 23 [2, 3, 5, 100, 123, 400] [2,5,100,123,400] *Main>
No comments:
Post a Comment