I have started learning Haskell and I have read that every function in haskell takes only one argument and I can't understand what magic happens under the hood of Haskell that makes it possible and I am wondering if it is efficient.
Example
>:t (+)
(+) :: Num a => a -> a -> a
Signature above means that (+)
function takes one Num
then returns another function which takes one Num
and returns a Num
Example 1 is relatively easy but I have started wondering what happens when functions are a little more complex.
My Questions
For sake of the example I have written a zipWith
function and executed it in two ways, once passing one argument at the time and once passing all arguments.
zipwithCustom f (x:xs) (y:ys) = f x y : zipwithCustom f xs ys
zipwithCustom _ _ _ = []
zipWithAdd = zipwithCustom (+)
zipWithAddTo123 = zipWithAdd [1,2,3]
test1 = zipWithAddTo123 [1,1,1]
test2 = zipwithCustom (+) [1,2,3] [1,1,1]
>test1
[2,3,4]
>test2
[2,3,4]
- Is passing one argument at the time (scenario_1) as efficient as passing all arguments at once (scenario_2)?
- Are those scenarios any different in terms of what Haskell is actually doing to compute
test1
andtest2
(except the fact that scenario_1 probably takes more memory as it needs to savezipWithAdd
andzipWithAdd123
) - Is this correct and why? In scenario_1 I iterate over
[1,2,3]
and then over[1,1,1]
- Is this correct and why? In scenario_1 and scenario_2 I iterate over both lists at the same time
I realise that I have asked a lot of questions in one post but I believe those are connected and will help me (and other people who are new to Haskell) to better understand what actually is happening in Haskell that makes both scenarios possible.
test2
you also each time called it with one parameter, sincezipWithCustom (+) [1,2,3] [1,1,1]
is short for((zipWithCustom (+)) [1,2,3]) [1,1,1]
. – Willem Van Onsemf
and the lists. – Willem Van OnsemzipWithCustom (+)
you simply construct a new function that will take the list, and then one that will take the other list. SozipWith (+)
basically constructs a new function, not a list. – Willem Van Onsem