
Is your JavaScript function actually pure? - fagnerbrack
http://staltz.com/is-your-javascript-function-actually-pure.html
======
chriswarbo
I disagree with some of the claims, as I think these sorts of edge-cases
mostly serve to highlight how imprecise the given pure/impure distinction is,
and how we can't always take a semantic concept from one language (e.g.
Haskell) and apply it in another (JS).

For example, if you always get "TypeError" when calling "sum()", you can
replace "sum()" with its result ("throw TypeError") and get the same
behaviour; it doesn't break referential transparency, so is it "pure"? What do
we even mean by "result" in a language with exception handling? Do thrown
exceptions count, or only return values?

Similarly, using "valueOf" doesn't show that the sum function is impure, it
shows that the sum function is _higher-order_. If we mapped 'Math.random' over
an array, does that make 'map' impure? What does it mean to be pure/impure
when any variable can be replaced by a 'valueOf' function/procedure?

If two expressions call the same procedures, the same number of times, in the
same order, and return the same pure function of their outputs, are those two
expressions the same? Would replacing one with the other maintain referential
transparency, and does that imply "purity"?

I think the answer is that such examples need more fine-grained notions than
just "pure"/"impure". Otherwise it's just arguing over the semantics of
English, rather than semantics of programs.

