Что меня удивляет:
ru_declarative — 23.02.2010 Если имеется: &forall b (∀ a (P (a) &rArr Q (b)) ⇒ Q (b))Поскольку &forall a P (a) &rArr Q (b) ≡ ∃ a (P (a) ⇒ Q (b)), то
∀ b ∃ a ( (P (a) &rArr Q (b)) &rArr Q (b)), и поскольку (A ⇒ B) ⇒ B ≡ A, то
∃ a P (a)
Так вот - что меня удивляет, что экзистенциальные типы в Haskell действительно так выражаются, через универсальный полиморфизм:
type Ex = forall b . (forall a . Show a ⇒ a → b) → b pack :: Show v ⇒ v → Ex pack v = λ fn → fn v one = pack 1 str = pack "Str" main = do one print; str print
И это и правда работает:
msk@kouzdra-nest:~/TEST$ ghc -fglasgow-exts exist.hs -o exist && ./exists 1 "Str"
|
</> |