【发布时间】:2020-03-03 06:10:25
【问题描述】:
命题(P -> Q) -> Q 和P \/ Q 是等价的。
有没有办法在 Haskell 中见证这种等价性:
from :: Either a b -> ((a -> b) -> b)
from x = case x of
Left a -> \f -> f a
Right b -> \f -> b
to :: ((a -> b) -> b) -> Either a b
to = ???
这样
from . to = id 和 to . from = id?
【问题讨论】:
-
在我看来这是不可能的,但也许我错了。如果是这样,一个有用的起点是具有完全多态类型
((a -> b) -> b)的函数与a同构:唯一可能的实现是g f = f someHardcodedA。 -
@amalloy 还有另一种可能的实现方式:
g = const someHardcodedB -
啊,当然。它是
a或b。有道理。 -
如果 Haskell 有 call/cc,那么
to f = callcc (\k -> k (Right (f (\a -> k (Left a)))))就可以了。 (这是隐含的有效经典证明。)