鑒于使用可見型別應用程式現在可以為值或函式填充不明確的型別,這現在可以完全取代 Proxy 的使用嗎?
我看到的一個缺點是,可能必須啟用AllowAmbiguousTypes,但由于不允許使用歧義型別來捕獲錯誤地留下歧義的型別簽名,那么此安全網將不再存在。是否還有其他問題需要考慮?
uj5u.com熱心網友回復:
在現代代碼中,我盡量避免Proxy,更喜歡不明確的型別和型別應用程式。我看不出這樣做有什么壞處。
不過,如果我沒記錯的話,在某些極端情況下,我們仍然需要像Proxy. 例如:
class C a where name :: String
instance C Int where name = "Int"
instance C Bool where name = "Bool"
data T where
T :: forall a . C a => !(Proxy a) -> T
t1 :: T
t1 = T @Int Proxy
t2 :: T
t2 = T @Bool Proxy
nameFromT :: T -> String
nameFromT (T (Proxy :: Proxy a)) = name @a
沒有Proxy,我不知道如何將型別系結到a最后一行:
data T where
T :: forall a . C a => T
t1 :: T
t1 = T @Int
t2 :: T
t2 = T @Bool
nameFromT :: T -> String
nameFromT (T @a) = name @a
-- Error:
-- Type applications in patterns are not yet supported
在這種特定情況下,我能做的最好的事情就是求助于Dict.
data T where
T :: forall a . Dict (C a) -> T
盡管如此,它仍然Proxy-就像T現在有一個不應該存在的可見(非型別級別)引數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/347705.html
下一篇:使用rank-N型別翻轉
