2016-07-24 108 views

回答

12

此功能不存在。(假設有嚴格的語義)

查看類型的代數,函數類型等價於指數運算。

現在功能absurd,其類型Void -> a對應的操作a^0等於1。這意味着只有一個absurd的實現,可以在Data.Void中找到。

反向的箭頭,你得到的類型a -> Void,相當於0^a0,這意味着所需的功能不存在。


你也可以用庫裏霍華德同構證明這一點。由於函數類型對應於布爾函數「暗示」,你會得到以下條件:

True -> False 

這是假的,因此沒有功能a -> Void可以存在。

由於我剛剛開始學習類別理論,所以鼓勵由於語言不準確而引起的更正。

+0

這是一篇很好的文章[關於'代數數據類型'中的'代數'](http://chris-taylor.github.io/blog/2013/02/10/the-algebra-of- algebraic-數據類型/) –

7

這取決於你的意思。 absurd證人同構Void = forall a.a的一側,並且從這一觀點,具有逆

void :: (forall a.a) -> Void 
void x = x 

這確實是一個同構。

有類型

forall a.a -> Void 

也沒有任何逆absurd與該類型的部分功能當中的無總功能。

6

很直觀,該功能不可能存在。假設我們有這樣一個功能:

drusba :: a -> Void 

那麼你可以做

GHCi> drusba (5 :: Int) 

...從而創造Void類型的值。 Well, that's exciting... also, congratulations, you're dead!

Hask(Haskell的類型類別,與Haskell函數作爲態射)是一種與bicartesian closed categoryinitial objectVoid。初始對象的定義是,對於任何類型的A,都只有一個函數Void -> A - 這些函數是absurd :: Void -> a的實例。此外,由於()是終端對象,因此只有一個功能B ->() - 任何此類功能都等同於​​。

現在,假設drusba ::() -> Void,我們將有

drusba . absurd :: Void -> Void 
drusba . absurd ≡ id 

,因爲只能有一個功能Void -> Void,我們知道id是一個;和

absurd . drusba ::() ->() 
absurd . drusba ≡ id 

出於同樣的原因。 IOW,drusbaabsurd確實是相互顛倒的,這意味着()Void是同構的。

但從這一點,將遵循任何類型A實際上是同構的兩個()Void,因爲將有一個準確的功能() -> AA ->()存在。所以基本上,如果存在函數drusba :: a -> Void,這意味着Haskell只有一個類型,它不包含任何值。那不會是一個特別有用的編程語言,會嗎?


當然,這一切只有當你不顧⊥成立。

+0

@dfeuer:_exiting_或_exciting_,當你快要死了時,它們都是一樣的,不是嗎? – leftaroundabout

+0

heh。我想是這樣。 – dfeuer