Syntax¶
concat to cons¶
Consider this implementation of zipWith:
myZipWith :: (a -> b -> c) -> [] a -> [] b -> [] c
myZipWith _ [] _ = []
myZipWith _ _ [] = []
myZipWith f (x : xs) (y : ys) = [f x y] ++ myZipWith f xs ys
Note the ++ concat infix function on the last line.
Because we are using it, and it takes lists as arguments, we must enclose f x y inside braces to make the result of f x y become a list.
If we would switch from ++ concat to : cons, we don’t need to wrap f x y with square braces, as we would then be “consing a value onto more list”:
- [f x y] ++ myZipWith f xs ys
+ f x y : myZipWith f xs ys
Function application has the highest precedence.
When myZipWith is applied to f xs ys, currying causes it to apply it to f only first, which returns a partially applied function that then is applied to xs, which again returns a partially applied function which is then finally applied to ys, meaning myZipWith is fully applied by now.
Only then is the infixr 5 : cons constructor applied to the result of f x y and myZipWith f xs ys.