我如何专注于显式类型的应用程序?

时间:2016-09-07 21:49:48

标签: haskell

使用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 pragma强制showRead 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,但是不要使用闪亮的新方式而感到遗憾。

1 个答案:

答案 0 :(得分:1)

GHC 8.0并不支持这一点,但现在是proposal的主题,可以在未来的GHC中支持它。