Функция SML не принимает реальный список для сравнения - PullRequest
0 голосов
/ 07 декабря 2018

Эта функция является частью ряда функций (для курса).Предполагается взять список реалов [s, a, w, h] и сравнить его с другими списками реалов на равенство.Эти списки действительных данных создаются путем преобразования объектов типа racer (в списке R :: acer) в реальные списки с использованием racer_stats ().

Затем я хочу, чтобы функция возвращала Racer, характеристики которого равны его racer_stats.() статистика.К сожалению, независимо от того, что я пытаюсь, я не могу понять, как получить SML для сопоставления с шаблоном [s, a, w, h] как реальный список, поэтому он не будет сравниваться, даже когда я создал новый базовый случай.

Любой совет?

fun RFS([s,a,w,h], []) = None
  | RFS([s,a,w,h], R::acer) =
      if ( [s,a,w,h] = racer_stats(R) )
      then R
      else RFS([s,a,w,h], acer);

Я также попытался:

fun RFS( [0.1, 0.2, 0.3] , []) = None 
  | RFS([s,a,w,h], []) = None
  | RFS([s,a,w,h], R::acer) =
      if ( [s,a,w,h] = racer_stats(R) )
      then R
      else RFS([s,a,w,h], acer);

и получил синтаксическую ошибку.

1 Ответ

0 голосов
/ 07 декабря 2018

На всякий случай, если кто-нибудь столкнется с этим позже.Как указало molbdnilo, реалы не являются типом равенства.Чтобы обойти это, я построил следующий оператор сравнения:

fun compy([], []) = true
    | compy([], x) = false
    | compy(x, []) = false
    | compy(x::xx, y::yy) = ( floor(x*100.0) = floor(y*100.0) ) andalso compy(xx, yy);

Значение * 100.0 было связано с тем, что я хотел сравнить с точностью до 2 десятичных знаков.Затем я поменял compy на =

fun RFS([s,a,w,h], []) = None
    | RFS([s,a,w,h], R::acer) = if (compy([s,a,w,h], racer_stats(R)) ) then R
                else  RFS([s,a,w,h], acer);

Спасибо molbdnilo за то, что он указал, что реалы не являются типом равенства!

...