[Haskell-cafe] Re: Hit a wall with the type system

Chris Smith cdsmith at twu.net
Wed Nov 28 23:58:07 EST 2007


The question I asked is about how to type the differentiation function.  
Whether the function is correct is a different question, which I'm happy 
to talk about; but understand that it's just an example I was playing 
with.

Luke Palmer wrote:
> Oh, I think I totally missed the point.  I missed the word "simple".
> 

No, I don't think you did miss the point in terms of what the code is 
doing.  I said simple because I'm not thinking about vector-valued or 
multidimensional functions, partial derivatives, gradients, etc.  This 
is on functions from numbers to numbers, where "numbers" are defined by 
the three type classes Num, Fractional, and Floating.  I (probably 
incorrectly) used "simple" to say so.

> I think the problem is that a function of type Num a => a -> a can be any
> function whatsoever, it does not have to be a simple combination of operators
> (it could, for example, use show, do a string transformation, and then read
> the result).

Well, no you couldn't read the result directly, since Num is a subclass 
of only Eq and Show.  You could read as an integer and then use 
fromInteger to do so, but that the code I wrote would treat the result 
as a constant, so the derivative would always be reported as zero.  I 
realize this is strictly an incorrect implementation of fromInteger (and 
fromRational in the Fractional class), but at the same time, there is no 
correct implementation.

For functions that refrain from using fromInteger or fromRational except 
on constants, and modulo any coding errors (as I said, I didn't 
implement this cautiously), this should give you the correct derivative 
for any function when the derivative exists.

What it doesn't do is evaluate properly to bottom/NaN when the 
derivative fails to exist.  Part of that is my lazy lack of interest in 
writing the code correctly.  For example, log (-1) is NaN, but my code 
will give you (-1) as the derivative, suggesting (incorrectly, of 
course) that log is undefined but still differentiable at that point.  
But another part of it is endemic; for example,

    f x = if signum x == (-1) then (-x) else x

redefines the absolute value function, which is not differentiable at 0, 
but this implementation will claim f'(0) = 1, and there's no obvious way 
to avoid it without changing a lot.

-- 
Chris Smith



More information about the Haskell-Cafe mailing list