functional-programming - 尝试理解 SML 选项结构

标签 functional-programming wildcard sml smlnj

好吧,我开始学习 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,如果您使用的是 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/

相关文章:

scala - 在 scalaz 中组合状态的标准方法

java - Java中通配符捕获,无法调用方法

java - Java中的通配符问题

sml - 什么是 ML 中高阶函数中的 curry 和 uncurry

sml - 在标准 ML 中压缩和解压缩列表

haskell - FRP 是否有一组 "complete"函数/运算符?

.net - F# 短路模式匹配

javascript - JavaScript 中的通配符日期形式

function - SML 中具有用户数据类型的部分函数

scala - scala 是否忽略函数签名中的类型?