short function to remove and replace an item

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

short function to remove and replace an item

Michael 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:

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

Vlad Skvortsov
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

Daniel Fischer-4
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

Zachary Turner-2
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

Zachary Turner-2
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