[Haskell-cafe] On the purity of Haskell

Steve Horne sh006d3592 at blueyonder.co.uk
Thu Dec 29 00:51:53 CET 2011


On 28/12/2011 22:01, Jerzy Karczmarczuk wrote:
> Le 28/12/2011 22:45, Steve Horne a écrit :
>> Yes - AT COMPILE TIME by the principle of referential transparency it 
>> always returns the same action. However, the whole point of that 
>> action is that it might potentially be executed (with potentially 
>> side-effecting results) at run-time. Pure at compile-time, impure at 
>> run-time. What is only modeled at compile-time is realized at 
>> run-time, side-effects included.
>> (...)
>>
>> I hope If convinced you I'm not making one of the standard newbie 
>> mistakes. I've done all that elsewhere before, but not today, honest.
> Sorry, perhaps this is not a standard newbie mistake, but you - 
> apparently - believe that an execution of an action on the "real 
> world" is a side effect.
>
> I don't think it is.
> Even if a Haskell programme fires an atomic bomb, a very impure one, 
> /*there are no side effects within the programme itself*/.
True. But side-effects within the program itself are not the only 
relevant side-effects.

As Simon Baron-Cohen says in "Tackling the Awkward Squad"...

    Yet the ultimate purpose of running a program is invariably to cause
    some side effect: a changed file, some new pixels on the screen, a
    message sent, or whatever. Indeed it's a bit cheeky to call
    input/output "awkward" at all. I/O is the raison d'^etre of every
    program. --- a program that had no observable effect whatsoever (no
    input, no output) would not be very useful.

Of course he then says...

    Well, if the side effect can't be in the functional program, it will
    have to be outside it.

Well, to me, that's a bit cheeky too - at least if taken overliterally. 
Even if you consider a mutation of an IORef to occur outside the 
program, it affects the later run-time behaviour of the program. The 
same with messages sent to stdout - in this case, the user is a part of 
the feedback loop, but the supposedly outside-the-program side-effect 
still potentially affects the future behaviour of the program when it 
later looks at stdin.

A key point of functional programming (including its definitions of 
side-effects and referential transparency) is about preventing bugs by 
making code easier to reason about.

Saying that the side-effects are outside the program is fine from a 
compile-time compositing-IO-actions point of view. But as far as 
understanding the run-time behaviour of the program is concerned, that 
claim really doesn't change anything. The side-effects still occur, and 
they still affect the later behaviour of the program. Declaring that 
they're outside the program doesn't make the behaviour of that program 
any easier to reason about, and doesn't prevent bugs.

A final SBC quote, still from "Tackling the Awkward Squad"...

    There is a clear distinction, enforced by the type system, between
    actions which may have
    side effects, and functions which may not.

SBC may consider the side-effects to be outside the program, but he 
still refers to "actions which may have side-effects". The side-effects 
are still there, whether you consider them inside or outside the 
program, and as a programmer you still have to reason about them.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20111228/4a99ed46/attachment.htm>


More information about the Haskell-Cafe mailing list