如何专门处理显式类型的应用程序?

GS-向Monica致歉

使用GHC 8.0,我可以编写一个模棱两可的函数,该函数在其类型签名的主要部分中未提及的某个类型上重载,然后使用显式类型应用程序对其进行调用:

{-# LANGUAGE ScopedTypeVariables, RankNTypes,
             AllowAmbiguousTypes, TypeApplications, TypeFamilies #-}

showRead :: forall t . (Read t, Show t) => String -> String
showRead x = show (read x :: t)

showReadInt = showRead @Int

我想使用一种SPECIALIZE编译指示来强制showReadfor的特殊化Int(我的真实代码在另一个模块中具有实际的调用站点)。但是,常规SPECIALIZE语法基于编写类型签名的主要部分,例如:

{-# SPECIALIZE showRead :: String -> String #-}

在这种情况下,我无法指定t应有的内容,并且可以预料地给出有关其模棱两可的错误。

我尝试使用相等约束:

{-# SPECIALISE showRead :: forall t . (Read t, Show t, t ~ Int) => String -> String #-}

但这只是错误:

• Could not deduce (Read t0) a SPECIALISE pragma for ‘showRead’
  from the context: (Read t, Show t, t ~ Int)
    bound by the type signature for:
               showRead :: (Read t, Show t, t ~ Int) => String -> String
    at foo.hs:4:1-76
  The type variable ‘t0’ is ambiguous

有什么办法可以做到吗?当然,我可以使用Proxy,但是不使用闪亮的新方法似乎很可惜。

GS-向Monica致歉

GHC 8.0不支持此功能,但现在是提议在将来的GHC中支持它的主题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在我的 spring 批处理应用程序中显式配置 TaskBatchExecutionListener

OCaml 是否支持显式类型应用程序?

如何配置Guice以要求对整个应用程序(对于所有模块)进行显式绑定

如何通过POST与Flask应用程序发送和接收显式null值

如何为python应用程序显式设置rpm包的名称

显式导致.NET应用程序中的AccessViolationException

Excel VBA - 显式引用当前应用程序实例

从应用程序获取显式加载的DLL的符号

如何在应用程序或功能模块加载时显式执行一些代码?

如何使Twisted应用程序处理SIGTERM?

如何将批处理文件设置为文件类型的默认应用程序

如何在基于文档的 macOS 应用程序中处理不同的文档类型?

如何使ubuntu实现应用程序类型?

我将如何专门针对几天未使用我的应用程序的用户?

如何在Windows 10上专门为具有普通帐户的用户安装应用程序?

如何专门使用“ Elasticsearch” gem将elasticsearch与rails应用程序集成

在应用程序中处理不同的用户类型

泛型类型错误:无法显式专门化泛型类型

Whitelabel错误页面-应用程序没有针对/ error的显式映射

在C#对话流应用程序中使用显式凭据

创建应用程序ID时,显式和通配符之间的区别

从T-SQL而不是从应用程序将显式NULL值传递给存储过程

New Relic 监控的应用程序能否从其内部显式生成事件警报?

如何在应用程序中显式定义属性后如何在默认情况下连接库中的值并覆盖它

如何使烧瓶应用程序成为多处理程序?

Tomcat WebSocket回显应用程序

如何使用隐式意图但避免“选择一个应用程序来处理此意图”屏幕?

渐进式Web应用程序:如何在重新建立连接时检测和处理

GitHub客户端作为渐进式Web应用程序:如何处理提交和推送?