4

int*int*int 形式の 2 つの日付を取り、最初の日付が 2 番目の日付より古いかどうかを返す単純な関数を作成しようとしています。

fun is_older (date1: (int*int*int), date2: (int*int*int)) =
    val in_days1 = (#1 (date1) * 365) + (#2 (date1) * 30) + #3 date1;
    val in_days2 = (#1 (date2) * 365) + (#2 (date2) * 30) + #3 date1;

    if in_days1 < in_days2
    then true
    else false

次のエラーが表示されます。

hwk_1.sml:1.53 エラー: 構文エラー: EQUALOP の挿入

キャッチされていない例外 コンパイル [コンパイル:「構文エラー」]

発生場所: ../compiler/Parse/main/smlfile.sml:15.24-15.46

../コンパイラ/トップレベル/対話/evalloop.sml:44.55

../コンパイラ/トップレベル/対話/evalloop.sml:296.17-296.20

誰でも助けてもらえますか?

4

4 に答える 4

6

すでに述べたことに加えて、パターン マッチングを使用してその 3 タプルを分解する必要もあります。これを行うと、型注釈を破棄することもできます。これは、これが 3 タプルであることが明らかになったからです (どちらも読者にとってですが、より重要なことには型システムにも)。

fun is_older ((y1, m1, d1), (y2, m2, d2)) =
    let
      val days1 = y1 * 365 + m1 * 30 + d1
      val days2 = y2 * 365 + m2 * 30 + d2
    in
      days1 < days2
    end

ただし、これをもう少し賢く行うことができます。日付を扱う関数が複数ある場合は、小さなヘルパー関数を作成できますtoDays。以下の例では、関数内に含めただけですが、非表示にしたくない場合はisOlder、トップレベルまたは宣言内に配置できますlocal

fun isOlder (date1, date2) =
    let
      fun toDays (y, m, d) = y * 365 + m * 30 + d
    in
      toDays date1 < toDays date2
    end
于 2013-01-22T14:24:05.403 に答える
5
val in_days1 = (#1 (date1) * 365) + (#2 (date1) * 30) + #3 date1;
val in_days2 = (#1 (date2) * 365) + (#2 (date2) * 30) + #3 date1;

ローカルval定義は ~ の間にある必要がletありinます。

于 2013-01-22T14:04:56.747 に答える