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