# short function to remove and replace an item

 Classic List Threaded
5 messages
Reply | Threaded
Open this post in threaded view
|

## short function to remove and replace an item

 What if I have a list xs, and I want to remove one item and replace it with another? The item to remove can be detected by a predicate function. The order of the items doesn't matter. How about this: replaceItem :: (a -> Bool) -> a -> [a] -> [a] replaceItem p new xs = new : snd (partition p xs) This will actually replace all items that match the predicate with one copy of 'new'. It will also prepend 'new' even if no items match the predicate. For another challenge, can someone explain to me how to write this in point-free style? Thanks, Mike
Reply | Threaded
Open this post in threaded view
|

## short function to remove and replace an item

 Prelude> let replaceItem p n = map (\x -> if p x then n else x) Prelude> replaceItem odd 100 [1..10] [100,2,100,4,100,6,100,8,100,10] Michael P Mossey wrote: > What if I have a list xs, and I want to remove one item and replace it > with another? The item to remove can be detected by a predicate > function. The order of the items doesn't matter. How about this: > > replaceItem :: (a -> Bool) -> a -> [a] -> [a] > replaceItem p new xs = new : snd (partition p xs) > > This will actually replace all items that match the predicate with one > copy of 'new'. It will also prepend 'new' even if no items match the > predicate. > > For another challenge, can someone explain to me how to write this in > point-free style? -- Vlad Skvortsov, [hidden email], http://vss.73rus.com
Reply | Threaded
Open this post in threaded view
|

## short function to remove and replace an item

 In reply to this post by Michael Mossey Am Donnerstag 02 April 2009 02:45:29 schrieb Michael P Mossey: > What if I have a list xs, and I want to remove one item and replace it > with another? The item to remove can be detected by a predicate > function. The order of the items doesn't matter. How about this:
Reply | Threaded
Open this post in threaded view
|

## short function to remove and replace an item

 In reply to this post by Michael Mossey On Wed, Apr 1, 2009 at 7:45 PM, Michael P Mossey <[hidden email]>wrote: > What if I have a list xs, and I want to remove one item and replace it with > another? The item to remove can be detected by a predicate function. The > order of the items doesn't matter. How about this: > > replaceItem :: (a -> Bool) -> a -> [a] -> [a] > replaceItem p new xs = new : snd (partition p xs) > > This will actually replace all items that match the predicate with one copy > of 'new'. It will also prepend 'new' even if no items match the predicate. > > For another challenge, can someone explain to me how to write this in > point-free style? > I used an intermediate helper function, but the replaceItem function is point free choose :: (a -> Bool) -> (a -> b) -> (a -> b) -> a -> b choose pred yes _ val | (pred val) = yes val choose _ _ no val = no val replaceItem :: (a -> Bool) -> a -> [a] -> [a] replaceItem pred rep = map (choose pred id (const rep)) -------------- next part -------------- An HTML attachment was scrubbed... URL: http://www.haskell.org/pipermail/beginners/attachments/20090401/aa44421e/attachment.htm
Reply | Threaded
Open this post in threaded view
|

## short function to remove and replace an item

 On Wed, Apr 1, 2009 at 9:50 PM, Zachary Turner <[hidden email]>wrote: > > > On Wed, Apr 1, 2009 at 7:45 PM, Michael P Mossey <[hidden email]>wrote: > >> What if I have a list xs, and I want to remove one item and replace it >> with another? The item to remove can be detected by a predicate function. >> The order of the items doesn't matter. How about this: >> >> replaceItem :: (a -> Bool) -> a -> [a] -> [a] >> replaceItem p new xs = new : snd (partition p xs) >> >> This will actually replace all items that match the predicate with one >> copy of 'new'. It will also prepend 'new' even if no items match the >> predicate. >> >> For another challenge, can someone explain to me how to write this in >> point-free style? >> > > I used an intermediate helper function, but the replaceItem function is > point free > > choose :: (a -> Bool) -> (a -> b) -> (a -> b) -> a -> b > choose pred yes _ val | (pred val) = yes val > choose _ _ no val = no val > > replaceItem :: (a -> Bool) -> a -> [a] -> [a] > replaceItem pred rep = map (choose pred id (const rep)) > Ok I looked at the OP again and apparently I didn't understand the wording of the question :P  I just thought it said to replace each element in the list that matched the predicate with the new item. How about this? replaceItem :: [a] -> (a -> Bool) -> a -> [a] let replaceItem xs pred = (: filter (not.pred) xs) Note that I changed the order of the arguments, the value now comes last. But I think this still should be ok? -------------- next part -------------- An HTML attachment was scrubbed... URL: http://www.haskell.org/pipermail/beginners/attachments/20090401/fec35904/attachment.htm