2015-08-26 98 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

相關問題