错误:语法错误:用AS替换COLON

时间:2018-09-03 13:08:35

标签: sml

这是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太麻木了,我没有发现任何有用的东西。

1 个答案:

答案 0 :(得分:1)

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

因此,当SML看到[时,它认为它看到的是模式(特别是列表模式)而不是类型的开始。这使它认为:是错误的(因为必须在:之后加上类型),并且错误恢复算法将其替换为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,而不是{{1} },这是您想要的),并且#2 (hd date)接受两个参数,而不是一个参数(换句话说:递归调用number_in_month时缺少了date参数)。< / p>

相关问题