為什麼不可以寫乙個型別為 Maybe a a 的函式?

時間 2021-06-01 06:44:31

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的了。今年的前置攝像頭有挖孔和公升降,可是屏下才是未來。所以,技術是不斷進步的。即使...