关于#haskell的讨论提出了这个问题。
如果它的出现是积极的,将深嵌套的forall提升到顶部是否总是正确的?
E.g:
((forall a. P(a)) -> S) -> T
(其中P,S,T应理解为元变量)
forall a. (P(a) -> S) -> T
(我们通常会将其写为(P(a) -> S) -> T
我知道你肯定被允许从某些积极的位置收集foralls,例如在最后->
的右边等等。
这在经典逻辑中是有效的,所以这不是一个荒谬的想法,但总的来说它在直觉逻辑中是无效的。然而,我的非正式博弈理论对量词的直觉,即每个类型变量“由来电者选择”或“由被叫者选择”表明实际上只有两个选择,你可以将所有“由来电者选择”选项提升到顶端。除非游戏中的移动交错很重要吗?
答案 0 :(得分:3)
假设
foo :: ((forall a. P a) -> S) -> T
并且为了讨论S = (P Int, P Char)
。可能的类型正确的调用可能是:
foo (\x :: (forall a. P a) -> (x,x))
现在,假设
bar :: forall a. (P a -> S) -> T
其中S
如上所述。现在很难调用bar
!我们试着在a = Int
上调用它:
bar (\x :: P Int -> (x, something))
现在我们需要一个something :: P Char
,它不能简单地从x
派生。如果a = Char
,也会发生同样的情况。如果a
不是Int, Char
,那么情况会更糟。
你提到了直觉主义的逻辑。您可能会在该逻辑中看到foo
的类型强于bar
的类型。作为一个更强有力的假设,foo
的类型因此可以应用于证据中的更多案例。因此,如果发现foo
适用于更多情境,那就不足为奇了! :)