Functional programming 标准ML:isLeapYear函数

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

我试图用标准ML编写一个函数,使用的是
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