Sml 每月练习中的数字(错误:语法错误:将冒号替换为AS)

Sml 每月练习中的数字(错误:语法错误:将冒号替换为AS),sml,Sml,这是Coursera的ProgLang课程的家庭作业,但截止日期已经过了,我只是在审核。这是一个非常便宜的问题,但看起来我不能在SML中这样做 给定一个日期3元组int和一个int的列表,返回该int与元组(月份)的#2匹配的频率 起初,我有很多[tycon失配],然后就开始使用函数头。我不知道如何表示元组列表,基本上就是这样 fun number_in_month (date : [int*int*int], month : int) : int = if hd date = [] then

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

给定一个日期3元组int和一个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-then-else-if构造。那到底是什么呢

- 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*int*int)list
,而不是
[int*int*int]

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

那到底是什么呢

- use "hw1.sml";
[opening hw1.sml]
hw1.sml:13.26 Error: syntax error: replacing  COLON  with  AS
val it = () : unit
这是模式匹配中使用的关键字,用于为模式匹配的结果指定名称。例如,如果您希望将三元素列表与列表模式匹配,但也希望为整个列表指定一个名称,则可以在一个月内(日期为[x1,x2,x3])编写
fun number\u=…
。在这种情况下,列表的三个元素分别称为
x1
x2
x3
,整个列表称为
date

现在,您没有理由想在这里使用
as
关键字。它恰好是解析器提出的,因为
fun number\u in_month(日期为[
可以是语法有效程序的开始,但
fun number\u in_month(日期:[
不能是)


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

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

现在,您将在函数体中得到一系列类型错误,这些错误与一些缺少的括号有关(例如,
#2hd date
相当于类型错误的
(#2hd)date
,而不是
#2(hd date)
,这是您想要的),并且
number_in_month
接受两个参数,而不是一个参数(换句话说:递归调用
number\u in\u month
时缺少
date
参数)。

在SML中,列表类型写为
elementType list
,而不是
[elementType]
。因此int三元组列表的类型是
(int*int*int)list
,而不是
[int*int*int]

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

那到底是什么呢

- use "hw1.sml";
[opening hw1.sml]
hw1.sml:13.26 Error: syntax error: replacing  COLON  with  AS
val it = () : unit
这是模式匹配中使用的关键字,用于为模式匹配的结果指定名称。例如,如果您希望将三元素列表与列表模式匹配,但也希望为整个列表指定一个名称,则可以在一个月内(日期为[x1,x2,x3])编写
fun number\u=…
。在这种情况下,列表的三个元素分别称为
x1
x2
x3
,整个列表称为
date

现在,您没有理由想在这里使用
as
关键字。它恰好是解析器提出的,因为
fun number\u in_month(日期为[
可以是语法有效程序的开始,但
fun number\u in_month(日期:[
不能是)


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

number_in_month (date : (int*int*int) list, month : int) : int =
现在,您将在函数体中得到一系列类型错误,这些错误与一些缺少的括号有关(例如,
#2hd date
相当于类型错误的
(#2hd)date
,而不是
#2(hd date)
,这是您想要的),并且
number_in_month
接受两个参数,而不是一个参数(换句话说:递归调用
number\u in\u month
时缺少
date
参数)