【问题标题】:SML: non-constructor applied to argument in pattern @SML:非构造函数应用于模式@中的参数
【发布时间】:2015-11-22 13:29:19
【问题描述】:

为什么我不能执行以下操作,有什么方法可以做到?

datatype boolexp = zero
                 | one 
                 | compl of boolexp;

 fun convert (#"1"::nil) = one
   | convert (#"0"::nil) = zero
   | convert (#"-":: #"(" :: xs @ [#")"]) = compl (convert xs)

它给了我错误:

non-constructor applied to argument in pattern: @
unbound variable or constructor: xs

【问题讨论】:

    标签: sml smlnj


    【解决方案1】:

    问题在于convert 的最后一种情况。

    @ 是一个函数而不是一个值构造函数(如::nil),因此您不能对其进行模式匹配。无法对通用列表的最后一个元素进行模式匹配。

    要完成您想做的事情,您可以:

    • 模式匹配开头,即#"-":: #"(":: xs,然后使用List.last检查xs是否以#")"结尾。
    • 如果您需要它比上述方法更快,您可能需要使用允许从列表两端更快读取的专用数据结构。例如,这可能是一个双端队列。 Okasaki 有这些细节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-30
      • 2013-12-13
      • 2012-09-02
      • 2021-12-31
      • 2016-06-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-30
      相关资源
      最近更新 更多