Я пытаюсь понять ключевое слово exists
по отношению к системе типа Haskell. Насколько мне известно, в Haskell по умолчанию нет такого ключевого слова, но:
- расширения, которые их добавляют, в объявлениях, подобных этим
data Accum a = exists s. MkAccum s (a -> s -> s) (s -> a)
- Я видел документ о них и (если я правильно помню), он заявил, что ключевое слово
exists
не нужно для системы типов, поскольку оно может быть обобщено наforall
Но я даже не понимаю, что означает exists
.
Когда я говорю, forall a . a -> Int
, это означает (по моему мнению, неправильный, я думаю) "для каждого (типа) a
, существует функция типа a -> Int
":
myF1 :: forall a . a -> Int
myF1 _ = 123
-- okay, that function (`a -> Int`) does exist for any `a`
-- because we have just defined it
Когда я говорю exists a . a -> Int
, что это может означать? "Существует хотя бы один тип a
, для которого существует функция типа a -> Int
"? Зачем писать такое выражение? Какая цель? Семантика? Поведение компилятора?
myF2 :: exists a . a -> Int
myF2 _ = 123
-- okay, there is at least one type `a` for which there is such function
-- because, in fact, we have just defined it for any type
-- and there is at least one type...
-- so these two lines are equivalent to the two lines above
Обратите внимание, что он не предназначен для реального кода, который может скомпилировать, просто пример того, что я представляю, тогда я слышу об этих квантификаторах.
P.S. Я не совсем новичок в Haskell (возможно, как второй грейдер), но мои математические основы этих вещей не хватает.