0

我正在尝试使用 SML 在 CPN 工具中执行模式匹配功能。我已经定义了一个颜色集事件:colset EVENT = product EVENTTYPE * EVENTTIME timed;

在比较列表时,我只对事件类型感兴趣,所以我试图比较例如[a,b]to [ (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 #-operator。不幸的是,我不知道如何从我真正感兴趣的第一个列表中只提取元组的一部分。对此有什么帮助吗?

4

1 回答 1

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
于 2015-08-26T18:42:40.907 回答