1

これは、リストとして実装された一連のデータ型でうまく動作すると私が想像するコードの一例です。

fun newSet() = nilset;

fun isMember (k, x::xs) = if k = x then true else isMember (k, xs)
  | isMember (k, nilset) = false;

問題は、リストとして実装できないことです。以下は、私のセットを実装するためのコードです。

abstype ''a set = nilset | st of ''a * ''a set

::リストの場合、これと他のセット操作を再帰的に行うにはどうすればよいですか? そうでない場合、なぜこれが例外をスローするのですか? 使用するとこれが得られます::

! Type clash: pattern of type
!   ''a set
! cannot have type
!   ''b list

助けてくれてありがとう。

4

1 に答える 1

2

それは例外ではありません。with::に属するcons コンストラクターを使用できないという型エラーです。'a list'a set

Nilset2 つのコンストラクターがありSet、再帰的なデータ型であると仮定します。

datatype 'a set = Nilset | Set of 'a * 'a set

定義するには、データ型の再帰構造に従う必要がありますisMember

fun isMember (k, Set(x, xs)) = k = x orelse isMember (k, xs)
  | isMember (k, Nilset) = false

確かに、 を本格的に使用するには、 Set structureSetを調べる必要があります。

于 2012-11-05T22:23:58.430 に答える