簡體   English   中英

嵌套參數化類型的實例

[英]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 :: * -> *

但是,您似乎無法在實例聲明中使用部分應用的類型同義詞(或者就此而言在任何地方)。

有沒有什么方法可以組合類型AB就像我可以組合構造函數,或者一些其他語法來聲明這種嵌套類型的實例?

最簡單的可能是定義

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM