鉴于可见类型应用程序现在可以为值或函数填充模糊类型,这现在是否可以完全替代 Proxy 的使用?
我看到的一个缺点是可能必须启用 AllowAmbiguousTypes
,但由于不允许使用不明确的类型来捕获错误留下不明确的类型签名,因此此安全网将不再存在.还有其他需要考虑的问题吗?
最佳答案
在现代代码中,我尽量避免使用 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
,我不知道如何将类型绑定(bind)到最后一行的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
现在有一个不应该存在的可见(非类型级)参数。
关于haskell - 可见类型应用程序是 `Proxy` 参数的安全替代方案吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69812176/