[Haskell-cafe] data/newtype examples

Johannes Waldmann johannes.waldmann at htwk-leipzig.de
Fri May 6 07:19:00 UTC 2022

Dear Cafe -

I wanted a quick example (for teaching)
that shows a difference between data and newtype.

You'd think that `newtype` makes things more strict,
so we'd see more exceptions. 
Then try the following, and try to guess the semantics beforehand:

ghci> data D = D Bool
ghci> case D undefined of D x -> ()
ghci> case undefined of D x -> ()

ghci> newtype N = N Bool
ghci> case N undefined of N x -> ()
ghci> case undefined of N x -> ()

What examples do you use?
I'm interested both in simple ones,
and confusing/obfuscated ones.

Yes I know I can

ghci> seq (D undefined) ()
ghci> seq (N undefined) ()
*** Exception: Prelude.undefined

but that `seq` is extra magic that needs to be explained.
Well, perhaps I should.

To show that I've done some homework here: 
the primary source of truth is the Haskell Language Report 
(well hidden at the bottomest end of https://www.haskell.org/documentation/)
and it uses (in 4.2.3 Datatype Renamings) the concept
of "equivalent to bottom". Then 6.2 Strict Evaluation
shows how to test that with `seq` (without mentioning newtype,
and that's fine since the Report is not a tutorial).
This suggests that `seq` is really the way to go here.
There are examples for data/newtype/case combined
in 3.17.2 Informal Semantics of Pattern Matching 
but they distinguish between
newtype N = N Bool  and  data    D = D !Bool  (with a bang).

- J.W.

More information about the Haskell-Cafe mailing list