
an arg. My initial guess is that the *first* type specified is the one returned, but I’m not sure. I'm curious as to why you thought that. The directionality of the arrows in a type signature is quite clear, at least to me. a -> b is the type of functions *from* a *to* b. Well, most of the languages that I’ve used are dynamically typed, but the one language that I’m _kinda_ familiar with that _is_ statically typed is C: several of the Haskell tutorials that I’ve been reading describe that:
A :: Int means that *A* is _of_ type *Int*, which kind of sounds like A returns type Int functions such as map :: (a -> b) -> [a] -> [b] (can you guess what it does and how it does it? Can you do that just by looking at the type?). Map appears to take a lambda function, which takes type *a* returning type *b* (both of which are purely arbitrary), a list of type *a*, and returns a list of type *b*, applying the lambda function to each element in the list of type *a*. From your coding style, it appears that you think of && in the way Bash does - as the function:
p && x = if p then x else *nothing*
Something like that. Anyway, all of the above means that passing a non-Bool value to && is not acceptable, and since hPutStr stdout string is not a value of type Bool, GHC complains. Makes sense. -- Alexej Magura Sent with Airmail