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 貓加上這功能,社群也要花一定的時間遷移 參考 ...