предупреждение в ОД - PullRequest
       23

предупреждение в ОД

27 голосов
/ 01 декабря 2010

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

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 Ответ

46 голосов
/ 01 декабря 2010

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

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

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

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

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

...