[Haskell-beginners] length problem
Alex Hammel
ahammel87 at gmail.com
Fri Feb 6 20:47:49 UTC 2015
Yep, that's correct
On Fri, Feb 6, 2015 at 12:41 PM, Roelof Wobben <r.wobben at home.nl> wrote:
> Alex Hammel schreef op 6-2-2015 om 21:35:
>
> You can think of zipWith as a function that combines the values of two
> lists. If you want to add the numbers in two lists you can do this:
>
> zipWith (+) [1, 2, 3] [4, 5, 6]
>
> which is the same thing as:
>
> [1+4, 2+5, 3+6]
>
> which results in [5, 7, 9]
>
> When you call zipWith ($) you're just applying the functions in one list
> to the values in another. E.g.:
>
> zipWith ($) [(+1), (+2), (+3)] [1, 2, 3]
>
> is the same thing as
>
> [($) (+1) 1, ($) (+2) 2, ($) (+3) 3]
>
> which is the same thing as
>
> [1+1, 2+2, 3+3]
>
> once you've rewritten it in sane syntax.
>
> So the example I gave:
>
> zipWith ($) [id, (+1), id, (+1)] [1, 2, 3, 4]
>
> is the same thing as
>
> [id 1, 2+1, id 3, 4+1]
>
> On Fri, Feb 6, 2015 at 12:24 PM, Roelof Wobben <r.wobben at home.nl> wrote:
>
>> YCH schreef op 6-2-2015 om 20:54:
>>
>> Thanks for explanation.
>> 2015. 2. 7. 오전 4:42에 "Alex Hammel" <ahammel87 at gmail.com> 님이 작성:
>>
>>> This is mostly for my own recreation, feel free to ignore it.
>>>
>>> Your solution is fine, but it lacks modularity. What if you discover
>>> that you don't actually want to double every other number but triple it? Or
>>> if the list of numbers is suddenly a list of words and you need to
>>> capitalize every other one? You don't want to have to write a new function
>>> from scratch. Let's make a function that applies any function to every
>>> other value:
>>>
>>> everyOther :: (a -> a) -> [a] -> [a]
>>> everyOther _ [] = []
>>> everyOther _ [x] = [x]
>>> everyOther f (x:y:xs) = x : f y : everyOther f xs
>>>
>>> doubleEveryOther :: [Int] -> [Int]
>>> doubleEveryOther = everyOther (*2)
>>>
>>> But hang on, what if the requirements change again and now we have to
>>> double every third value? Writing something like this is no fun:
>>>
>>> everyThird :: (a -> a) -> [a] -> [a]
>>> everyThird _ [] = []
>>> everyThird _ [x] = [x]
>>> everyThird _ [x,y] = [x,y]
>>> everyThird f (x:y:z:xs) = x : y : f z : everyThird f xs
>>>
>>> And the implementation of everyHundredAndFifth will obviously be
>>> ridiculous. Clearly what we need is an `everyNth` function which allows the
>>> programmer to specify which list elements the function is applied to.
>>>
>>> One trick is to create a list of functions and use zipWith ($). ($) is
>>> just function application; so a list with `id` at every position except the
>>> nth will work:
>>>
>>> λ zipWith ($) [id, (+1), id, (+1)] [1, 2, 3, 4]
>>> [1,3,3,5]
>>>
>>>
>> Here I miss you,. I have only done the first chapter of the NIC course
>> and it not talked about using zipWith.
>>
>> I only learned recursion and how that worked on list.
>>
>> So can you explain how only the second item is added by 1 .
>>
>> As soon as I understand that part I will study the rest and I think I
>> have more questions.
>>
>> Roelof
>>
>>
>> _______________________________________________
>> Beginners mailing list
>> Beginners at haskell.org
>> http://www.haskell.org/mailman/listinfo/beginners
>>
>>
>
>
> _______________________________________________
> Beginners mailing listBeginners at haskell.orghttp://www.haskell.org/mailman/listinfo/beginners
>
>
> Oke, I think I get it.
>
> So if I want to add +1 to the thirt item I can do this : λ zipWith ($)
> [id, id, (+1), id] [1, 2, 3, 4] which gives [1.2.4.4]
>
> Am i correct ?
>
> Roelof
>
>
> Roelof
>
>
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://www.haskell.org/mailman/listinfo/beginners
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/beginners/attachments/20150206/1d757436/attachment.html>
More information about the Beginners
mailing list