Subject: Re: [xsl] The real harm is in functions with side effects (Was: Re: Using Extension Functions - Its Efficiency) From: "Kurt Cagle" <kurt@xxxxxxxxxxxxx> Date: Mon, 19 Jan 2004 01:22:21 -0800 |
Dmitri, I'm somewhat familiar with monads in Haskell; I actually had a chance last year to delve into Haskell in preparation for a class that I didn't end up taking after all (long story), but the notion of the monads makes a great deal of sense. In essence, you are creating an algebra of functional compositions to effect type constructors, as I understand the theory. This bias of course is not completely unheard of on the imperative side. It took me a long time to really understand why Kernighan and Ritchie did not include i/o as a core functionality of the C language (ditto Pascal) and it was really only with the fact that K&R understood the implicit problems with side-effect-oriented languages but didn't yet have a foundation upon which to formalize that relationship (as C preceded Haskell by several years, if memory serves). Perhaps the question that should be raised at this stage is whether in fact there is a way to introduce monadic characteristics into XSLT2 at this late date. I'm currenly working on a publishing system that is HEAVILY XSLT2 based, and struggling to keep my programmers on the straight and narrow wrt side-effect oriented language. Could you point me to the direction of your monographs on monads in XSLT2? I remember skimming it once, but I was heads down in SVG code at the time and hadn't really taken the time to understand it. -- Kurt ----- Original Message ----- From: "Dimitre Novatchev" <dnovatchev@xxxxxxxxx> To: <xsl-list@xxxxxxxxxxxxxxxxxxxxxx> Sent: Friday, January 16, 2004 12:44 AM Subject: Re: [xsl] The real harm is in functions with side effects (Was: Re: Using Extension Functions - Its Efficiency) > Hi Kutrt, > > > Dmitri, > > > > We've talked on this issue before, and in the main I agree with you > about > > the issue of side effects. > > Yes, we agree on this issue and have essentially the same understanding > about it. > > > This holds true in certain contexts especially > > (the use of an imperative variable as an incrementer, for instance, > > something that isn't as big of an issue with XSLT2 and sequences), > > The problem is not with XSLT or XSLT2 or with any functional language. The > problem is that once you allow external functions, you cannot have any > guarantees about their being side-effects free. > > So, the side effect happens within the external environment of the > extension function and nothing can prevent it. > > An example is storing and updating (state) data outside of XSLT. > > The simplest and shortest example can be given with the use of the > date:time() EXSLT extension function. > > In this case the programmer doesn't have to store and update the time -- > this is done for them automatically :o) :(( > > Take this code: > > <xsl:stylesheet version="1.0" > xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > xmlns:dt="http://exslt.org/dates-and-times" > exclude-result-prefixes="dt" > > > > <xsl:variable name="vT1" select="dt:time()"/> > <xsl:variable name="vT2" select="dt:time()"/> > > <xsl:template match="/"> > <xsl:value-of select="$vT2"/> > <xsl:for-each select="document('')//node() > | document('')//@* > | document('')//namespace::*"> > <xsl:for-each select="document('')//node() > | document('')//@* > | document'')//namespace::*"> > > <xsl:value-of select="concat('
', position())"/> > </xsl:for-each> > </xsl:for-each> > > > <xsl:value-of select="$vT1"/> > </xsl:template> > </xsl:stylesheet> > > > Any assumptions that $vT2 >= $vT1 are wrong. > > In fact, when run with XalanJ 2.4.1 the result is: > > 09:11:50+01:00+01:00 > > [noise output] > > 09:11:51+01:00+01:00 > > > > > > and I > > know that I work hard to educate my programmers about the dangers of > > dealing > > with side-effect systems. The problem that comes with XSLT2 is the fact > > that > > any access to a web service is implicitly a side-effect - the same call > > with > > the same parameters to the same web service will potentially return > > different values and moreover potentially change the state of the called > > service. Ditto the notion of <xsl:document-result> with a packet of > > information being sent to a web service. > > > > In other words, a side-effect free environment can only realistically be > > maintained if the system itself is completely closed, yet most of the > > interesting uses of XSLT only emerge when you open up the system a > > bit ... > > A side-effect free environment is completely useless, because it cannot > print (a side-effect operation!) any processing results. > > We have to live with side-effects and we actually can use side-effects in > a controlled manner. > > Unfortunately, some functional languages (XSLT included) lack a built-in > support for controlling side-effects. > > Haskell has the notion of a Monad class built-into the language and any > programmer simply uses the IO (or any other suitable type) Monad, when > this is necessary. > > I have my implementation of a Monad class - like support in XSLT and it > allows functions with side-effects to be used in a safe and controlled > manner. > > > however, I liken this to a novice trying to play jazz vs. a master jazz > > musician -- the master will break the rules all the time, but only > > because > > he knows exactly why those rules exist in the first place and he weighs > > the > > risk of breaking them as the cost of achieving art. > > Actually, there is no risk -- the master knows and follows *additional > rules* (Monads) that eliminate the risk completely. The master is a master > because he knows something in addition to the rules used by the novices. > > > The novice breaks > > them > > out of ignorance, and just creates bad music, but it is the only way > that > > the novice will learn what those rules are in the first place. > > Fortunately, false melody can be felt immediately. > > However, in the case of programming everything may seem OK untill suddenly > (e.g. with the use of another XSLT processor or a new version of the same > XSLT processor) some completely surprizing results start to appear and it > is impossible for the novice to understand and explain them. > > > Dimitre Novatchev. > FXSL developer > > http://fxsl.sourceforge.net/ -- the home of FXSL > Resume: http://fxsl.sf.net/DNovatchev/Resume/Res.html > > > __________________________________ > Do you Yahoo!? > Yahoo! Hotjobs: Enter the "Signing Bonus" Sweepstakes > http://hotjobs.sweepstakes.yahoo.com/signingbonus > > XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list > > XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] The real harm is in funct, Dimitre Novatchev | Thread | Re: [xsl] The real harm is in funct, David Tolpin |
Re: [xsl] encoding <-> omit-xml-dec, David Carlisle | Date | Re: [xsl] The real harm is in funct, David Tolpin |
Month |