haskell中,為什麼Identity 1 1可以得到Identity 2

時間 2021-06-01 17:05:54

1樓:羅宸

Prelude

Data

.Functor

.Identity

>:t

(Identity1)

(Identity1)

::Num

a=>Identity

aPrelude

Data

.Functor

.Identity

>:t

(+)(

+)::Num

a=>a->a->aPrelude

Data

.Functor

.Identity

>:t

(+)(

Identity1)

(+)(

Identity1)

::Num

a=>Identity

a->Identity

a看到這裡, 一般就會有個疑問: 為什麼 (Identity a) 能滿足 Num 約束從而可以被用作加法的引數?

聰明的你肯定猜到了, 肯定是因為Identity有這麼乙個匯出的instance:

因為有 Num a 的約束, 所以就自動有了 Num (Identity a) 的約束, 是不是很有道理?

但是再進一步:

Prelude

Data

.Functor

.Identity

>:t

(+)(

Identity1)

1(+)

(Identity1)

1::Numa

=>Identity

a這裡又有疑問了, 為嘛字面量 1 也能被當成 Identity a 用呢?

於是我們再看看字面量 1 的型別:

Prelude

Data

.Functor

.Identity

>:t

11::Num

p=>p懂了麼? 因為數字字面量可以用作任何滿足 Num 約束的型別, 而 Identity a 的確滿足 Num 約束, 就是這麼神奇 (捂臉逃

haskell中的immutable array是如何實現隨機訪問的?

已登出 我印象中 Data.Vector 是乙個 32 個格仔然後可以往下擴充套件的乙個樹,Date.Vector.Mutate 是乙個利用定長陣列實現的 ST Monad 憑印象回答,很可能有錯 Tang Boyun 已經有答案給出Haskell常用的幾個庫,但如果追求極致效能的話,C陣列依舊是最...

haskell中的callcc有什麼用?

應用 寫點個人理解 重點是理解下面這個函式的含義 gotoCont a r a Cont r x gotoCont c a Cont c a Cont c a 表示不管之後的延續如何定義,直接以引數a,執行c表示的延續。callCCf Cont c runCont f a Cont ca c 在ca...

為什麼OCaml沒有Haskell流行?

左元 Haskell的語法比OCaml要漂亮一些。type class也比module語法看著更舒服。還有比如list comprehension這樣的語法糖。 藥罐子千里冰封 因為 modular implicits 還!沒!合!並!而且現在的 OK 貓加上這功能,社群也要花一定的時間遷移 參考 ...