gpt4 book ai didi

haskell - 可见类型应用程序是 `Proxy` 参数的安全替代方案吗?

转载 作者:行者123 更新时间:2023-12-05 02:38:01 28 4
gpt4 key购买 nike

鉴于可见类型应用程序现在可以为值或函数填充模糊类型,这现在是否可以完全替代 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com