1樓:火星最強指揮官
主要有兩個原因:
1. Haskell的多態函式是引數化多型。比如:
Maybe a -> a,這裡的a是任意型別,你是無法構造乙個任意型別的值的(當引數是Just x的時候,你可以直接使用這個x,但是當引數是Nothing的時候,你就無法構造a了)。
解決方法有兩種:
(1)讓Haskell支援ad-hoc多型,比如:假設你可以寫這樣的過載函式:
f : Maybe Int -> Int
f Just x = x
f Nothing = 100
f : Maybe Boolean -> Boolean
f Just x = x
f Nothing = True
....在這裡你必須列舉出所有可能出現的型別。
對於Haskell來說這是不可能的,但是如果你的語言的型別數量有限的話,則是有可能的(每乙個過載函式相當於乙個自然變換的元件)
(2)讓Haskell支援類似C#裡new T()這種操作,比如:
f : Maybe a -> a
f Just x = x
f Nothing = new a
這就要求Haskell對每乙個型別提供乙個預設的構造器,這樣你就能在不提供具體引數的情況下,把型別a的物件先new出來,在將來的某一時刻再把值set進去。換句話說,Haskell必須支援mutable操作。
2. 即使把Haskell語言改成的上述的樣子,仍然會有問題,比如:
f : Maybe Void -> Void
f Nothing你無法構造Void的值
Haskell要求每個函式都是全函式,而Maybe Void這個型別裡包含了乙個Nothing值,這個值的必須有image,然而這個image的型別卻是Void,這是一對矛盾。
解決方法是:去掉Void型別,去掉RankNTypes,即:不允許使用者構造類似forall a . a這樣的型別。
實際上,Void多用於定理證明,很少有人會直接使用Void。
2樓:午時葵
容易看出, a}" eeimg="1"/>誘導了乙個從 元集合到 元集合的對映。
對於基數大於等於 的集合,我們總是有乙個平凡的雙射。所以我們可以有 Nat}" eeimg="1"/>。
對於有限集,根據鴿籠原理,所有形如 a}" eeimg="1"/>的對映要麼不是單的,要麼不是全的。這在實踐中是不實用的,但依然可以被定義。
特別的,對於空集,乙個值域為空的函式自身也必須是空的,於是它不可能是全的。實際上,它對所有的輸入都沒有定義。
3樓:林吟風
當然可以寫啊。
Haskell 沒有子型別,所以我們用泛型的做法,搞出型別為 forall a. a 的 term 就好了(雖然事實上,你可以經常看到 Haskell 的相關材料裡把以下東西叫做 Bottom)。
首先你可以寫 error/throw,比如 error "an error" 的型別就是 forall a. a。
不用 error 的話能不能寫出來?那當然還是可以的,只要發散,無法 evaluate 出值就行了。比如 diverge = diverge,fix id 的型別都是 forall a.
a。示例:fromJust (Just x) = x
fromJust Nothing = fromJust Nothing
4樓:
部分別的回答似乎都已經正經的解釋了,那我說點不正經的(逃之所以把 a 裝到 Maybe 裡面是為了將其狀態限定到 Maybe 中,從而可將 Maybe 作為乙個 Monad 進行操作。
為什麼要把 a 從 Maybe 中拿出來呢?如果拿出來了是不是也需要將其相關聯的所有狀態都拿出來呢?
所以類似 Maybe a -> a 這樣的操作從一開始就是有問題的,它 Monad 的設計初衷是背離的。如果想要操作 a,最好的方法就是在 Maybe 中操作 a。
5樓:HOOCCOOH
不正經:
有的,開啟 ghci
Prelude
>import
Data.Maybe
Prelude
Data
.Maybe
>:t
fromJust
fromJust
::Maybe
a->a當然,這個函式不可能是 total 的,它要麼不停機(無限遞迴),要麼可能出現異常
正經:我們可以用 idris 證明這樣的 total 函式不存在total noUnmaybe:
Not(
->Maybe a -> a)
noUnmaybe f = f Nothing
鴨 可以稱為 鴨子 , 雞 為什麼不可以說為 雞子 ?
譚樊馬克 白語能說 雞子 而且還有四音格詞 geil zix geil yvnx 小雞。漢字是 雞子雞女 不過白語的 子 有兩種用法,一種是純粹的字尾,和官話一樣,如 白語子 另一種就是這個,和粵語一樣小稱,粵語的 刀仔 不是一般的刀,而是小刀。 夏語冰 我是個外行,不免貽笑大方 我覺得研究語法之類...
為什麼不可以做乙個超級平凡普通且沒有夢想的人?
moonn je 很多名詞隨著時間的流逝早已物是人非,比如 夢想 成功 詞語本身沒毛病,但被資本家所利用,成為他們的套利工具。平凡不好嗎?隨著年齡增長和對自己對這個世界看法的不斷更新,平凡是最高端的一種人生態度,很莫名其妙的變成了不思進取和隨波逐流,人性真的不能細看,所有的不合理後面的承重牆就是人性...
為什做手機的企業不可以做乙個配置等非常完美的手機?工業完全可以做到啊。
樹薰 首先,問題不成立。工業做不到。手機作為乙個電子產品,技術是每年甚至每個月都有進步的。上半年你855火,下半年來個plus。主流是1080螢幕,頂級的是2k,可是上頭還有4k啊。你有90重新整理率,馬上又有120的了。今年的前置攝像頭有挖孔和公升降,可是屏下才是未來。所以,技術是不斷進步的。即使...