Functional programming 试图理解SML选项结构
好吧,我开始为一个班级学习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
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*) *)