Functional programming 标准ML:isLeapYear函数
我试图用标准ML编写一个函数,使用的是Functional programming 标准ML:isLeapYear函数,functional-programming,sml,Functional Programming,Sml,我试图用标准ML编写一个函数,使用的是case of,但我最终得到的代码是一堆if/else。这仅仅是使用的案例的一个糟糕的候选者,还是有更好的方法来设置它,这样我就不会不断地将布尔映射到布尔 这是我的密码: fun isLeapYear(y) = case (y mod 400 = 0) of true => true | false => (case ((y mod 100 = 0)) of true => f
case of
,但我最终得到的代码是一堆if/else
。这仅仅是使用的案例的一个糟糕的候选者,还是有更好的方法来设置它,这样我就不会不断地将布尔映射到布尔
这是我的密码:
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));
谢谢你的帮助,
b一般来说,只要你看到
案例p
真=>真
|false=>q
(或等效地如果p那么true,否则q
)您应该
p-orelse q
同样地
案例p
false=>false
真=>q
只是p和q
最后
case p of
true => true
false => false
只是p
因此,您的示例最好写为
y mod 400=0
orelse(y型100 0
并且y模4=0)
首先,情况X of true=>E1 | false=>E2
“直接对应于如果X那么E1 else E2
,这是我个人更喜欢的(毕竟,如果…那么…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
这就引出了第二点:您可以使用下表重写if B然后E1 else E2
,其中E
s之一为true
或false
:
(请原谅丹麦的标题,它取自于《哥本哈根大学》中的“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)
变成
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)
变成
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)
fun isLeapYear(y)=y mod 400=0或LSE(y mod 100 0和y mod 4=0)
如果您不关心一些额外的说明:
fun isLeapYear(y) = case (y mod 400, y mod 100, y mod 4) of
(0, _, _) => true
| (_, 0, _) => false
| (_, _, 0) => true
| (_, _, _) => false