次のように、forall
いわゆる「既存のタイプ」でキーワードがどのように使用されるかを理解し始めています。
data ShowBox = forall s. Show s => SB s
これは、forall
使用方法のサブセットにすぎませんが、次のようなもので使用することに心を奪うことはできません。
runST :: forall a. (forall s. ST s a) -> a
または、これらが異なる理由を説明します。
foo :: (forall a. a -> a) -> (Char, Bool)
bar :: forall a. ((a -> a) -> (Char, Bool))
または全部RankNTypes
...
私は、学術的な環境では普通の種類の言語よりも、明確で専門用語のない英語を好む傾向があります。私がこれについて読んでみようとするほとんどの説明(検索エンジンで見つけることができるもの)には、次の問題があります。
- 彼らは不完全です。彼らは、私は、コードを読むまで、私は幸せな気分になります(「実存的なタイプ」のように)このキーワードの使用の一部を説明することは完全に異なる方法での使用にそれを(のような
runST
、foo
およびbar
上記)。 - それらは、離散数学、カテゴリー理論、または抽象代数の今週で人気のある分岐の最新のものを読んだという仮定が密集しています。(「実装の詳細については、何でも紙に相談してください」という言葉を二度と読んだことがなければ、早すぎるでしょう。)
- 彼らは頻繁に単純な概念でさえも曲がりくねって壊れた文法と意味論に変える方法で書かれています。
そう...
実際の質問に移ります。forall
私が専門用語に染まっている数学者であるとは思わない誰かが、キーワードを明確でわかりやすい英語で完全に説明できますか(または、どこかに存在する場合、見逃した明確な説明を指摘します)。
追加するように編集:
以下のより高品質なものから2つの傑出した答えがありましたが、残念ながら私は最良のものとして1つしか選択できません。 ノーマンの答えは詳細で有用であり、理論的な土台のいくつかを示しforall
、同時にそれの実際的な影響のいくつかを私に示した方法で物事を説明しました。 ヤルチュの答え他には誰も言及していない領域(スコープタイプ変数)をカバーし、コードとGHCiセッションですべての概念を説明しました。両方を最良のものとして選択することができたとしたら、私はそうします。残念ながら私はできません。両方の答えを注意深く検討した結果、コード例と添付の説明のために、yairchuはNormanのそれよりもわずかに縁がないと判断しました。しかし、これは少し不公平です。なぜなら、forall
型シグネチャでそれを見ると、ほんの少しの恐怖感を私に残さないように、これを理解するには両方の答えが必要だったからです。