number_in_month练习(错误:语法错误:将冒号替换为 AS)



这是 Coursera ProgLang 课程的家庭作业,但截止日期已过,我只是在审核这个。这是一个非常便宜的问题,但看起来我无法在 SML 中做到这一点。

给定 int 的日期 3 元组和 int 的列表,返回该 int 与元组的 #2(月份(匹配的频率。

起初我有很多[tycon不匹配],然后玩弄了函数头。我不知道如何表示元组列表,全部归结为此。

fun number_in_month (date : [int*int*int], month : int) : int =
if hd date = []
then 0
else
if #2 hd date = month
then
1 + number_in_month tl date
else
0 + number_in_month tl date

不确定逻辑和 if 然后如果构造。AS到底是什么?

- use "hw1.sml";
[opening hw1.sml]
hw1.sml:13.26 Error: syntax error: replacing  COLON  with  AS
val it = () : unit

13:26 是标头的第一个冒号。也许我也太麻木了,无法谷歌,我没有找到任何有用的东西。

在 SML 中,列表类型写为elementType list,而不是[elementType]。所以 int-triples 列表的类型是(int*int*int) list,而不是[int*int*int]

因此,当 SML 看到[时,它认为它看到的是一个模式(特别是列表模式(的开始,而不是一个类型。这使得它认为:是错误的(因为:后面必须跟一个类型(,并且错误恢复算法将其替换为as,因为这在标识符和模式之间是有效的。

AS到底是什么?

它是模式匹配中使用的关键字,用于为模式匹配的结果分配名称。例如,如果要将三元素列表与列表模式匹配,但还需要整个列表的名称,则可以编写fun number_in_month (date as [x1, x2, x3]) = ...。在这种情况下,列表的三个元素将分别称为x1x2x3,整个列表将称为date

现在,您没有理由要在此处使用as关键字。它恰好是解析器想出的,因为它可以是语法有效程序的开始fun number_in_month (date as [fun number_in_month (date : [不可能。


因此,您的固定签名应如下所示:

number_in_month (date : (int*int*int) list, month : int) : int =

现在你会在函数的主体中得到一堆类型错误,这些错误与一些缺少的括号有关(例如#2 hd date等效于类型错误的(#2 hd) date,而不是#2 (hd date),这是你想要的(以及number_in_month接受两个参数的事实,而不是一个(换句话说:在递归调用number_in_month时,你缺少date参数(。

最新更新