我是FP和OCaml的新手。我的问题是我如何在OCaml中编写一个函数,这将给我输入整数的那一天。我想这是一种方法,但不方便,每个月都需要修改。我们假设以下代码适用于2016年10月
let int_of_day = function
| 1 -> "Sat"
| 2 -> "Sun"
...
| 31 -> "Mon";;
哪个运行但会发出警告,因为此模式匹配并非详尽无误,并且未使用0。 您有什么建议让这项工作更好? 谢谢你。
答案 0 :(得分:1)
您可以使用Calendar提供的opam库。安装完成后,您可以使用以下内容:
let date = CalendarLib.Date.lmake ~year:2016 ~month:10 ~day:18 ();;
let day = CalendarLib.Date.day_of_week d;;
day
将是枚举类型CalendarLib.Date.day
(事实上Wed
)。
答案 1 :(得分:0)
正如Gabriel在对您的代码的评论中指出的那样,您应该使用某个公式来计算一周中的某一天。这是另一个list of formulas。
关于警告的内容,然后为了使模式匹配穷举,如OCaml所要求的,您需要添加一个全匹配的通配符模式_
,例如,
...
| 31 -> "Mon"
| _ -> invalid_arg "must be a number between 1 and 31"
答案 2 :(得分:0)
您可以使用Unix.mktime进行所有计算。
let give_day y m d =
let (_,tm)=Unix.mktime
{
Unix.tm_sec=0;
Unix.tm_min=0;
Unix.tm_hour=0;
Unix.tm_mday=d;
Unix.tm_mon=m-1;
Unix.tm_year=y-1900;
Unix.tm_wday=0;
Unix.tm_yday=0;
Unix.tm_isdst=false;
}
in
tm.tm_wday
in
let day=give_day 2016 10 1 in
Printf.printf "1/10/2016 %d\n" day ;
let day=give_day 2016 10 10 in
Printf.printf "10/10/2016 %d\n" day ;
测试:
1/10/2016 6
10/10/2016 1
6是星期六,1是星期一。