什么是類型類
編輯在計算機科學中,類型類是一種類型系統結構,支持臨時多態性。這是通過在參數化的多態類型中為類型變量添加約束來實現的。這樣的約束通常涉及到一個類型類T和一個類型變量a,并意味著a只能被實例化到一個其成員支持與T相關的重載操作的類型。在PhilipWadler和StephenBlott首次提出作為StandardML中eqtypes的擴展后,類型類首次在Haskell編程語言中實現,最初被認為是以一種原則性的方式實現重載算術和平等運算符。與StandardML的eqtypes相比,在Haskell中通過使用類型類重載平等運算符不需要對編譯器前端或基礎類型系統進行廣泛修改。自從它們創建以來,已經發現了許多類型類的其他應用。
類型類的概述
編輯類型類是通過指定一組函數或常量名稱,以及它們各自的類型來定義的,每個屬于該類的類型必須存在。在Haskell中,類型可以被參數化;一個旨在包含承認平等的類型的類型類Eq將被以如下方式聲明。classEqawhere(==)::a->a->Bool(/=)::a->a->Bool其中a是Eq類的一個實例,a定義了2個函數(平等和不平等函數)的函數簽名,這2個函數分別接受2個a類型的參數并返回一個布爾值。{displaystyle*}在最新的GHC版本中也被稱為類型)。在最新的GHC版本中也被稱為Type),意味著Eq的種類是Eq::類型->約束這個聲明可以理解為,如果有適當類型的函數命名為(==)和(/=),在它上面定義了一個類型a屬于類型類Eq。然后程序員可以用下面的方式定義一個函數elem(確定一個元素是否在一個列表中)。函數elem的類型是a->[a]->Bool,上下文是Eqa,它將a的范圍限制在屬于Eq類型的那些a上。(注意:Haskell=>可以被稱為"類約束")。程序員可以通過使用定義了C的所有方法的實現的實例聲明,使任何類型t成為給定的類型類C的成員。例如,如果程序員定義了一個新的數據類型t,他們可以通過以任何他們認為合適的方式對類型t的值提供一個平等函數,使這個新類型成為Eq的實例。一旦他們這樣做了,他們就可以在[t]上使用函數elem,也就是t類型的元素的列表。請注意,類型類與面向對象編程語言中的類不同。特別是,Eq不是一個類型:不存在Eq類型的值這樣的東西。類型類與參數多態性密切相關。例如,注意到上面指定的elem的類型將是參數多態的類型a->[a]->Bool,如果不是因為類型類的約束Eqa=>。
更高類型的多態性
編輯一個類型類不需要取一個Type類型的變量,而是可以取一個任何類型的類型。這些具有更高種類的類型類有時被稱為構造函數類(所指的構造函數是類型構造函數,如Maybe,而不是數據構造函數,如Just)。一個例子是單體類。m應用于一個類型變量的事實表明,它具有Type->Type的種類,即它接受一個類型并返回一個類型,Monad的種類就是這樣。
多參數類型類
編輯類型類允許多個類型參數,因此類型類可以被看作是類型上的關系。例如,在GHC標準庫中,IArray類表達了一個通用的不可變數組接口。在這個類中,類型類約束IArrayae意味著a是一個包含e類型元素的數組類型。(例如,這種對多態性的限制被用來實現非盒式數組類型)。像多方法一樣,多參數類型類支持根據多個參數的類型來調用一個方法的不同實現,實際上還有返回類型。多參數類型類不需要在運行時的每次調用中搜索要調用的方法;相反,要調用的方法首先被編譯并存儲在類型類實例的字典中,就像單參數類型類那樣。使用多參數類型類的Haskell代碼是不可移植的,因為這個特性不是Haskell98標準的一部分。流行的Haskell實現,GHC和Hugs,支持多參數類型類。
內容由匿名用戶提供,本內容不代表www.gelinmeiz.com立場,內容投訴舉報請聯系www.gelinmeiz.com客服。如若轉載,請注明出處:http://www.gelinmeiz.com/170851/