[Haskell-beginners] length problem
Alex Hammel
ahammel87 at gmail.com
Fri Feb 6 20:35:01 UTC 2015
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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/beginners/attachments/20150206/e026deda/attachment-0001.html>
More information about the Beginners
mailing list