Đề xuất (P -> Q) -> Q
và P \/ Q
là tương đương.
Có cách nào để chứng kiến sự tương đương này trong 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 = ???
như vậy mà
from . to = id
và to . from = id
?
g = const someHardcodedB
a
hoặc b
. Có ý nghĩa.
to f = callcc (\k -> k (Right (f (\a -> k (Left a)))))
sẽ hoạt động. (Đây là một bằng chứng cổ điển hợp lệ về hàm ý.)
((a -> b) -> b)
là đẳng cấu vớia
: cách thực hiện duy nhất có thể làg f = f someHardcodedA
.