2015-08-26 8 views
0

Я пытаюсь выполнить функцию сопоставления шаблонов в инструментах CPN с использованием SML. Я определил набор цветов 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, я думаю, CPN-Tools # -оператор не поддерживается SML. К сожалению, я не знаю, как извлечь только часть кортежа из первого списка, в котором я действительно заинтересован. Любая помощь по этому поводу?

+0

Любая причина, вы не можете просто 'карта (п (а, _) => а) 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 знает, что x имеет тип string*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