Haskell GType到将类型转换为IO字符串的函数的映射
此映射位于GType和将该GType的实例转换为IO字符串的函数之间。我正在生成一个函数,它接受一个元素并获取该元素的字符串表示形式Haskell GType到将类型转换为IO字符串的函数的映射,haskell,ghcjs-dom,Haskell,Ghcjs Dom,此映射位于GType和将该GType的实例转换为IO字符串的函数之间。我正在生成一个函数,它接受一个元素并获取该元素的字符串表示形式 mapping = [ (Types.gTypeHTMLSourceElement, HTMLSourceElement.getSrc ) , (Types.gTypeHTMLObjectElement, HTMLObjectElement.getData ) , (Types.gTypeHTMLTimeElement , HTML
mapping =
[ (Types.gTypeHTMLSourceElement, HTMLSourceElement.getSrc )
, (Types.gTypeHTMLObjectElement, HTMLObjectElement.getData )
, (Types.gTypeHTMLTimeElement , HTMLTimeElement.getDateTime)
, (Types.gTypeHTMLElement , HTMLElement.getInnerText )
, ...
]
给出此错误:
Couldn't match type ‘HTMLObjectElement’ with ‘HTMLSourceElement’
我正在使用ghcjs dom。我怎样才能让这段代码编译时不出错?我是否以正确的方式处理这个问题
如果有人能想出比Alec的答案更好的答案,我会接受他们的答案。我认为解决这个问题的正确方法是只制作一个
toString
函数,根据GType进行分支
toString :: GObjectClass obj => obj -> IO String
toString obj | obj `isA` gTypeHTMLSourceElement = getSrc . castToHTMLSourceElement
| obj `isA` gTypeHTMLObjectElement = getData . castToHTMLObjectElement
| obj `isA` gTypeHTMLTimeElement = getDateTime . castToHTMLTimeElement
| obj `isA` gTypeHTMLElement = getInnerText . castToHTMLElement
| ...
我认为您的方法不正确,但要编译它,您可能需要
RankNTypes
并添加mapping::[(GType,forall a.IO(a->String))]
@Alec有更好的方法吗?如果我关闭了基于节点名的设置,它将不会是类型安全的。重新阅读我的注释时,它应该真正读取了映射::[(GType,forall a.a->IO String)]
。但是关于你的问题,我不确定最好的方法是什么。。。我想你可以把一个typeclassclass Contents a放在{getContents::a->IO String}
里,然后把instance Contents HTMLSourceElement这样的实例放在{getContents=HTMLSourceElement.getSrc}
@Alec不幸的是,一个HTMLSourceElement我的类型是HTMLElement。你无法从类型中分辨出它是什么类型的元素。我开始明白为什么你最初尝试的是什么。。。这些类型是如何工作的?我不确定我是否理解某些东西是如何成为HTMLSourceElement
和HTMLElement
的。Downvoter,你愿意证明否决票的合理性吗?我对反馈很感兴趣。。。