Stavo leggendo la descrizione dello strumento Scala WartRemover ed ero confuso da uno dei punti che avevano. La descrizione diceva:La trasparenza referenziale di interruzione di ritorno?
return
interruzioni di trasparenza referenziale. Refactor per terminare i calcoli in modo sicuro.// 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)
Questo non ha alcun senso per me, ed entrambi gli esempi guardare referenzialmente trasparente. C'è un modo in cui la parola chiave return
rende più probabile che una funzione interrompa la trasparenza referenziale? Sto semplicemente fraintendendo il loro punto?
Penso che l'avviso "return" abbia lo scopo di prevenire usi come "def f (x: Int): Int = ((w: Nothing) => 3) (return x) '(che è la funzione identity, non la costante' 3'). Mentre posso essere d'accordo con il bando 'return' (c'è qualche ragione per usarlo affatto nel puro codice?), Non direi che un" early return "infrange la trasparenza referenziale, dal momento che si potrebbe ottenere lo stesso effetto sfruttando una continuazione -passare la trasformazione. – chi
@chi, call/cc o costrutti simili che consentono di ottenere un handle di prima classe sulla prosecuzione _implicit_ non sono neanche trasparenti. Essere passati una funzione di continuazione _esplicitamente_ è una storia completamente diversa. Che una trasformazione globale crei un programma referentially trasparente non implica che l'originale sia referenzialmente trasparente (altrimenti lo stato mutabile sarebbe anche RT). –
@AndreasRossberg vedo. Probabilmente stavo confondendo la RT di 'return' con la purezza di' foo'. – chi