(3) Types and expressions look very much alike. Say we have: data Tree a = Bin (Tree a) a (Tree a) | Nil.
I encourage my students to always use named record notation data Tree a = Bin { left :: Tree a, ... }
Around half (!) of the students now write (on a written test): size (Bin (Tree left) x (Tree right)) = ...
sure they had this in their mind: size (Bin ( left :: Tree a ) ( x :: a ) ( right :: Tree a )) = ... (i. e. they wanted to specify the types of formal parameters at the most natural place - at their first appearance in the text) I think the following is conceptually cleaner size ( t @ Bin { } ) = let l = left t r = right t in size l + 1 + size r (it separates matching and binding) altough the first line looks rather cryptic. NB: I wouldn't mind the language enforcing the students ( and me ) to write size ( t @ Bin { } :: Tree a ) = let l :: Tree a = left t r :: Tree a = right t in size l + 1 + size r Best regards, -- -- Johannes Waldmann ---- http://www.informatik.uni-leipzig.de/~joe/ -- -- joe@informatik.uni-leipzig.de -- phone/fax (+49) 341 9732 204/207 --