[英]Typeable Instances for Temporary Types
我試圖做一個類型化(使用Data.Reflection )的Typeable實例。
newtype Zq q = Zq Int
我可以得出一個Typeable1
例如Zq
,但這種帶有隱含的約束(Typeable q)
我想在需要參數為Typeable
的函數中使用Typeable
Zq q
類型的值。 所以有幾個問題:
Typeable
嗎? Typeable
? 似乎通過使用DeriveDataTypeable
和StandaloneDeriving
,我可以想到的任何具體類型(除了臨時類型(如reified類型)之外)都可以是實例。 我在說什么的EDIT代碼片段:
f = reify (42::Int) (\ (_::Proxy q) ->
let x = Zq 15 :: Zq q -- x = 15 mod 42
in ...
我想Zq q
,其中q
是具體化類型,為的一個實例Typeable
。 我知道做到這一點的唯一方法是也使q
Typeable
。 當然,如果我將42驗證為q1
,然后將43驗證為q2
,則這些類型不應相等。 另一方面,我意識到我不能指望兩個不同的類型變量可以使相同的值具有相同的TypeReps(即使實際上它們是相同的)。
這取決於。
*Main> :t (Zq 42, Zq 42)
(Zq 42, Zq 42) :: (Zq q, Zq q1)
*Main> :t [Zq 42, Zq 42]
[Zq 42, Zq 42] :: [Zq q]
*Main>
該對中的元素具有不同的類型,而列表中的元素在本質上卻是同一類型。 毫不奇怪。
如果要保持這種方式,似乎不可能使Zq q
鍵入。 Typeable
的全部要點是,相同的類型獲得相同的表示,而不同的類型獲得不同的表示。 幻像類型的要點恰恰相反,它會在每一次機會中生成一個新的唯一類型。 類型類機制不支持這種濫用。 每當我們的值綁定到具有新類型變量的東西或類似的東西時,我們將需要一個新的唯一TypeRep
。
OTOH如果您希望Zq q
和Zq q1
彼此可轉換,即使q
和q1
是不同的,則只需Typeable (Zq a)
編寫一個Typeable (Zq a)
實例。 使typeOf
返回一個TypeRep
,它是自動生成的實例
newtype Zq = Zq Int
會回來。
免責聲明:老實說,我不知道我在說什么!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.