Экзистенциальная квантификация без конструкторов данных


person typesanitizer    schedule 13.03.2019    source источник
comment
(exists a. Show a => a) всегда можно переписать как что-то вроде forall c. Show b => (forall a. Show a => a -> c) -> b -> c. Это похоже на связь в логике между экзистенциальной квантификацией и универсальной квантификацией.   -  person Colin Barrett    schedule 14.03.2019
comment
@ColinBarrett Вы действительно имели в виду, что там должны быть b, а не только, скажем, forall c. (forall a. Show a => a -> c) -> c?   -  person Daniel Wagner    schedule 14.03.2019


Ответы (1)


Заимствуя комментарий Колина и глядя на этот ответ, можно написать CPS-версию того же кода без exists квантификатор.

f' :: Int -> ((forall a. Show a => a -> r) -> r)
f' x = case x of
  0 -> \k -> k 0
  _ -> \k -> k "non-zero"

Хотя это и не идеально, но, безусловно, решает проблему без введения дополнительных типов данных.

person typesanitizer    schedule 13.03.2019