0

SML を使用して CPN ツールでパターン マッチング機能を実行しようとしています。カラーセット EVENT を定義しました。colset EVENT = product EVENTTYPE * EVENTTIME timed;

リストを比較するとき、私はイベント タイプにしか興味がないので、たとえば[a,b]toを比較しようとし[ (a,0), (b,1) ]ています。そのため、2 つのリストを比較する次の 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 で不特定のコンパイラ エラーが発生するだけです。残念ながら、最初のリストから実際に興味のあるタプルの部分だけを抽出する方法がわかりません。

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 に答える