Сравните реальный список в sml - PullRequest
0 голосов
/ 26 июня 2018

Для следующего кода я получаю сообщение об ошибке:

fun epoly(L:real list, x:real)=
= if L = [] then 0.0 else (epoly(tl(L:real list), x:real));;

Ошибка:

stdIn:42.1-42.57 Error: operator and operand don't agree [equality type required]
  operator domain: ''Z * ''Z
  operand:         real list * 'Y list
  in expression:
    L = nil

1 Ответ

0 голосов
/ 26 июня 2018

Поскольку вы на самом деле не задаете вопрос, немного неясно, каково ваше намерение. Предположительно это попытка кода, который не работает, и сопровождающее сообщение об ошибке, и неявный вопрос: « Почему этот код не работает? Что я делаю не так, и что я могу сделать, чтобы улучшить его?"Но на самом деле это догадки, и это тоже ленивые вопросы.

Вот как может выглядеть ваше сообщение, если мои предположения выше верны и вы хотите получить положительный отзыв в будущем:

Я пытаюсь написать функцию, которая оценивает полином с действительными коэффициентами L для переменной x.

Похоже:

fun epoly (L : real list, x : real) =
    if L = [] then 0.0 else epoly(tl L, x)

К сожалению, я получаю ошибку типа, которую я не понимаю:

stdIn:1.35-1.91 Error: operator and operand don't agree [equality type required]
  operator domain: ''Z * ''Z
  operand:         real list * 'Y list
  in expression:
    L = nil

Что означает эта ошибка, и если это неправильный способ оценки полинома, то как будет выглядеть другой способ выполнить то же самое?

Еда на вынос:

  • Напишите, в чем заключается ваша проблема, не позволяйте другим предполагать, в чем заключается ваша проблема. Если вопрос легко понять, люди хотят ответить на ваш вопрос, а описание вашей проблемы словами говорит о том, что Вы думаете, что является проблемой, так что люди не пытаются ответить на неправильный вопрос. В этом случае ваш вопрос мог бы звучать так: « При какой версии спецификации Standard ML были удалены реалы как eqtype? », и достаточным ответом было бы '97 . Но вы были бы рады этому ответу?

    Как только вы знаете, как задать правильный вопрос, вы также можете лучше поискать в Google (например, поиск: оцените полином "стандартная мл" | sml ) и обнаружите, что существует код, из которого вы можете разрешить Вы сами вдохновляете: здесь , здесь , здесь .

  • Хорошо отформатируйте ваш код и убедитесь, что он работает. Используйте Markdown StackOverflow для удобного форматирования вашего кода. Размещенный вами код содержит артефакты из интерактивного REPL (дополнительно =), поэтому любой, кто скопирует и вставит его в REPL, получит ошибку, должен будет выяснить, где она произошла, исправить ее и тогда начните думать о том, что может быть проблемой, поскольку вы не сказали. Хорошее правило - проверять работоспособность кода, который вы разместили, скопировав его, как только вы зададите вопрос. Можно легко забыть включить нестандартную функцию.

Ответ, предполагая, что моя передача вашего «вопроса» несколько совпадает с вашим намерением:


Когда вы делаете if L = [] ..., тогда вы используете равенство для списков реалов, которое, в свою очередь, полагается на равенство для реалов, но реалы нельзя сравнивать на равенство. См. Вопросы и ответы " Почему я не могу сравнить реалы в Standard ML? " Вы можете проверить, если список реалов пуст, не сравнивая реалы, выполнив, например ,:

fun epoly (L, x) =
    if null L then 0.0 else epoly (tl L, x)

Это потому, что стандартная библиотечная функция null использует сопоставление с образцом в списках, но не обращается к элементам списка, тогда как = предполагает, что элементы, возможно, придется сравнивать. Несмотря на то, что в примере L = [] этого никогда не происходит на практике, в системе типов это все равно ошибка.

Если вы сравнивали реалы на равенство, рассмотрите возможность использования теста epsilon . Кроме того, рассмотрите возможность использования сопоставления с шаблоном вместо hd и tl, потому что эти функции могут завершаться сбоем и аварийно завершать работу, поскольку они являются частичными:

fun epoly ([],    x) = 0.0
  | epoly (c::cs, x) = epoly (cs, x)

Все, что делает эта функция - отбрасывает второй аргумент x, пересекает свой первый аргумент c::cs и ничего не делает с каждым коэффициентом c. Предположительно, чтобы оценить многочлен, вы должны сделать что-то с коэффициентами c и x, прежде чем делать то же самое рекурсивно с остальными коэффициентами cs и x, а затем каким-то образом составить их.

...