好吧,我开始学习 SML 类(class),但我被选项结构困住了。 到目前为止,我对这个例子的了解是:
datatype suit = spades|hearts|clubs|diamonds;
datatype rank = ace|two|three|...|j|q|k|joker;
type card = suit*rank;
我的讲师试图通过说并非所有牌都一定有花色来解释选项结构的用途; clown 没有与之相关的套装。 因此,在设计函数 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
这是讲师提供的代码,很明显,如果它导致错误,它们就没有多大帮助。 “?”是什么意思?为什么会出现?我如何正确定义这个函数?
最佳答案
正如您所定义的那样,option
并不是真正的问题。
您的 card
图案中 suit
和 rank
的顺序是错误的:
尝试:
datatype 'a option = NONE | SOME of 'a;
fun getsuit ((_, joker):card):suit option = NONE
| getsuit ((s, _):card):suit option = SOME s;
我的 ML 版本可能会以不同的方式打印错误,因此我不确定如何解释 ?.
等的含义。但是如果您一点一点地理解它就足够简单了:
尝试
(clubs, ace);
解释器(或者 emacs,如果您使用的是 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)
product),但模式的类型为 (rank*?)
或 (?*rank)
,这两者都不与 (suit*rank )
。
关于functional-programming - 尝试理解 SML 选项结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14345423/