所以我理解类型的基本代数解释:
Either a b ~ a + b
(a, b) ~ a * b
a -> b ~ b^a
() ~ 1
Void ~ 0 -- from Data.Void
...并且这些关系对于具体类型是正确的,例如Bool
,而不是多态类型,例如a
. 我还知道如何通过根据以下同构翻译 Church 编码,将具有多态类型的类型签名转换为具体的类型表示:
(forall r . (a -> r) -> r) ~ a
所以如果我有:
id :: forall a . a -> a
我知道这并不意味着id ~ a^a
,但它实际上意味着:
id :: forall a . (() -> a) -> a
id ~ ()
~ 1
相似地:
pair :: forall r . (a -> b -> r) -> r
pair ~ ((a, b) -> r) - > r
~ (a, b)
~ a * b
这让我想到了我的问题。这条规则的“代数”解释是什么:
(forall r . (a -> r) -> r) ~ a
对于每个具体的类型同构,我可以指出一个等效的代数规则,例如:
(a, (b, c)) ~ ((a, b), c)
a * (b * c) = (a * b) * c
a -> (b -> c) ~ (a, b) -> c
(c^b)^a = c^(b * a)
但我不理解类似于以下的代数等式:
(forall r . (a -> r) -> r) ~ a