2012-05-21 47 views
3

我是新来的Haskell和它的语义。我了解到,并不是每个函数都可以映射到一个对象。例如:哈斯克尔语义不定值

square :: Int -> Int 
square x = x*x 

将square的值映射到数学对象。但是,对于任何非终止函数,我们将其映射到一个特殊的数学值。我想知道如果我必须用这个未定义的值进行计算会发生什么。例如,我有一组数字Z⊥ ={⊥, 1,0,-1}。如果我将与1相乘,输出是多少?因为,的类型将是未定义的,我可以用定义好的类型进行乘法运算吗?因为,是在Z⊥的域名,我想我可以做乘法。但是,那么它将不得不返回!我想就此有一些指导!

回答

5

乘法也将返回。它的行为与你所描述的完全相同;任何依赖于值的计算也将产生

2 * undefined ~= undefined 

底部值是每一种类型的居民,并且是这样设置的每个值的隐式构件,并且不能由类型被排除(除了通过使用GHC内部原语)。存在这种特殊价值的原因是为了能够就Haskell中的停止问题进行讨论;如果没有这个值,编译器将不得不能够证明某个计算终止以便进行类型检查,而这通常是不可能的。

+0

作为进一步的说明,'˚F⊥≠⊥'允许当且仅当对于所有的x,'˚FX = F⊥'。 –

+0

是的,这就是我所说的“任何依赖于'⊥'值的计算',这是上面用俗语表示的:如果'f'不依赖于'x',函数可以产生一个具体的值当应用于最低值时。在另一个说明中,'⊥≠⊥',这就是为什么我在上面发明了模糊的“等价”操作符的原因;) – dflemstr

+3

@DietrichEpp:不正确;考虑'f x =(x,x)'。对于所有'x',正确的规则是'f⊥⊑f x'。 – ehird