type equivalency

Jon Cast jcast@ou.edu
Wed, 05 Jun 2002 22:35:52 -0500

Andrew J Bromage <andrew@bromage.org> wrote:

> G'day all.

> On Wed, Jun 05, 2002 at 08:20:03PM -0500, Jon Cast wrote:

> > I think you're confused about what the type declarations mean.
> > When you say

> > > sqrt :: Float -> Float

> > you're promising to operate over /all/ Floats.

> That would be true of Haskell functions were constrained to be total
> functions.  They are not.  Sqrt takes values of type Float, but it
> just happens to be a partial function over that type.

That depends on what you mean by ``partial function''.  Technically,
of course, a function of type (a -> b) is a subset of (a x b)
satisfying certain constraints.  All Haskell functions f satisfy the
property (forall x::a. exists y::b. (x, y) <- f), so you can always
get a value of f at any x.  In other words, sqrt can take any x and
compute with it; it just delivers _|_ at some of them.  My point was,
(sqrt x) is legal Haskell (and has a value) for all (x :: Float).

> > Unfortunately, Haskell doesn't allow {x :: Float | x >= 0} as a
> > type, nor does it provide a positive-only floating point type.

> One general rule of strongly-typed programming is: A program is type
> correct if it is accepted by my favourite type checker.  A corollary
> is that what you call a type, I reserve the right to call a
> precondition.

If I accepted that, I would be un-defining crucial terms.  That would
destroy the potential for discussion here, no?

> Cheers,
> Andrew Bromage

Jon Cast