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

标签 haskell ghc

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

相关文章:

haskell - 将 -XGeneralizedNewtypeDeriving 与 -XMultiParamTypeClasses 结合使用

haskell - 如何在用递归方案编写的表达式求值器中编写更少的样板

haskell - 字符串变量作为 haskell 命令

编译用 haskell 和模板 haskell 编写的共享对象并将其与 c 中的 main 链接

haskell - 哪些技术对 Haskell 性能的提高贡献最大?

haskell - GHC 分析器输出

haskell - 将表达式转换为在 haskell 脚本中描述其类型的字符串?

json - 将选项对象解析为选项列表

Haskell - 如何将具有不同依赖项子集的组件连接在一起?

compiler-errors - 编译GHC源代码时如何解决这些编译错误