[英]Instances for nested, parameterized types
鑒於我有數據類型
data A a = A a
data B b = B b
和類型類
class C c where
f :: c a -> a
現在C類需要一種類型* -> *
,所以我可以這樣做
instance C A where
f (A a) = a
instance C B where
f (B b) = b
現在給出一個如下功能:
ab :: b -> A (B b)
ab = A . B
如何為結果類型聲明C
的實例?
我首先通過我可能能夠使用TypeSynonymInstances
的類型同義詞,如下所示:
type AB b = A (B b)
class C AB where
f (A (B b)) = b
特別是因為ghci報告了正確的類型:
*Main> :k AB
AB :: * -> *
但是,您似乎無法在實例聲明中使用部分應用的類型同義詞(或者就此而言在任何地方)。
有沒有什么方法可以組合類型A
和B
就像我可以組合構造函數,或者一些其他語法來聲明這種嵌套類型的實例?
最簡單的可能是定義
newtype AB a = AB { unAB :: A (B a) }
GHC應該能夠為此派生一個C實例。
您也可以使用TypeCompose來完成此任務,
type AB = A :. B
instance C AB where
f = f . f . unO
沒有辦法聲明這樣的實例。 實際上,在實例聲明中允許任意類型的函數(如AB
會使實例解析不可判定。
通常,解決方案是聲明一個newtype。 當然,當您想要使用該類時,您必須顯式轉換為newtype。
newtype AB a = AB (A (B a))
instance C AB where f (AB (A (B a)) = a
如果您對類的使用足夠簡單,您可能只想將重載方法作為使用它的函數的參數傳遞。
你必須使用newtype
。 必須始終完全應用類型同義詞,因為它只是同義詞,而不是lambda。 newtype
沒有運行時懲罰; 它將在編譯時刪除。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.