标准ML:Ugly isLeapYear功能

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

sea*_*mcl 6

如果你不在乎一些额外的指示:

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)


Seb*_*olm 5

首先,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,其中一个Etrue或者false,使用下表:

如何重写if语句包含bool的表

(原谅丹麦的标题,它取自" 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)