caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: skaller <skaller@users.sourceforge.net>
To: Michael Walter <michael.walter@gmail.com>
Cc: caml-list <caml-list@inria.fr>
Subject: Re: [Caml-list] environment idiom
Date: 13 Dec 2004 17:18:36 +1100	[thread overview]
Message-ID: <1102918715.2768.240.camel@pelican.wigram> (raw)
In-Reply-To: <877e9a1704121218456af9df9@mail.gmail.com>

On Mon, 2004-12-13 at 13:45, Michael Walter wrote:
> > The claims that monadic programming allows side effect
> > free transparent purely functional encoding is unquestionably
> > bogus.
> In your view, would claiming that the stream approach allowed that be
> bogus as well?

I think I am saying something like this: if you claim

	"Mine is bigger"

what would you say? Bigger than what? A comparative needs two
arguments or it is meaningless.

With that idea in mind, any claim that X is transparent is automatically
bogus without context, you really need to say instead

	"X is transparent at the Y level"

Of course I'm not implying a strict stratification by the
use of the word "level", merely ignorance of the proper
way to structure the statement.

> main :: [Response] -> [Request]
> 
> In a pure language, main is obviously pure as well. And still, _given
> the proper "invocation" from an impure language_, it allows for I/O.

I have seen theoretical models of functional languages where
an imperative machine calculates functions -- an interactive
interpreter that is entirely lazy isn't much use :)

So at the top level, the system isn't functional,
but for each individual calculation it is.

However this is a fairly primitive and boring situation.
Monadic Haskell, and Ocaml, are far more interesting
because the interactions are more complex.

Another example is my Felix language. It has both functions
and procedures. Functions aren't allowed to have side effects,
yet they're not pure in the sense the result can depend
on variables which change between (but not during) invocations.
[This has an alarming effect on the optimiser ..]

In addition, you can say that the procedural code is actually
functional, since it works by resumptions, a style of continuation
passing where code executes for a while then returns a new
continuation. In some places, it is the same object, modified,
and in others a clone is made first, so that it really is
purely functional -- with respect to that continuation at least.


> To paraphrase: Does the mere existance of a "magic main invocation"
> (whether a streaming-main or an IO monadic-main) make a language
> impure, in your concept?

If the 'magic main' is part of the semantic specification yes,
otherwise no.. and clearly here the division is quite plain
and well defined. Clearly you can reason about the 
'functional subsystem' using transparency, and then combine
the result with reasoning about the top level 'magic main'
where the program as a whole is not transparent ... and you still
have 'ease of reasoning' in the combination.

> Again I believe we are talking about different kinds of "purity".
> Thomas is obviously right in that the StateTransformer monad (modulo
> unsafe conversions) is pure, you are obviously right in the
> (different) point that _running_ an IO fragment has side effects.

Yes, but that is precisely the point. In wishing to avoid 
the kind of hype normally associated with OO and Java,
I think it is necessary to reconsider exactly what
crude statements like 'it is pure and transparent' actually
mean.

> Generally, I'm not sure whether it's sensible to qualify other
> people's statements as "unquestionably bogus". Everything is relative
> <wink> :)

It was actually *my* statement that I labelled 'unquestionably
bogus', namely that Haskell (including all monadic programming)
is pure and transparent (and side effect free) when clearly
any kind of I/O at the OS level is not.

However the claim is not *wrong*, instead I'm claiming
it isn't a well formed formula: 'pure' is a predicate
that has to be applied to a particular level of encoding,
and then you can reason about that level using that
property -- but that isn't enough to reason about correctness,
since it invariably means checking the program meets some
specification given at a much higher level of abstraction.

So given the utility of transparency for reasoning,
one might find some styles of monad preserved transparency,
even in their higher levels of interpretation, whilst
other did not. And that would be valuable, since it would
be a way to guide the choice of techniques, whereas
a bland 'it is all transparent and pure' fails to
provide sufficient distinctions.

Since I'm not a Haskell programmer it is hard to give examples,
but for Ocaml I'm sure we all know that some uses of 
imperative programming technique feel 'safer' than others.
They threaten purity less. But this is just waffle.
I'd like to have a better guideline.

Obvious example -- references are 'safer' if you keep their
scope local -- for example I do this a lot, and whilst it
isn't pure it is not too bad:

	let f x = 
		let a = ref 0 in
		for i = 1 to x do incr a done;
		!a

Why are localised uses of mutation
less of a threat to reasoning than less localised ones?

Because it's encapsulated in the function .. but that is
a waffle explanation .. how about more general 
theoretical account of this phenomena?

-- 
John Skaller, mailto:skaller@users.sf.net
voice: 061-2-9660-0850, 
snail: PO BOX 401 Glebe NSW 2037 Australia
Checkout the Felix programming language http://felix.sf.net




  reply	other threads:[~2004-12-13  6:18 UTC|newest]

Thread overview: 57+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-12-09  2:07 HENRIKSON, JEFFREY
2004-12-09  4:47 ` [Caml-list] " Jacques Garrigue
2004-12-09  6:02   ` Michael Walter
2004-12-09 11:28     ` Jacques Garrigue
2004-12-09 20:02     ` pad
2004-12-09 23:11       ` Jacques Garrigue
2004-12-10  2:30         ` skaller
2004-12-09  9:09 ` Richard Jones
2004-12-09 13:12   ` [Caml-list] " Ville-Pertti Keinonen
2004-12-10 11:59     ` Richard Jones
2004-12-10 10:52 ` [Caml-list] " Andrej Bauer
2004-12-10 12:13   ` Richard Jones
2004-12-10 23:35     ` Jacques Garrigue
2004-12-11  2:30   ` skaller
2004-12-11 14:31     ` Andrej Bauer
2004-12-11 18:13       ` Markus Mottl
2004-12-11 23:56         ` skaller
2004-12-12  2:36           ` William Lovas
2004-12-12  5:33             ` skaller
2004-12-12 19:09               ` Michael Walter
2004-12-13  0:48                 ` skaller
2004-12-13  2:03                   ` Michael Walter
2004-12-13  2:05                     ` Michael Walter
     [not found]                       ` <877e9a170412121844b633bb8@mail.gmail.com>
2004-12-13  2:45                         ` Michael Walter
2004-12-13  6:18                           ` skaller [this message]
2004-12-13  7:08                             ` skaller
2004-12-13  9:56                             ` Michael Walter
2004-12-13 12:59                               ` skaller
2004-12-13  8:56                           ` Thomas Fischbacher
2004-12-13  9:21                             ` Jacques Garrigue
2004-12-13 10:05                               ` Michael Walter
2004-12-13 10:29                                 ` Thomas Fischbacher
2004-12-13 21:16                                   ` Michael Walter
2004-12-13 10:20                               ` Thomas Fischbacher
2004-12-13 12:09                                 ` Jacques Garrigue
2004-12-13 12:48                                   ` Thomas Fischbacher
2004-12-13 14:09                                   ` skaller
2004-12-13 21:39                                     ` Michael Walter
2004-12-13 13:22                                 ` skaller
2004-12-13 16:54                                   ` Marcin 'Qrczak' Kowalczyk
2004-12-13 18:44                                   ` Thomas Fischbacher
2004-12-13 10:11                             ` Michael Walter
2004-12-13 11:46                             ` skaller
2004-12-13  5:41                     ` skaller
2004-12-13  9:29                       ` Michael Walter
2004-12-13 12:30                         ` skaller
2004-12-13 13:49                           ` Martin Berger
2004-12-12 23:03           ` Thomas Fischbacher
2004-12-13  1:26             ` skaller
2004-12-13  8:37               ` Thomas Fischbacher
2004-12-13 10:53                 ` skaller
2004-12-13 11:38                   ` Martin Berger
2004-12-13 13:33                     ` skaller
2004-12-13 12:01                   ` Thomas Fischbacher
2004-12-13 13:41                     ` skaller
2004-12-11 23:29       ` skaller
2004-12-12  0:21         ` Jacques Carette

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1102918715.2768.240.camel@pelican.wigram \
    --to=skaller@users.sourceforge.net \
    --cc=caml-list@inria.fr \
    --cc=michael.walter@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).