从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
编辑:为什么这个参数适用于像Integer
和Bool
这样的类型,但不适用于像[a]
这样的类型是最后一步: Integer
在某种意义上只有一个⊥
。 也就是说,除了⊥
,所有整数都是等同的。 在另一方面, ⊥ < (⊥:⊥)
而(⊥:⊥) < (⊥:[])
和(⊥:⊥) < (⊥:(⊥:⊥)) < (⊥:(⊥:(⊥:⊥))) < ...
什么, (⊥:⊥) < ('a':⊥)
。 也就是说, [a]
的语义域足够丰富, y <= fx
且y =/= ⊥
并不意味着fx = y
。
对于某个常量k
, Integer
上任何不是const k
的const 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