首先,case X of true => E1 | false => E2" 直接对应于if X then E1 else E2,我个人更喜欢它。(毕竟,if ... then ... else ... 是一种特殊的 case 构造,它只适用于布尔值,对吧?)给我们:
fun isLeapYear(y) =
if y mod 400 = 0 then true
else if y mod 100 = 0 then false
else if y mod 4 = 0 then true
else false
这让我想到了第二点:您始终可以使用下表重写if B then E1 else E2,其中Es 之一是true 或false:
(请原谅丹麦的标题,它摘自《IP-2: Supplerende noter i Introduktion til programmering》一书,我们在哥本哈根大学用于教授 SML。)
不管怎样,用这个重写,我们得到:
fun isLeapYear(y) =
if y mod 400 = 0 then true
else if y mod 100 = 0 then false
else if y mod 4 = 0 then true
else false
变成
fun isLeapYear(y) =
if y mod 400 = 0 then true
else if y mod 100 = 0 then false
else y mod 4 = 0
变成
fun isLeapYear(y) =
if y mod 400 = 0 then true
else not (y mod 100 = 0) andalso y mod 4 = 0
变成
fun isLeapYear(y) = y mod 400 = 0 orelse (not (y mod 100 = 0) andalso y mod 4 = 0)
最后我们可以把not (y mod 100 = 0)变成y mod 100 <> 0,给:
fun isLeapYear(y) = y mod 400 = 0 orelse (y mod 100 <> 0 andalso y mod 4 = 0)