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解析XML文档_Haskell - Fatal编程技术网

Haskell解析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 您能帮我解决一下吗。您发布的代码有几

事实上,我对哈斯克尔是个新手。正在尝试运行此代码:

返回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

您能帮我解决一下吗。

您发布的代码有几个问题,仅通过查看类型就可以看到所有这些问题。以下是来自的相关类型信息:

以下是您在发布代码时遇到的问题:

  • 类型
    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!"