15

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

去引用:

碰巧只有一个 Integer -> Integer 类型的非严格函数的原型:

一个 x = 1

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

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

从 A->A 或 A->B 的函数是否会发生类似的情况?那就是它们必须是常量函数?

4

2 回答 2

17

任何Integer不是const k针对某个常量的函数都k必须检查它的参数。您不能部分检查Integer可能是什么意思它是一个“平面域”。这是IntegerHaskell 规范中定义的语义的结果,而不是遵循核心语言的语义。

相比之下,[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]

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

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

是不严格的。

于 2013-01-10T16:17:16.457 回答
16
于 2013-01-10T16:20:12.517 回答