haskell-jp / questions #102 at 2022-11-04 15:27:35 +0900

Endo Ryunosuke / minerva
TaPL の exercise 30.4.2 に Are there any useful programs that can be written in System F4 but not in System F3? っていう問題があるのですが,思いつく人いますか?
モナド変換子がそうではないでしょうか?
```Prelude Control.Monad.State> :k StateT
StateT :: * -> (* -> *) -> * -> *```
あと型クラスも広義にはそうかもしれません。TaPLの30.4で「Objectを計算体系の正式な式としてではなく、メタ言語略記の機構で扱うことにすればよい」と書いてありますが、これがまさに型クラスのことだと思います。実際Haskellで、型クラスはコア言語に脱糖されると、データ型と同様に扱われるようです。例えばMonadはカインドが`(* -> *) -> Constraint`でF3では書けず、F4でなら書けますし、実際に有用なので答えの一つになるのではないでしょうか。
Endo Ryunosuke / minerva
monad transformer がそうだと投稿してから気づきました.ていうか 1 段階ずらして理解しちゃってたので (* => *) => * は F3 だと思ってました…….
Endo Ryunosuke / minerva
っていうか逆に,monad transformer を知ってればこの exercise 当たり前すぎますよね.こんな自明な問題が TaPL の星 4 なはずないと思って勘ぐっちゃったかも.
(* => *) => * は F3だと思ってました
これ結構トラップですよね。私も一応読み返しました。