2

さて、私はクラスのために SML を学び始めましたが、オプション構造に行き詰まっています。この例でこれまでに得たもの:

datatype suit = spades|hearts|clubs|diamonds;
datatype rank = ace|two|three|...|j|q|k|joker;
type card = suit*rank;

私の講師は、必ずしもすべてのカードがスーツを持っているわけではないと言って、オプション構造の使用を説明しようとしていました。ジョーカーにはスーツが関連付けられていません。したがって、関数 getsuit を設計してカードのスーツを取得する場合、次のようになります。

datatype 'a option = NONE | SOME of 'a;
fun getsuit ((joker,_):card):suit option = NONE
  | getsuit ((_,s):card):suit option = SOME s;

しかし、emacs を使用すると、パターンと制約が一致しないという 2 つのエラーが発生します。

pattern: rank * ?.suit
constraint: rank * suit

もう 1 つは、式の型と結果の型が一致しないことです。

expression: ?.suit option
result type: suit option

これは講師によって提供されたコードであり、エラーが発生した場合はあまり役に立たないことは明らかです。の意味は何ですか "?。" なぜそれが現れるのですか?この関数を正しく定義するにはどうすればよいですか?

4

1 に答える 1

5

optionあなたが定義したように、実際には問題ではありません。パターンの順序が間違っていsuitますrankcard

試す:

datatype 'a option = NONE | SOME of 'a;

fun getsuit ((_, joker):card):suit option = NONE
  | getsuit ((s, _):card):suit option = SOME s;

私のバージョンの ML はおそらくエラーの出力方法が異なるため、?.etcの意味を説明する方法がわかりません。

試す

(clubs, ace);

インタープリター (または使用している場合は emacs) は、型がsuit * rank. これは ML の型推論ですが、次のように型を (予想通り) 指定できます。

(clubs, ace): suit*rank;

または

(clubs, ace): card; (* Works, since card is defined as (suit*rank) *)

そして、あなたは何の不満もありません。しかし、明らかにあなたはそうするでしょう

(clubs, ace): rank*suit;

または

(clubs, ace): card; (* card is defined as (rank*) *)

の引数のタイプに制約を設定しましたが ( 、または互換性のある製品getsuitでなければなりません)、パターンのタイプはまたはであり、どちらも と互換性がありません。card(suit*rank)(rank*?)(?*rank)(suit*rank)

于 2013-01-15T20:46:29.007 に答える