2012-05-21 70 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