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