haskell-jp / beginners #21 at 2022-08-04 13:53:49 +0900

これに関連して、トップレベルの関数に明示的な型注釈を与えるメリットは具体的に何でしょうか。型エラーの位置とメッセージが親切になるのは知っているのですが、他にメリットがあったら知りたいです
https://haskell-jp.slack.com/archives/C5666B6BB/p1659401887913139?thread_ts=1659398221.402629&cid=C5666B6BB
プログラムを読む人(自分も他人も)の読み解く負荷が軽減されますね:laughing:
プログラミングのスタイルによるかとは思いますが、自分で書くなら、型から書いてから、実装を書くので、わざわざ後から型を追加するという感覚はないです。感覚的な話になってしまいますが、型は自分が書く実装が満すべき最低限の仕様であり、ごくおおざっぱな意図と考えています。この大雑把な意図をガイドにすこしずつたしかめながら、細分化して実装にたどりつくという感じです。というわけで、私にとってはメリットではなく、型を書けて実装との齟齬をチェックしてもらわないと困るという類のものです(よわよわ:sweat_smile:)
この辺 https://wiki.haskell.org/Type_signatures_as_good_style にも書かれていますが、実用上の理由(型注釈が必要な場面)としては
• 過剰に一般的な型が推論されるのを防ぐため(引用元の質問のケースはこれ)
• ある種の言語機能(多相再帰、ランクN多相、GADTs)は型注釈がないと上手く動かないため
があって、それ以外の関数にも型注釈をつける理由は
• 可読性のため
ですね。
個人的には、型エラーを読みやすくするため、というのが大きいかなあと思っています。 f という関数が「バグっていて自分の意図と違う型に推論されている」場合に、 f に型注釈があれば f 自身の中で型エラーが出るはずですが、 f に型注釈がないと f 自身は正しいことになってしまって「f を利用して書かれた別の関数 g」のところでエラーがでてしまう羽目になるので、その型エラーを読み解くのに苦慮しそうです。