Я начинаю понимать, как 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
ключевое слово на ясном, простом английском языке (или, если оно где-то существует, указать на такое ясное объяснение, которое я пропустил), которое не предполагает, что я математик, погруженный в жаргон?
Отредактировано, чтобы добавить:
Ниже были два выдающихся ответа из более качественных, но, к сожалению, я могу выбрать только один как лучший. Ответ Нормана был подробным и полезным, объясняя вещи таким образом, чтобы показать некоторые теоретические основы forall
и в то же время показать мне некоторые его практические последствия. ответ Яирчуохватил область, которую еще никто не упомянул (переменные типа scoped) и проиллюстрировал все концепции с помощью кода и сеанса GHCi. Было бы возможно выбрать оба, как лучше, я бы. К сожалению, я не могу, и, внимательно изучив оба ответа, я решил, что Яирчу слегка обходит Нормана из-за иллюстративного кода и прилагаемого объяснения. Однако это немного несправедливо, потому что на самом деле мне нужны были оба ответа, чтобы понять это до такой степени, что я forall
не испытываю слабого чувства страха, когда вижу его в сигнатуре типа.