【问题标题】:number_in_month exercise (Error: syntax error: replacing COLON with AS)number_in_month 练习(错误:语法错误:用 AS 替换冒号)
【发布时间】:2020-02-26 05:45:39
【问题描述】:

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

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

起初我有很多 [tycon mismatch],然后玩弄了函数头。我不知道如何表示一个元组列表,就这么简单。

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 构造。 AS到底是什么?

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

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

【问题讨论】:

    标签: sml


    【解决方案1】:

    在 SML 中,列表类型写为 elementType list,而不是 [elementType]。所以整数三元组列表的类型是(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 参数)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-25
      • 1970-01-01
      • 2013-10-21
      • 2011-08-15
      • 2017-01-18
      • 2020-12-17
      相关资源
      最近更新 更多