SML:非构造函数应用于模式@中的参数

SML: non-constructor applied to argument in pattern @

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

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

问题出在convert的最后一个案例中。

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

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

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