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

时间:2015-11-22 13:29:19

标签: sml smlnj

为什么我不能做以下事情,有什么方法可以做到这一点?

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

1 个答案:

答案 0 :(得分:2)

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

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

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

  • 模式匹配开头,即#"-":: #"(":: xs,然后使用List.last检查xs是否以#")"结尾。
  • 如果您需要它比上面的方法更快,您可能需要使用专门的数据结构,以便从列表的两端更快地读取。这可以是例如双端队列。 Okasaki详细介绍了这些内容。