从Int到Int的严格函数?

根据这篇关于Haskell的指称语义的文章,从Int到Int只有一个非严格(非底部精修)函数。

去引用:

它发生的只有一个类型为Integer的非严格函数原型 - > Integer:

一个x = 1

对于每个具体数字k,它的变体是constk x = k。 为什么这些是唯一可能的? 请记住,一个n不能少于一个⊥定义。 由于Integer是一个平坦的域,两者必须相同。

从本质上讲,该类型签名的唯一非严格函数只能是常量函数。 我不遵循这个论点。 我也不确定扁平域是什么意思,文章的其余部分导致相信它只是意味着数值的集合只有一个节点:底部。

从A-> A或A-> B的功能会发生类似的情况吗? 那是他们必须是不变的功能?


直觉是懒惰的函数在不强迫它的情况下不能检查它的论点(并因此变得严格)。 如果你不检查你的论点,你必须是const

单调性的真正答案。 如果将语义域看作排序关系是“定义性”之一的所有函数,则所有函数都是顺序保留的。 为什么? 既然所有底部都是平等的,并且永久循环与底部是一样的,那么非单调函数就是解决暂停问题的函数。

好吧,那为什么这暗示着const创建了唯一的懒惰函数呢? 那么,选择一个任意函数f

f :: Integer -> Integer
f ⊥ = y

因为所有x ⊥ <= x ,它必须是y <= fx 。 如果y是一个非底值,那么这个不等式的唯一解决方案就是fx = y

编辑:为什么这个参数适用于像IntegerBool这样的类型,但不适用于像[a]这样的类型是最后一步: Integer在某种意义上只有一个 。 也就是说,除了 ,所有整数都是等同的。 在另一方面, ⊥ < (⊥:⊥)(⊥:⊥) < (⊥:[])(⊥:⊥) < (⊥:(⊥:⊥)) < (⊥:(⊥:(⊥:⊥))) < ...什么, (⊥:⊥) < ('a':⊥) 。 也就是说, [a]的语义域足够丰富, y <= fxy =/= ⊥并不意味着fx = y


对于某个常量kInteger上任何不是const kconst k必须检查它的参数。 你不能部分地检查一个Integer ,它可能是一个“平坦域”。 这是Integer的语义如何在Haskell规范中定义的结果,而不是核心语言的语义所遵循的结果。

相比之下,对于每个类型a都存在无限多的类型为[a] -> [a]非严格函数,例如take1

take1 (x:_) = [x]

要显示非严格性,请定义

ones = 1 : ones

在指称语义方面,[[ ones ]] =⊥。 但是take1 ones评估为[1] ,所以take1是非严格的。 那么, take2 (x:y:_) = [x,y]take10

如果你想对整数不严格,不恒定的功能,你需要的整数比的不同表示Integer ,例如:

data Bit = Zero | One
newtype BinaryInt = I [Bit]

如果我们将I的列表解释为“小端”二进制整数,那么函数

mod2 (I [])       =  I []
mod2 (I (lsb:_))  =  I [lsb]

是非严格的。

链接地址: http://www.djcxy.com/p/7503.html

上一篇: strict function from Int to Int?

下一篇: strict functions (semantics)?