【发布时间】:2016-05-12 19:17:52
【问题描述】:
我有一个名为 Showable 的类型,如下所示:
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE ExplicitForAll #-}
data Showable = forall a . Show a => Showable a
然后制作一个打包它的函数是微不足道的。我只需要写:
pack :: forall a . Show a => a -> Showable
pack x = Showable x
但是,似乎不可能创建从 Showable 解压缩数据的反函数。如果我试图颠倒我为打包写的内容并写:
unpack :: exists a . Show a => Showable -> a
unpack (Showable x) = x
然后我从 GHC 收到一个错误。
我查看了有关 GHC 语言扩展的文档,似乎不支持存在关键字。我已经看到它可能在其他一些 Haskell 编译器中是可能的,但我更希望能够在 GHC 中做到这一点。
有趣的是,我仍然可以在 Showable 上进行模式匹配并以这种方式从其中提取数据。所以我可以通过这种方式获得价值,但如果我想制作一个涉及 Showable 的无点函数,那么我需要解包。
那么有没有办法在 GHC 的 Haskell 中实现解包,可能是使用类型族或其他一些 GHC 扩展的神秘魔法?
【问题讨论】:
-
(unpack (pack (1 :: Int))) :: String会是什么? -
我认为这应该是一个编译错误,因为您在打包值后尝试为其提供类型,因为打包后您会丢失有关内部内容的拼写错误的信息,所以您不知道能不能把它的类型改成String。
标签: haskell ghc exists qualifiers