2015-08-26 96 views
0

我想在使用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#操作员。 不幸的是,我不知道如何从我实际上感兴趣的第一个列表中仅提取元组的一部分。对此有何帮助?

+0

任何原因,你不能只是'地图(FN(一,_)=> A)xs',然后两个列表直接比较?它看起来并不像你需要这个函数中的任何东西的第二个值。 – Inaimathi

回答

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知道xstring*int它编译类型。

推断类型是(string * int) list -> string list -> bool,它按预期工作:

- pattern_match [("a",0),("b",1)] ["a","b"]; 
val it = true : bool 
+0

非常感谢您的评论,约翰。不幸的是,CPN-Tools内部的编译器似乎不喜欢你的解决方案,因为我仍然得到一个未指明的错误。当我删除#1时,函数编译,但比较不会那样工作。即使我删除#1并将您的解决方案添加到身体,它也会产生编译错误。 – DCH

+0

@DustinH很奇怪。我对此一无所知,但这听起来像是CPN-Tools中的一个错误。有趣的是,当我尝试编译原始定义时,它会返回“未指定的错误”,而不是相当具体的错误消息。我从来没有听说过CPN-Tools,但它看起来像一个非常有趣的项目(即使它的SML实现中有一个错误)。 –

+0

我认为问题是,他们不会给你编译器抛出的实际错误,但只是告诉你_was_编译错误。这使得调试非常困难。我刚刚读到CPN-Tools实际上使用SML/NJ - 这使得这更奇怪。无论如何感谢您的输入!我现在已经联系了该工具的开发人员,并会根据他们的回复更新这篇文章。 – DCH

相关问题