In Haskell 'do { e1; e2 }' expands to 'bind e1 (\_ -> e2) ' and does not fix 
"return type" of 'e1'. This is usable, for example, with parser combinators, 
where we often need call parser and discards its value. Another example --- IO 
action, which returns some non-interesting technical details (as num of 
inserted rows or elapsed time).

In Ur, one need noisy 'ignore e1; e2' or (with unused free in 'e2' variable) 
'_i <- e1; e2' if type 'e1' is not 'm {}'. Does this really help to prevent 
errors? Which kinds? I am sure, the cost is too large.

At least, this difference should be documented in the reference manual: I have 
thought that improperly declared monad for a some time.

PS. And also fix typo in chapter 4.1, Lexical conventions, of manual.pdf: in 
the second row of table ASCII representation of long arrow should be '-->' but 
is '->'

_______________________________________________
Ur mailing list
[email protected]
http://www.impredicative.com/cgi-bin/mailman/listinfo/ur

Reply via email to