newtypeはHaskellの仕様に不要では?向井さんのdataとnewtypeのちがいのわかりやすい例というエントリへの便乗なのだけど、newtypeはHaskellの仕様に不要だったのではないかと私は思っている。Int」の表す領域は全く同じである。違うのは「メモリ上のデータの表現の効率」と「パターンマッチの意味」だけ。この場合にはメモリ上のデータ表現はコンパイラによる最適化が可能であろうし、そのような最適化はプログラマにとって十分透過的*1だろうから、プログラマがメモリ上の表現を明示する意味はあまり無いはず。newtypeで宣言した場合のパターンマッチの意味については、dataで宣言した場合でも遅延パターンを用いれば実現できる。仮にHaskellの仕様にnewtypeがなくても困ることはないと思うし、newtypeの存在はHaskellを仕様を無駄に複雑化しているだけではないか?【2012年7月追記】ただ、newtypeを単純に無くしてしまって、同等なdata宣言を用いることにすると、newtypeと同じ効果を実現するために、正格性フラグや遅延パターンなど、「既存の型の別名をつける」という典型的なユースケースに比べてややこし過ぎる機能を利用しなくてはならなくなってしまうので、最近は、単純なことを単純にすませるための妥協として、newtypeはあっても良いかと思っている。22:22)じつは私も不要だと思っています。それはコンパイラが最適化で頑張ることなんじゃないの、と。<br>例のエントリは、そこのところをはっきりさせるために「ほらぜんぜん違いないんですよ」というのを言おうと思ったら、パターンマッチで違いのあるケースを発見してしまった困ったなあ、という感じであります。10:02)プラグまでもよかったんじゃないですかね。14:24)dataとnewtypeには意味上の違いがあるので、今と同様の分け方なら、プラグマではなく言語内での記述であるべきだと思っています。等、意味が変わらず効率だけが変わるものについては、プラグマで良いと思うのですが。(はてな版)日記は現代の病です。読み過ぎ書き過ぎはあなたの健康を害する恐れがあります。2.2.10-p489。