由多态实例实例化的类型类

时间:2011-03-11 22:10:15

标签: haskell

我想重用一些代码,如下所示:

instance ToJavascript j => YesodTemplate j where toBuilder = toJavascript

这需要使用包装实例重叠等。所以我看到的解决方案是使用包装器。

newtype Wrapped a = Wrapped { unwrapped :: using a }
instance ToJavascript j => YesodTemplate (Wrapped j) j where
  toBuilder = toJavascript

我有额外的解包j,所以数据声明使用默认函数,我可以将模板类编写为

class YesodTemplate yt inner where
  toBuilder :: inner -> Builder
  file :: (inner -> yt) -> FilePath -> Q Exp
  file wrap fp = readFileQ fp >>= stringToTH wrap

wrap函数是一个满足类型系统的虚拟函数。 但这仍然无法编译。

juliusFile :: FilePath -> Q Exp juliusFile = file (Wrapped :: ToJavascript j => j -> Wrapped j) Ambiguous type variable `inner1' in the constraint: (ToJavascript inner1) arising from an expression type signature Probable fix: add a type signature that fixes these type variable(s) In the first argument one of `file', namely `(Wrapped :: ToJavascript j => j -> Wrapped j)' In the expression: file (Wrapped :: ToJavascript j => j -> Wrapped j) In an equation for `juliusFile': juliusFile = file (Wrapped :: ToJavascript j => j -> Wrapped j)

1 个答案:

答案 0 :(得分:0)

感谢大家的帮助和鼓励!

我最终做的不是使用包装实例,而是使用具有可覆盖的默认函数的数据声明。这种方法更加清晰,因为没有包装器,也没有虚拟变量 - 我认为斯蒂芬说得对,原来的方法并不是为了制作/用于制作GHC的东西。