簡體   English   中英

臨時類型的可輸入實例

[英]Typeable Instances for Temporary Types

我試圖做一個類型化(使用Data.Reflection )的Typeable實例。

newtype Zq q = Zq Int

我可以得出一個Typeable1例如Zq ,但這種帶有隱含的約束(Typeable q) 我想在需要參數為Typeable的函數中使用Typeable Zq q類型的值。 所以有幾個問題:

  1. 有什么方法可以使類型化的Typeable嗎?
  2. 如果不是,是否有任何方法可以修改現有庫以實現此目的?
  3. 通常, 可以使哪些類型成為Typeable 似乎通過使用DeriveDataTypeableStandaloneDeriving ,我可以想到的任何具體類型(除了臨時類型(如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 qZq q1彼此可轉換,即使qq1是不同的,則只需Typeable (Zq a)編寫一個Typeable (Zq a)實例。 使typeOf返回一個TypeRep ,它是自動生成的實例

newtype Zq = Zq Int

會回來。

免責聲明:老實說,我不知道我在說什么!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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