这是Coursera的ProgLang课程的作业,但是到期日期已经过去,我仅对此进行审核。这是一个非常便宜的问题,但看来我无法在SML中做到这一点。
给出int和int的日期3元组的列表,返回int与tuple的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 if if else结构。到底AS是什么?
- use "hw1.sml";
[opening hw1.sml]
hw1.sml:13.26 Error: syntax error: replacing COLON with AS
val it = () : unit
13:26是标题的第一个冒号。也许我也对Google太麻木了,我没有发现任何有用的东西。
答案 0 :(得分:1)
在SML中,列表类型写为elementType list
,而不是[elementType]
。因此,三元组列表的类型为(int*int*int) list
,而不是[int*int*int]
。
因此,当SML看到[
时,它认为它看到的是模式(特别是列表模式)而不是类型的开始。这使它认为:
是错误的(因为必须在:
之后加上类型),并且错误恢复算法将其替换为as
,因为这在标识符之间是有效的和图案。
那到底是什么?
这是在模式匹配中使用的关键字,用于为模式匹配的结果分配名称。例如,如果要使三元素列表与列表模式匹配,但又想要整个列表的名称,则可以编写fun number_in_month (date as [x1, x2, x3]) = ...
。在这种情况下,列表的三个元素分别称为x1
,x2
和x3
,整个列表称为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
,而不是{{1} },这是您想要的),并且#2 (hd date)
接受两个参数,而不是一个参数(换句话说:递归调用number_in_month
时缺少了date
参数)。< / p>