ここで質問するか、randomチャンネルで質問するか迷ったのですが、 こちらで書...

ここで質問するか、randomチャンネルで質問するか迷ったのですが、 こちらで書かせて頂きますね。 どうして data T = forall a. Show a => T a deriving Show ってのはだめなんでしょうか、無論自分でインスタンスを書けばShowのインスタンスになるのは当然なんですが、 変数a は必ずShowのインスタンスである事が保障されてるので Showのインスタンスは機械的に導けると思うのですが。 例えば、T 型でEq を導きたいとかなら変ってくるとは思いますが。

Replies

ここで質問するか、randomチャンネルで質問するか迷ったのですが、 こちらで書かせて頂きますね。 どうして data T = forall a. Show a => T a deriving Show ってのはだめなんでしょうか、無論自分でインスタンスを書けばShowのインスタンスになるのは当然なんですが、 変数a は必ずShowのインスタンスである事が保障されてるので Showのインスタンスは機械的に導けると思うのですが。 例えば、T 型でEq を導きたいとかなら変ってくるとは思いますが。

Gadtsやexistential typeは、自動導出されたものが正しいかはtype checkしてみないと分かりません(Haskell標準のものは自動導出されるものが必ずtype checkが通ることが保証されています)。なので、構文だけからvalidか判断できる機能とできない機能を分けるため、使えないようにしたのだと思います。

StandaloneDerivingを使うと、自動導出をしたものにtype checkをかけることで、deriving可能にしています。このため、自動導出で生成されたものが型エラーを吐くこともあります。これが結構大きな差異ということなのでは無いですかね?