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