【发布时间】:2020-02-09 15:05:50
【问题描述】:
Curry's paradox (以与当前编程语言相同的人命名)是一种可能在错误逻辑中的构造,它允许人们证明任何事情。
我对逻辑一无所知,但它有多难?
module Main where
import Data.Void
import Data.Function
data X = X (X -> Void)
x :: X
x = fix \(X f) -> X f
u :: Void
u = let (X f) = x in f x
main :: IO ()
main = u `seq` print "Done!"
它确实会循环。 (GHC 是怎么知道的?!)
% ghc -XBlockArguments Z.hs && ./Z
[1 of 1] Compiling Main ( Z.hs, Z.o )
Linking Z ...
Z: <<loop>>
- 这是忠实的翻译吗?为什么?
- 我可以在没有
fix或递归的情况下做同样的事情吗?为什么?
【问题讨论】:
-
如果不使用修复或某种递归(在术语级别或类型级别),您无法构造
Void类型的术语。如果您删除所有永久递归的方法或导致运行时错误(例如undefined),那么语言就会变得规范化,因此每个t :: T都会减少到一些t' :: T,这是一种正常形式,“开始”具有构造函数T(如果是函数类型,则为 lambda)。Void没有构造函数,所以这是不可能的。 -
@chi 如果您可以重复此作为对question nearby 的回答。
标签: haskell recursion logic curry-howard