我正在尝试使用SML在CPN Tools中执行模式匹配功能。
我定义了一个colorset EVENT:[ (a,0), (b,1) ]
比较列表时,我只对事件类型感兴趣,所以我试图比较一下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)
到Session Stickiness
- 所以我写了下面的SML函数来比较两个列表:
{{1}}
只能在evalloop.sml中给出一个未指定的编译器错误 由于我对SML很新,我的猜测是SML不支持CPN-Tools#-operator。 不幸的是我不知道如何从我真正感兴趣的第一个列表中仅提取元组的一部分。对此有任何帮助吗?
答案 0 :(得分:1)
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