bcl*_*man 2 functional-programming sml
我正在尝试使用标准ML编写一个函数,case of但我最终会得到一些代码,这些代码会为一堆内容而尖叫if / else.这只是一个不太好的候选人使用case of或是否有更好的方法来设置它所以我不是经常将布尔值映射到布尔值?
这是我的代码:
fun isLeapYear(y) =
case (y mod 400 = 0) of
true => true |
false => (case ((y mod 100 = 0)) of
true => false |
false => (case (y mod 4 = 0) of
true => true |
false => false));
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助,bclayman
如果你不在乎一些额外的指示:
fun isLeapYear(y) = case (y mod 400, y mod 100, y mod 4) of
(0, _, _) => true
| (_, 0, _) => false
| (_, _, 0) => true
| (_, _, _) => false
Run Code Online (Sandbox Code Playgroud)
首先,case X of true => E1 | false => E2"直接对应if X then E1 else E2,我个人更喜欢.(毕竟,if ... then ... else ...是一种专门的案例结构,只适用于布尔值,对吗?)把它变成了这个给我们:
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
Run Code Online (Sandbox Code Playgroud)
这让我想到了第二点:你可以随时重写一个if B then E1 else E2,其中一个E是true或者false,使用下表:

(原谅丹麦的标题,它取自" IP-2:Supplerende noter i Introduktion to progmermer "一书,我们用它来教授哥本哈根大学的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
Run Code Online (Sandbox Code Playgroud)
变
fun isLeapYear(y) =
if y mod 400 = 0 then true
else if y mod 100 = 0 then false
else y mod 4 = 0
Run Code Online (Sandbox Code Playgroud)
变
fun isLeapYear(y) =
if y mod 400 = 0 then true
else not (y mod 100 = 0) andalso y mod 4 = 0
Run Code Online (Sandbox Code Playgroud)
变
fun isLeapYear(y) = y mod 400 = 0 orelse (not (y mod 100 = 0) andalso y mod 4 = 0)
Run Code Online (Sandbox Code Playgroud)
最后我们可以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)
Run Code Online (Sandbox Code Playgroud)