Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell GType到将类型转换为IO字符串的函数的映射_Haskell_Ghcjs Dom - Fatal编程技术网

Haskell 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

此映射位于GType和将该GType的实例转换为IO字符串的函数之间。我正在生成一个函数,它接受一个元素并获取该元素的字符串表示形式

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)]
。但是关于你的问题,我不确定最好的方法是什么。。。我想你可以把一个typeclass
class Contents a放在{getContents::a->IO String}
里,然后把
instance Contents HTMLSourceElement这样的实例放在{getContents=HTMLSourceElement.getSrc}
@Alec不幸的是,一个HTMLSourceElement我的类型是HTMLElement。你无法从类型中分辨出它是什么类型的元素。我开始明白为什么你最初尝试的是什么。。。这些类型是如何工作的?我不确定我是否理解某些东西是如何成为
HTMLSourceElement
HTMLElement
的。Downvoter,你愿意证明否决票的合理性吗?我对反馈很感兴趣。。。