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

SML:应用于模式中参数的非构造函数@,sml,smlnj,Sml,Smlnj,为什么我不能做到以下几点?有什么方法可以做到 datatype boolexp = zero | one | compl of boolexp; fun convert (#"1"::nil) = one | convert (#"0"::nil) = zero | convert (#"-":: #"(" :: xs @ [#")"]) = compl (convert xs) 它给了我一些错误: non-

为什么我不能做到以下几点?有什么方法可以做到

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
    ,然后使用检查
    xs
    是否以
    #“)结尾
  • 如果您需要它比上面的方法更快,那么可能需要使用一种专门的数据结构,以便更快地读取列表的两端。例如,这可能是一个双端队列。有关于这些的详细资料