第31章:高階型別程式設計
由不同型別元素組成的列表——異類表的相關問題
1.Typeable和Dynamic
Data.Typeable模組
--獲取型別資訊的方法 typeOf :: forall a. Typeable a => a -> TypeRep
TypeRef
Proxy
data Proxy a = Proxy
Data.Dynamic模組
data Dynamic = Dynamic TypeRep Obj toDyn :: Typeable a => a -> Dynamic fromDyn :: Typeable a => Dynamic -> a -> a fromDynamic :: Typeable a => Dynamic -> Maybe a dynTypeRep :: Dynamic -> TypeRep
但凡是Typeable型別類的資料,都可以和Dynamic相互轉換
GHC7.10後語言擴充套件AutoDeriveTypeable會自動開啟 -Typeable的存在,消除了任何隱式的基於型別的操作
2.存在型別 Existential Type
{-# LANGUAGE ExistentialQuantification #-}
data Dyn = forall a. Show a => Dyn a
instance Show Dyn where
show (Dyn a) = "Dyn:" ++ Show a
我們把上述在型別定義的右側,顯示地引入型別變數的型別叫做存在型別
內聯型別類詞典
3.型別家族、資料家族和GADT
Haskell的型別系統一個強大的地方在於:可以把很多執行時才能解決的問題轉移到編譯階段。
- 型別家族:type關鍵字在型別層面定義新的型別函式
資料家族:data關鍵字可以定義新的型別以及對應的建構函式
data family T a data instance T Int = T1 Int | T2 Bool newtype instance T Char = TC Bool
在定義型別類的同時定義資料家族
class GMapKey k where: data GMap k :: * -> * empty :: GMap k v lookup :: ...
GADT Generalised Algebraic Datatype
data T ... where C1 ... :: T ... C2 ... :: T ... ...
4.資料類別 DataKinds
- 通過語言擴充套件,GHC支援我們把data/newtype定義的資料型別提升成類別
Haskell自帶的資料型別和建構函式也可以提升成類別和對應的型別
{-# LANGUAGE DataKinds, GADTs, kindsgnatures, TypeOperators #-} data HList :: [*] -> * where HNil :: Hlist '[] HCons :: x -> HList xs -> HList (x ': xs)
相關文章
- JS高階程式設計第2章--精簡版JS程式設計
- JS高階程式設計第3章--精簡版JS程式設計
- Java高階程式設計筆記 • 【第4章 網路程式設計】Java程式設計筆記
- 程式程式設計3 - UNIX高階環境程式設計第9章讀書筆記程式設計筆記
- 【讀書筆記】JavaScript高階程式設計(第3版)(第5-7章)筆記JavaScript程式設計
- javascript高階程式設計第二章JavaScript程式設計
- javascript高階程式設計第三章JavaScript程式設計
- UNIX訊號(signal)程式設計 - UNIX高階環境程式設計第10章讀書筆記程式設計筆記
- 低階程式設計師和高階程式設計師的區別程式設計師
- 高質量C++/C程式設計指南(第8章 C++函式的高階特性) (轉)C++C程式程式設計函式
- 【疑問】《JavaScript高階程式設計(第3版)》(1)JavaScript程式設計
- 【筆記】《JavaScript高階程式設計(第3版)》(1)筆記JavaScript程式設計
- 【筆記】《JavaScript高階程式設計(第3版)》(2)筆記JavaScript程式設計
- 《JavaScript高階程式設計(第3版)》讀後感JavaScript程式設計
- 高階程式設計語言第2次作業程式設計
- 高階語言程式設計第2次作業程式設計
- 高階程式語言設計第5次作業
- 程式程式設計1 – Unix環境高階程式設計7章讀書筆記程式設計筆記
- 程式程式設計2 – Unix環境高階程式設計8章讀書筆記程式設計筆記
- 《AngularJS高階程式設計》——第1章準備1.1你需要知道哪些知識AngularJS程式設計
- 章10——物件導向程式設計(高階部分)——抽象類物件程式設計抽象
- Typescript高階型別TypeScript型別
- 第3章:抽象資料型別(ADT)和麵向物件程式設計(OOP) 3.2設計規約抽象資料型別物件程式設計OOP
- UNIX環境高階程式設計習題——第二章程式設計
- 高質量C++/C程式設計指南(第6章 函式設計) (轉)C++C程式程式設計函式
- 高質量C++/C程式設計指南(第11章 其它程式設計經驗) (轉)C++C程式程式設計
- JavaScript物件程式設計-第3章JavaScript物件程式設計
- 第12章、網路程式設計程式設計
- 第1章 程式設計的方法程式設計
- 《JavaScript高階程式設計》第3版與第2版有何差異?JavaScript程式設計
- Cats(三):高階型別型別
- 高質量C++/C程式設計指南(第5章 常量) (轉)C++C程式程式設計
- 《JavaScript高階程式設計第3版》-學習筆記-1JavaScript程式設計筆記
- 高質量C++/C程式設計指南(第2章 程式的版式) (轉)C++C程式程式設計
- 使用pthread庫進行多執行緒程式設計1 - UNIX環境高階程式設計第11章讀書筆記thread執行緒程式設計筆記
- 使用pthread庫進行多執行緒程式設計2 - UNIX高階環境程式設計第12章讀書筆記thread執行緒程式設計筆記
- 章10——物件導向程式設計(高階部分)——類名類方法物件程式設計
- Oracle 高階程式設計 01 ~Oracle程式設計