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