Functional programming 试图理解SML选项结构

Functional programming 试图理解SML选项结构,functional-programming,wildcard,option,sml,smlnj,Functional Programming,Wildcard,Option,Sml,Smlnj,好吧,我开始为一个班级学习SML,我被选项结构所困扰。 到目前为止,我对这个例子的理解是: datatype suit = spades|hearts|clubs|diamonds; datatype rank = ace|two|three|...|j|q|k|joker; type card = suit*rank; 我的讲师试图解释期权结构的使用,他说并非所有的卡片都有一套;小丑们没有与他们相关的套装。 因此,在设计函数getsuit以获得卡的套装时,我们有以下几点: datatype

好吧,我开始为一个班级学习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,我得到两个错误,一个是模式和约束不一致

pattern: rank * ?.suit
constraint: rank * suit
另一种说法是表达式类型和结果类型不一致

expression: ?.suit option
result type: suit option
这是讲师提供的代码,很明显,如果它导致错误,他们没有多大帮助。
“?”是什么意思?为什么会出现?如何正确定义此函数?

对于您定义的
选项
,这并不是什么问题。 您的
图案中的
套装
等级
顺序错误:

尝试:

我的ML版本可能会以不同的方式打印错误,因此我不确定如何解释
?。
等的含义。但如果您一点一点地理解它,它就足够简单了:

试一试

解释器(如果您使用的是emacs)告诉您类型是
suit*rank
的产品。这是ML的类型推断,但您可以这样指定类型(您期望):

(clubs, ace): suit*rank;

你不会有任何抱怨。但很明显,如果你这么做了,你会的

(clubs, ace): rank*suit;


您对
getsuit
的参数类型设置了一个约束(它必须是
,或兼容的
(suit*rank)
产品),但模式类型是
(rank*?)
(?*rank)
,两者都不兼容
(suit*rank)
,谢谢,这很简单,我不知道我以前怎么没抓到它。我尝试了你的第一个建议,效果很好!谢谢
(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*) *)