[Haskell-cafe] Typing in haskell and mathematics

Henning Thielemann lemming at henning-thielemann.de
Mon Jan 31 12:56:58 EST 2005


On Mon, 31 Jan 2005 karczma at info.unicaen.fr wrote:

> Now: 
> 
> Please don't abuse the examples based on differentiation in order to point
> out the difference between 'expressions with variables' and 'functions'.
> This is simply NOT TRUE that only functions can be differentiated. The
> differentiation is an ALGEBRAIC procedure, people acquainted with the
> differential algebra know that. 

Ok, then generalize 'function' to other mathematical objects you like. 
E.g. polynomials are a good example. For a polynomial p (a tuple) I can 
define D point-wise as
  D p = (p_1, 2*p_2, 3*p_3, ..., n*p_n)
 Then D fulfills the Leibnitz rule
  D (p0*p1) = D p0 * p1 + p0 * D p1
 this is probably what you mean.

But I still doubt that it is necessary to accept 'expressions' as
mathematical objects.

> The differentiation (derivation) operator is a linear operator which
> fulfils the Leibniz rule when acting on products.

Linearity of D means for me:

D (k*p) = k * D p
D (p0+p1) = D p0 + D p1

But what is the linearity of an operator acting on an _expression_?

For instance the Simplify function, which is rather an Identity function, 
is not linear with respect to expression:

Simplify [3*4] = 12

but if it were linear with respect to expressions it had to be

Simplify [3*4] = 3 * Simplify[4]
Simplify [3*4] = 3 * 4


> Math is not a question of notation, but of structure. 

Notation _is_ written structure. As my examples should show there is a
benefit if notation matches the structure of the considered problem.

> The double ordering:   a < b < c
> is a very well known contraption in Icon. The operator "<" may confirm
> the inegality or FAIL. The failure is something which propagates across
> all embedded expressions until it is caught. If it succeeds, then it returns
> the SECOND argument. In such a way, going from left to right, "<" gives the
> correct result. This is not 'functional' but I like it. 

I also use this short-cut, but I don't expect that to make it work in a
programming language, because you need a lot of explanation to make it
work, thus making the compiler and source code processors more
complicated. All that just for sticking to a habit!

By the way there is a nice functional implementation of a < b < c:

zapWith :: [a -> a -> b] -> [a] -> [b]
zapWith fs xs = zipWith3 id fs xs (tail xs)

usage:

and zapWith [  (<),  (<)  ]
            [a,    b,    c]


More information about the Haskell-Cafe mailing list