[Haskell-cafe] type inference and named fields

Jonathan Cast jcast at ou.edu
Fri Jun 24 09:57:20 EDT 2005


> > Lennart Augustsson <lennart at augustsson.net> wrote:

<snip>

> Jonathan Cast wrote:
> > 
> > Here is (approximately) the Core translation of foo above:
> > 
> > 
> >>foo :: forall a b. Either a b -> Either () b
> >>foo = /\ a b -> \ e -> case e of
> >>  Left _ -> Left @() @b ()
> >>  Right _ -> e
> > 
> > 
> > You call this as (foo @a @b e), where e has type (Either a b).
> > 
> > So, the call (foo @a @b (Right @a @b x)) reduces (ignoring types) to
> > (Right @a @b x).   This reduces a term of type (Either  () b) to one
> > of type (Either a b).  That's not type safe.
> 
> There are no types around at run time

We agree on  this, but disagree on  the reason.  I think we  may have to
agree to disagree on the reason,  but I would rather explain my position
first (see below).

> so in case foo is being  passed a Right argument the representation of
> the result is identical to the argument.

So?   Types are  logical  tools we  use  to structure  our programs  and
guarantee their safety;  type safe is a sufficient  condition for ``will
not segfault (or similarly fail)'', not an equivalent condition.

In any case, it doesn't matter.  If I say:

> newtype Plus alpha beta = Plus (Either alpha beta)
> bat :: Plus alpha beta -> Either alpha beta
> bar x = x

bar's  result  is  /guaranteed/  by   the  standard  to  have  the  same
representation as its  argument, but it still doesn't  type check.  Why?
Because ``type  safe'' doesn't mean  ``uses the right  representation at
run time''.

Types  are not  a computer  science concept;  they are  a  foundation of
mathematics concept, invented around the  turn of the previous century I
believe by  Bertrand Russell to  get around certain logical  problems in
set  theory, and  I believe  brought to  prominence by  Martin-Löf  as a
foundation  for  intuitionistic  mathematics.   Types made  their  first
contact with  lambda-terms in Alonzo  Church's time, at which  point the
lambda-calculus  was  still intended  as  a  system  for foundations  of
mathematics.  We use types in  computer science because they are useful,
but they don't arise from information theory or representation theory or
any other branch of computer science.

Therefore,  genuine types  don't exist  at run  time.  In  any language.
Types  are  not  properties  of  programs (which  are  not  mathematical
objects), but rather of languages (which are); since no machine language
(that I know of) is typed, types do not exist at run time.

No  type theory  (that I  know  of) goes  beyond System  F in  accepting
anything  like foo.   So, given  the current  state of  the art,  foo is
unconditionally ill-typed.  That could change if someone comes up with a
/consistent/ type theory  that accepts foo, but foo  is ill-typed at the
moment.

>  (OK, if you want to be very pedantic, this isn't necessarily true for
> every possible implementation of Haskell, just all existing ones. :)

``Perfectly correct'' is an open invitation to pedanticism :)

Jon Cast


More information about the Haskell-Cafe mailing list