data A = A ()

newtype B = B ()


[() | A _ <- [undefined]] = undefined

[() | B _ <- [undefined]] = [()]


newtype의 constructor는 컴파일할때 사라짐

그래서 B undefined :: B 하고 undefined :: B 가 완전히 동치임.


조금이나마 성능을 추구한다면 newtype을 쓰는게 이롭다