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