Haskell解析XML文档
事实上,我对哈斯克尔是个新手。正在尝试运行此代码: 返回XML元素的标记名Haskell解析XML文档,haskell,Haskell,事实上,我对哈斯克尔是个新手。正在尝试运行此代码: 返回XML元素的标记名 getName :: Content -> Name getName (CElem (Elem nme atts cs)) = nme 我有以下错误: Expecting one more argument to `Content' In the type signature for `getName': getName :: Content -> Name 您能帮我解决一下吗。您发布的代码有几
getName :: Content -> Name
getName (CElem (Elem nme atts cs)) = nme
我有以下错误:
Expecting one more argument to `Content'
In the type signature for `getName': getName :: Content -> Name
您能帮我解决一下吗。您发布的代码有几个问题,仅通过查看类型就可以看到所有这些问题。以下是来自的相关类型信息: 以下是您在发布代码时遇到的问题:
Content
具有种类*->*
,也就是说,Content
是一个类型构造函数,它将类型参数作为参数并返回类型。不能将部分应用的类型(Content
)作为值传递给函数,这意味着您的getName
函数应该具有签名
getName :: Content i -> Name
CElem
上的模式匹配只有一个参数,但从上面的定义可以看出,它需要两个参数。因为您只使用了一个构造函数值,所以我们可以用\uuu
替换其他构造函数值。到目前为止,我们有:
getName :: Content i -> Name
getName (CElem (Elem nme _ _) _) = nme
Elem
构造函数的第一个参数的类型为QName
,但您的签名表明您希望返回类型为Name
的内容。这意味着我们不能只返回nme
。相反,我们需要在N
构造函数上再次进行模式匹配,以提取名称:
getName :: Content i -> Name
getName (CElem (Elem (N nme) _ _) _) = nme
Elem
的第一个参数的类型为QName
,但可以使用QN
构造函数构造。因此,我们最好为该构造函数添加一个案例:
getName (CElem (Elem (QN _ nme) _ _) _) = nme
同样,你应该考虑所有其他可能的模式匹配:<代码> EELM/COD>构造函数是好的;其类型元素i
只有一个构造函数。类型Content i
具有多个构造函数。CString
构造函数没有类型为Name
的明显可派生值,因此我们现在将忽略它CRef
有,因此我们将为其添加一个案例:
getName (CRef (RefEntity nme) _) = nme
Reference
的另一个构造函数没有名称,因此我们忽略它。我将把CMisc留给你
This means that the final definition of `getName` should looks something like this:
getName :: Content i -> Name
getName (CElem (Elem (N nme) _ _) _) = nme
getName (CElem (Elem (QN _ nme) _ _) _) = nme
getName (CRef (RefEntity nme) _) = nme
-- maybe add a case for CMisc here
getName _ = error "Content constructor doesn't have a Name!"
你在用什么图书馆?您能提供关于您的具体问题的更多信息吗?我使用的是HaXML 1.13.3和Haskell编译器GHC7.6.3。提示:不是类型,而是类型构造函数。因此,如错误消息所示,您需要将一个参数传递给
内容
,例如内容i
。如果删除类型签名,会发生什么情况?它编译吗?如果是这样,你能检查一下GHCi中的类型吗?现在我已经解决了你的问题,让我来解决一些其他问题。首先,这些都是非常基本的Haskell技巧,这表明您需要先阅读教程,然后再继续(或提出更多问题)。除了简单性之外,你的问题还有其他一些突出的问题,这些问题几乎解决了。如果没有编译示例,诊断编译错误是非常困难的。例如,您甚至没有提到您在原始问题中使用了HaXML
,我仍然需要搜索它以找到相关的类型信息。如果您包含了import语句(即使您的代码编译),那么将来很可能会得到答案。您可以找到有关提出好问题的更多信息。如果此答案对您有帮助,您可以单击旁边的复选标记接受它。
This means that the final definition of `getName` should looks something like this:
getName :: Content i -> Name
getName (CElem (Elem (N nme) _ _) _) = nme
getName (CElem (Elem (QN _ nme) _ _) _) = nme
getName (CRef (RefEntity nme) _) = nme
-- maybe add a case for CMisc here
getName _ = error "Content constructor doesn't have a Name!"