предупреждение В мл


Может кто-нибудь объяснить, что означает это предупреждение?

stdIn:18.35 Warning: calling polyEqual

И почему у меня есть "А", а не " а " в следующем утверждении:

val alreadyVisited = fn : ''a * ''a list -> bool

Это функция:

fun alreadyVisited(v, []) = false
    | alreadyVisited(v, x::xs) = if(x=v) then true
        else alreadyVisited(v, xs);

Заранее спасибо

1 25
sml

1 ответ:

'a означает "любой тип", в то время как ''a означает"любой тип, который можно сравнить для равенства". Так как Ваша alreadyVisited Функция сравнивается x и v с помощью =, x и v должен иметь тип, который поддерживает сравнение их на равенство, поэтому вы получаете тип ''a.

Предупреждение означает, что вы сравниваете два значения с полиморфным типом для равенства.

Почему это вызывает предупреждение? Потому что это менее эффективно, чем сравнение двух значений известных типов для равенство.

Как избавиться от предупреждения? Изменив функцию на работу только с определенным типом вместо любого типа.

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