
On Mon, Dec 03, 2012 at 12:28:08PM +0000, Miguel Negrao wrote:
Hi list,
Is there a syntax in Haskell for partial application that would be something like this the following ?
f a b c d = a +b+ c+ d
g = f _ 1 2 3
or the only way to do it is like below ?
g = (\x -> f x 1 2 3)
Yes, a lambda is the only way to do it.
Also, hlint complains about top-level functions without type even if they are not exported out of the corresponding module. Is is really bad style not put type signatures in all top-level functions ? I really like the fact that haskell takes care of the type signatures for me.
Yes, it is bad style. Let me give you two reasons why I always encourage putting type signatures on all top-level functions. Whether they are exported or not really makes no difference. 1. Writing the type signature for a function *first*, before implementing it, really helps a LOT in clarifying things in your own mind. If you cannot write down the intended type of a function then you do not understand what it is supposed to do. If you do not understand what it is supposed to do then how do you expect to be able to implement it? 2. Suppose you make a mistake when implementing a function. If you don't give a type signature, it's possible that GHC will infer some type for it anyway (but not the type you intended!). Now you will not get an error until further down the line when you use that function somewhere else. And what's more, the error will not tell you anything about the real problem. It will just say "X does not match Y on line 297" and you will have to do a lot of work to figure out that the real problem is that you messed up in implementing function foo on line 43. But if you had put a type signature on foo in the first place, you would have gotten an error immediately. -Brent