sml - number_in_month 练习(获得 EQUAL。SML 中的 OP 错误,一个功能起作用,其他不起作用)
问题描述
(* 编写一个函数 number_in_month ,它接受一个日期列表和一个月份(即一个 int)并返回列表中有多少个日期在给定月份中。*)
fun number_in_month(datelist : (int*int*int) list, month : int) =
if null(tl (datelist))
then if #2(hd (datelist)) = month then 1 else 0
else if #2(hd (datelist)) = month
then 1 + number_in_month(tl datelist, month)
else number_in_month(tl datelist, month)
(* 编写一个函数 number_in_months,它接受一个日期列表和一个月份列表(即一个 int 列表)并返回该日期列表中的日期数,这些日期位于月份列表中的任何月份中。假设月份列表中没有重复数字。提示:使用您对上一个问题的答案。*)
fun number_in_months(datelist : (int*int*int) list, monthlist : int list)
if null(tl (monthlist))
then number_in_month(datelist, hd monthlist)
else number_in_month(datelist, hd monthlist)
+ number_in_months(datelist, tl monthlist)
当我尝试编译时,第二个函数给了我这个错误:
hw1.sml:42.5 Error: syntax error: inserting EQUALOP
[unexpected exception: Compile]
uncaught exception Compile [Compile: "syntax error"]
raised at: ../compiler/Parse/main/smlfile.sml:19.24-19.46
../compiler/TopLevel/interact/evalloop.sml:45.54
../compiler/TopLevel/interact/evalloop.sml:306.20-306.23
../compiler/TopLevel/interact/interact.sml:65.13-65.16
-
-
解决方案
“语法错误:插入 EQUALOP”表示 SML 需要一个=
字符。
来自 SML/NJ 的错误消息是过去 20 年中没有任何改善的事情之一。他们经常报告解析器为了尝试从错误中恢复而做了什么,而不是报告错误可能是什么。
使用模式匹配编写列表递归(以及大多数其他内容)比使用条件和选择器要好得多:
fun number_in_month ([], _) = 0
| number_in_month ((_, m, _)::ds, m') = (if m = m' then 1 else 0) + number_in_month(ds, m');
fun number_in_months (_, []) = 0
| number_in_months (ds, m::ms) = number_in_month(ds, m) + number_in_months(ds, ms);
这也让 SML 在您忘记一个案例时通知您,例如空列表的案例(您忘记了)。
推荐阅读
- python - flask:如何对请求 JSON 和 JSON 模式进行验证?
- spring-batch - 为什么spring batch的MongoItemWriter不使用org.springframework.data.mongodb.core.BulkOperations?
- python-3.x - 将用户 ID 存储在 json 文件中的问题
- flutter - Flutter 桌面窗口获取应用程序路径
- java - 如何解决 java.lang.UnsupportedClassVersionError?JRE 55.0编译的org/openjfx/gradle/JavaFXPlugin,JRE只识别52.0
- c++ - 遍历可执行文件
- python - 侵蚀操作(python)
- amazon-web-services - 无服务器框架 AWS ApiGateway v2 授权方
- c# - C# 控制台应用程序不会将大型数据集发布到 asp.net .net core 3.0 web api
- javascript - JavaScript - 如何停止 JavaScript If/Else 树?