7 ms·
"He hadn’t quite internalized left-hand side vs. right-hand side." This is noteworthy. In mathematics, equality is symmetric (a=b is the same as b=a). In pro
by joechung 17y ago
"He hadn’t quite internalized left-hand side vs. right-hand side." This is noteworthy.
In mathematics, equality is symmetric (a=b is the same as b=a).
In programming, variable assignment is asymmetric (a=b is not the same as b=a).
Some programming languages recognize this but get the change wrong by changing the equality operator to == or === and always preferring assignment to be =. Some get it right, e.g., := as assignment.
- lsb 17y agoYup, in Haskell it's as explicit as a <- for assignment, and = for what amounts to pattern equality.
- lanaer 17y agoIirc, it isn’t even assignment, it’s a monad extraction. e.g. a <- [2] … gives a the value of 2, unwrapping the List monad (only works if the return value of the function is a List of some kind). The above could also be written: [2] >> (\a -> …) It’s been a while since I’ve done much with haskell, so forgive me if I’ve mis-remembered something.
- sharkbrainguy 17y agoI accidentally downvoted this...
- llimllib 17y agoI know that's what it does under the covers, but is there any reason not to think of it as assignment in your head? That's the mental construct I use in my extremely limited Haskell coding, anyway.
- lanaer 17y agoBecause if you think of it as assignment, the fact that a <- [2] binds a to 2, rather than [2], makes no sense. edit: a better example (because it is more useful) would be: a <- Just 2 which, again, binds a to 2, unwrapping the Maybe monad in the process. (I forget what happens if you try to do a <- Nothing)
- shachaf 17y agoAs lanaer said, "<-" is really syntax sugar for ">>=" (bind), and could mean a variety of things (including assignment). "=" is binding a variable, as in "let", and is not symmetric. One could argue that a better name for "=" would be "->", as in "case". (Comparison, which is symmetric, is "==".)
- dmnd 17y agoI don't know where I picked this up, but I use asymmetric whitespace around the assignment operator: a= b. It provides a subtle hint that assignment is not equality.
- mahmud 17y agoYou need to sit down with your text editor and see if you can teach it a few tricks.
- patio11 17y agoSome get it right, e.g., := as assignment. This is a tradeoff of one hard day in your teens ("But but but equals should work both ways! head explodes") and thirty seconds every time you pick up a new language ("Assignment operator is equals? Got it.") versus typing more several dozen or hundred times a day every day for the rest of your professional life.
- mattmcknight 17y agoYes, but don't overlook the "Let x =" syntax of mathematics. Programming has just dropped the "let". So, really there is a choice to be made about how to resolve that ambiguity in a language parser. Visual Basic has the nice case of A = B = C setting A equal to the boolean expression B = C.
- greggraham 17y agoOld versions of BASIC used LET for assignment, but Microsoft BASIC and other BASICs of that era dropped it as being unnecessary.
- jules 17y agoLet in mathematics doesn't really work that way. It's more general. "Let <boolean expression>" means that the world gets set up so that the boolean expression is true. Examples: Let x=4 Let epsilon>0 Let a in A There's very interesting work on providing an iteration construct like this in a programming language. http://www.cs.cornell.edu/Projects/jmatch/ http://www.cs.cornell.edu/Projects/jmatch/
- Hexstream 17y agoNot completely, Lisp uses let for variable bindings... (let ((x 5) (y 10)) (+ x y)) => 15