
On Sat, May 7, 2011 at 2:10 PM, Eitan Goldshtrom
Hi. I am kind of tired of all of the parentheses I have to put in places and I'm trying to figure out what is the correct way to write code such that I can leave out parentheses. For example, I have the following:
data Message = ... --leaving this out because it's not important data Plane = Plane { id :: Int, position :: (Int,Int,Int), direction :: Int, path :: [Int], messagebuf :: Chan Message }
main = do c <- newChan :: Chan Message p <- Plane 0 (0,0,0) 0 [] c f p
f p = putStrLn $ (show Main.id p) ++ " - message received"
One thing to keep in mind is that function application binds tightest, and function application goes from left to right, so:
a b c d
is parsed as:
((a b) c) d
I'm not really sure what you're doing, but I would probably write it as:
f p = putStrLn $ show (Main.id p) ++ " - message received"
Because function application binds tightest, I don't need parenthesis around the (show ...) part. The other rule to note is the the ($) function binds the weakest of them all, so you can do a lot to the left of it and to the right of it without parentheses.
This causes an error "The function `show' is applied to two arguments". If I put instead: f p = putStrLn $ (show . Main.id p) ++ " - message received"
I get the error "Couldn't match expected type `[Char]' with actual type `a0 -> c0'". The only way it seems to work is f p = putStrLn $ (show (Main.id p)) ++ " - message received"
This seems to be the same for many other situations where I try to use function composition of some sort. It's just getting kind of annoying.
-Eitan
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe