
On Sat, Aug 08, 2015 at 11:32:59PM +0200, MigMit wrote:
Well, it's certainly unsupported by evidence. Because third-party code CAN distinguish between those.
OK, show me the code!
I did. You removed it when quoting.
Reinstating:
Prelude> newtype A = A Int deriving Show Prelude> data B = B !Int deriving Show Prelude> let x = case x of A n -> A 1 in x A 1 Prelude> let y = case y of B n -> B 1 in y *** Exception: <<loop>>
This isn't third party code. It knows about the constructors of A and B.
1) This might be the code written by someone using your library/framework. In which case it would know about A and B.
Then it's up to me to define and document whatever strictness properties I want for my constructors. To reiterate: I'm *not* suggesting replacing newtype A = A a with data A = A! in existing code. Of course that won't work. But for *new* datatypes choosing one rather than the other gives no difference in terms of denotational semantics.
2) It might be generated by the Template Haskell — which is free to use whatever constructor is fed into it.
OK, so show me what goes wrong!