Подтвердить что ты не робот

Возвращает ли обратная ссылочная прозрачность?

Я читал описание инструмента Scala WartRemover и был сбит с толку одним из пунктов, которые у них были. В описании сказано следующее:

return прерывает ссылочную прозрачность. Рефакторинг для завершения вычислений безопасным способом.

// Won't compile: return is disabled
def foo(n:Int): Int = return n + 1
def foo(ns: List[Int]): Any = ns.map(n => return n + 1)

Это не имеет никакого смысла для меня, и оба примера выглядят ссылочно прозрачными. Есть ли какой-то способ, в котором ключевое слово return делает его более вероятным для функции, нарушающей ссылочную прозрачность? Я просто полностью не понимаю их точку зрения?

4b9b3361

Ответ 1

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

За исключением того, что утверждения "return" вообще не оцениваются. Они приводят к тому, что текущий вызов метода включения оценивается. Не существует способа, который бы соответствовал понятию прозрачности ссылок. Аналогичная проблема имеет и оператор "throw".

Для примеров первый

def foo(n:Int): Int = return n + 1

является доброкачественным, но многословным и неидиоматическим. Второй

def foo(ns: List[Int]): Any = ns.map(n => return n + 1)

является гораздо более проблематичным. Если он прошел пустой список, он возвращает пустой список. Если передан не пустой список, он возвращает значение главы списка плюс 1.