Я изучаю описание инструмента 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
делает его более вероятным для функции, нарушающей ссылочную прозрачность? Я просто полностью не понимаю их точку зрения?
Я думаю, что предупреждение 'return' предназначено для предотвращения использования, такого как' def f (x: Int): Int = ((w: Nothing) => 3) (return x) '(это функция тождества, а не константа' 3'). Хотя я могу согласиться с запретом 'return' (есть ли какие-либо причины для его использования в чистом коде?), Я бы не сказал, что« раннее возвращение »нарушает ссылочную прозрачность, поскольку вы можете добиться того же эффекта, используя продолжение -passing transform. – chi
@chi, call/cc или подобные конструкции, которые позволяют вам получить дескриптор первого класса в вашем _implicit_ продолжении, также не являются ссылочными. Передача функции продолжения _explicitly_ - совершенно другая история. То, что глобальное преобразование создает ссылочно прозрачную программу, не означает, что оригинал является ссылочно прозрачным (иначе изменяемое состояние будет также RT). –
@ Андреас Россберг. Я, вероятно, путал RT «возвращения» с чистотой 'foo'. – chi