Нет, это невозможно. Рассмотрим специальный случай, когда Q = Void
.
Either P Q
равен Either P Void
, что изоморфно P
.
iso :: P -> Either P Void
iso = Left
iso_inv :: Either P Void -> P
iso_inv (Left p) = p
iso_inv (Right q) = absurd q
Следовательно, если бы у нас был функциональный член
impossible :: ((P -> Void) -> Void) -> Either P Void
у нас также может быть термин
impossible2 :: ((P -> Void) -> Void) -> P
impossible2 = iso_inv . impossible
В соответствии с соответствием Карри-Говарда это будет тавтологией в интуиционистской логике:
((P -> False) -> False) -> P
Но вышеизложенное - это устранение двойного отрицания, которое, как известно, невозможно доказать в интуиционистской логике - отсюда и противоречие. (Тот факт, что мы могли бы доказать это в классической логике, не имеет значения.)
(Последнее замечание: это предполагает, что наша программа на Haskell завершается. Конечно, используя бесконечную рекурсию, undefined
и аналогичные способы, позволяющие на самом деле избежать возврата результата, мы можем использовать в Хаскеле любого типа.)