6

プログラミング言語コースで標準 ML を学び始めています。

is_older最初の宿題では、 2 つの日付を取り、評価結果がtrueorになる関数を書きますfalse。最初の引数が 2 番目の引数よりも前の日付であるかどうかを評価しtrueます (2 つの日付が同じ場合、結果はfalse. になります)。

そこで、次のコードを書きます。

fun is_older(first: int * int * int, second: int * int * int) =
  if(#1 first = #1 second andalso #2 first = #2 second andalso #3 first = #3 second) then false
  else if (#1 first < #1 second) then true
  else if (#1 first = #1 second andalso #2 first < #2 second) then true
  else if (#1 first = #1 second andalso #2 first = #2 second andalso #3 first < #3 second) then true
  else false

コードは問題なく動作しますが、見栄えが悪いです。

このコードを機能的なスタイルに書き直すにはどうすればよいですか?

4

3 に答える 3

13

2 つの提案:

  • パターン マッチングを使用してタプルを分解します。
  • コンストラクトがブール値を返す場合は、ブール演算子 ( andalsoorelseなど)を使用します。if/else

より読みやすいバージョン:

(* Compare two dates in the form of (year, month, day) *)
fun is_older((y1, m1, d1), (y2, m2, d2)) =
  y1 < y2 orelse (y1 = y2 andalso m1 < m2) 
  orelse (y1 = y2 andalso m1 = m2 andalso d1 < d2)
于 2013-01-17T09:01:08.060 に答える
9

一般的に、フォームに何かがある場合

if b then
  true
else
  false

b自明に同じと見なされるため、 just と交換する必要があります。パッドが提供する解決策は、素晴らしくて短いので、おそらく私の解決策でもあったでしょう。

ただし、これらの厄介な/ネストされた if-then-else があり、単純なもの (たとえば、true/false または数値) を返さない場合は、ケースの使用を検討する必要があります。あなたの関数は使用する第一候補ではありませんが、以下がアイデアを示していることを願っています(ネストされたifの構造を簡単に作成できるということです)

fun is_older((y1, m1, d1), (y2, m2, d2)) =
    case (Int.compare(y1,y2), Int.compare(m1,m2), Int.compare(d1, d2)) of
      (LESS , _    , _   ) => true
    | (EQUAL, LESS , _   ) => true
    | (EQUAL, EQUAL, LESS) => true
    | _ => false
于 2013-01-17T17:48:46.967 に答える
1
fun is_older((yr1 : int , mo1 : int , dt1 : int), (yr2 : int , mo2 : int , dt2 : int )) =
  yr1 < yr2 orelse (yr1 = yr2 andalso mo1 < mo2) 
  orelse (yr1 = yr2 andalso mo1 = mo2 andalso dt1 < dt2)
于 2013-01-24T22:06:47.490 に答える