我正在尝试使用SML在CPN工具中进行模式匹配功能。我已经定义了一个颜色集EVENT: colset EVENT = product EVENTTYPE * EVENTTIME timed;
当比较列表时,我只对事件类型感兴趣,所以我试图比较例如[a,b]
到[ (a,0), (b,1) ]
到-所以我写了下面的sml函数来比较两个列表:
fun pattern_match _ [] = true
| pattern_match [] [x] = false
| pattern_match (x::xs) (y::ys) =
if #1 x = y
then pattern_match xs ys
else pattern_match xs (y::ys)
只在evalloop.sml中给出一个未指定的编译器错误由于我是SML的新手,我的猜测是SML不支持cpn - tools#操作符。不幸的是,我不知道如何从第一个列表中提取我真正感兴趣的元组的一部分。有什么帮助吗?
Inaimathi可能是正确的,有一种更简单的方法来做您想做的事情,尽管它仍然是一个很好的练习来修复您的定义,使其工作。
当我在SML/NJ中输入您的有趣定义时,我得到错误
stdIn:10.1-14.30 Error: unresolved flex record
(can't tell what fields there are besides #1)
这意味着SML的类型推断不能充分解析类型。给它一点提示就足够了:
fun pattern_match _ [] = true
| pattern_match [] [y] = false
| pattern_match ((x:string*int)::xs) (y::ys) = if #1 x = y
then pattern_match xs ys
else pattern_match xs (y::ys);
现在SML知道x
是string*int
类型,它编译。
推断的类型是(string * int) list -> string list -> bool
,它按预期工作:
- pattern_match [("a",0),("b",1)] ["a","b"];
val it = true : bool