我知道Haskell函数集只是所有数学函数的一个子集,因为它是一种编程语言,所以它的所有函数都必须是可计算的.但从数学的角度来看,所有Haskell函数(以及一般的纯函数)是否连续都是正确的?
可编辑函数在Scott连续性意义上是连续的,在您链接到的Wikipedia页面的第二段中提到.
不连续的函数的一个例子是(伪Haskell)
isInfinite :: [a] -> Bool isInfinite xs | {- xs is an infinite list x0 : x1 : x2 : ... -} = True | {- xs is a finite list x0 : x1 : x2 : ... : xn : [] -} = False | {- xs is a list with diverging spine x0 : x1 : x2 : ... : xn : _|_ -} = _|_
它不能连续,因为
() : () : () : ...
是序列的最高要求
_|_ () : _|_ () : () : _|_ ...
但
True = isInfinite (() : () : () : ...)
不是序列的最高要求
_|_ = isInfinite (_|_) _|_ = isInfinite (() : _|_) _|_ = isInfinite (() : () : _|_) ...
可计算函数是连续的,主要是因为在有限的时间内函数只能检查有限量的输入.因此,如果可计算函数返回True
特定输入,则它必须返回True
输入集中的每个输入,这些输入与某些有限观察集合上的原始输入一致.收敛到原始输入的任何递增序列最终将落在该集合内,因此该递增序列上的函数值序列将收敛True
.
连续函数不一定是可计算的.例如,任何保持顺序(即f _|_ = _|_
,或者f
是常数)的函数Integer -> Bool
是连续的,因为Integer
是平坦域.但当然,其中很多只是可计算的.