Ocaml优化明天功能

问题描述

我正在学习Ocaml,作为练习的一部分,我必须创建一个返回一对夫妇第二天(天,月,年)的函数

我完成了该功能,但是评估我的代码的软件告诉我,如果……那么……否则,我使用的太多了…… 我好几个小时都没有找到解决方案了。有人可以帮我吗?

let leap = fun x -> x mod 4 = 0 && x mod 100 <> 0 || x mod 400 = 0

let nbDay(month,year) = match monthwith 
  | 1 | 3 | 5 | 7 | 8 | 10 | 12 -> 31
  | 4 | 6 | 9 | 11 -> 30
  | 2 -> if(leap(year)) then 29 else 28 
  | _ -> 0

let valid (day,month,year) = day <= nbDay(month,year) 
                               && day>= 1
                               && month<=12 
                               && month>= 1 


let tomorrow (day,year) = if(valid (day,year)) 
  then if(day= nbDay(month,year)) 
    then
      if(month= 12) 
      then 
        let day= 1 in 
        let month= 1 in 
        let year= year+ 1 in 
        (day,year)
      else 
        let day= 1 in 
        let month= month+ 1 in 
        (day,year)
    else 
      let day= day+ 1 in  
      (day,year)      
  else  failwith "invalid date!"

解决方法

例如,您应该多使用match而不是写

if month = 12 then xxx ...

你可以写

match month with
| 12 -> xxx
...

当您的病情更加复杂时,您可以使用when代替书写

| 2 -> if is_leap year then x else y

你可以写

| 2 when is_leap year -> x
| 2 -> y