[Haskell-cafe] a really juvenile question .. hehehehe ;^)

Arnar Birgisson arnarbi at gmail.com
Mon Oct 6 09:19:30 EDT 2008


On Mon, Oct 6, 2008 at 14:58, Cale Gibbard <cgibbard at gmail.com> wrote:
> 2008/10/6 Don Stewart <dons at galois.com>:
>> dagit:
>>>    data and newtype vary in one more subtle way, and that's how/when they
>>>    evaluate to bottom.  Most of the time they behave identically, but in the
>>>    right cases they act sightly differently.  newtype is usually regarded as
>>>    more efficient than data.  This is because the compiler can choose to
>>>    optimize away the newtype so that it only exists at type check time.  I
>>>    think this is also possible with data in some, but not all, uses.
>>
>> The compiler *must* optimise away the use. They're sort of 'virtual'
>> data, guaranteed to have no runtime cost.
>
> I'm not sure that I'd want to be that emphatic about what an
> implementation *must* do regarding something so operational.
>
> The informal semantics of pattern matching in the Report says:
>
> Matching the pattern con pat against a value, where con is a
> constructor defined by newtype, depends on the value:
>    * If the value is of the form con v, then pat is matched against v.
>    * If the value is _|_, then pat is matched against _|_.
> That is, constructors associated with newtype serve only to change the
> type of a value.
>
> This clearly has an implementation which introduces no overhead, which
> one can expect from good implementations of the language. There are
> obviously implementations of these semantics which do introduce
> overhead as well though, so I would be hesitant to make any
> requirement like that.

And this requirement is there why? Is it specifically put in so that
one is able to create this overhead-less implementation?

Given:

data A = A Int
newtype B = B Int

ta (A x) = True
tb (B x) = True

This happens (not surprisingly given your above comments):

*Main GOA> :load test.hs
[1 of 1] Compiling Main             ( test.hs, interpreted )
Ok, modules loaded: Main.
*Main GOA> ta undefined
*** Exception: Prelude.undefined
*Main GOA> tb undefined
True

Why is the x evaluated in ta?

cheers,
Arnar


More information about the Haskell-Cafe mailing list