gpt4 book ai didi

functional-programming - 试图了解 SML 期权结构

转载 作者:行者123 更新时间:2023-12-02 05:17:53 27 4
gpt4 key购买 nike

好的,所以我开始学习 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 模式中的 suitrank 顺序错误:

尝试:

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,如果您使用的是它)告诉您该类型是 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com