First, I am happy to see that Haskell 1.3, with its many valuable
improvements over Haskell 1.2, is finally getting ready,
but I also have a comment:
In the syntax for labeled fields (records) the symbol <- is chosen
as the operator used to associate a label with a value in
constructions and patterns:
data Date = Date {day, month, year :: Int}
today = Date{day <- 11, month <- 10, year <- 1995}
According to a committee member, there were no convincing reasons
why <- was chosen. Other symbols, like = and := were also considered.
Here are some (in my opinion) good reasons for using = instead of <- :
1. In ordinary declarations, :: is used to specify the type of a name
and = is used to specify its value:
day, month, year :: Int
day = 11; month = 10; year = 1995
so for consistency I think the same notations should be used
inside record values:
data Date = Date {day, month, year :: Int}
date :: Date
date = Date {day = 11, month = 10, year = 1995}
2. The <- symbol is used also in list comprehensions and the new
monad syntax ('do'):
[ 2*x | x <- [1..10] ]
do c <- getChar; putChar c
In these uses of <- the name on the lhs does not have the same
type as the expression on the rhs (above, x::Int, but [1..10]::[Int]
and c::Char but getChar::IO Char). The value that the lhs name
(or, indeed, pattern) is bound to is "extracted" from the value
of the rhs expression. This is very different from what happens
with field labels, so a difference in syntax is motivated.
Sadly, I suspect it would be difficult to convince the committee to
change their minds about this at this late stage, but I am sure it
would be even more difficult to change it for a later version of
Haskell...
Regards,
Thomas Hallgren