Zastanawiam się, jakie są techniczne różnice w implementacji między C # i Scalą oraz jak oba rozwiązania porównują się z pomysłami i obawami dotyczącymi implementacji wyrażonymi w e-mailu Peek Past lambda Briana Goetza, wysłanym na listę mailingową projektu Lambda (JSR 335) ?
Z e-maila:
Badaliśmy drogę „może lambdas powinny być po prostu klasami wewnętrznymi, to byłoby naprawdę proste”, ale ostatecznie doszliśmy do wniosku, że „funkcje są lepszym kierunkiem dla przyszłości języka”.
i dalej:
Ujęcie lambdas-are-objects świata w konflikcie z tą możliwą przyszłością. Widok świata na funkcje lambda nie jest taki, a zachowanie tej elastyczności jest jednym z punktów przemawiających za tym, aby nie obciążać lambdów nawet wyglądem obiektowym.
Wniosek:
Funkcje Lambdas-are-otwiera drzwi. Lambda-are-obiekty zamyka je.
Wolimy, aby te drzwi były otwarte.
A niektóre komentarze od osób w wątku Reddit mówią:
Właściwie wysłałem e-mail do Neala Gaftera na ten temat i ku mojemu ograniczonemu zrozumieniu jego wyjaśnienia C #, a obecny projekt Java jest dość podobny, ponieważ Delegaci są w rzeczywistości obiektami, a nie typami funkcji. Wygląda na to, że wierzy, że Java powinna uczyć się z wad lambda C # i unikać ich (podobnie jak C # nauczył się z wad Javy i unikał ich na początku).
Dlaczego podejście „Lambdas-are-funkcje” zapewnia więcej możliwości w przyszłości niż „Lambdas-are-objects”? Czy ktoś może wyjaśnić, jakie różnice istnieją i jak wpłynęłyby na sposób pisania kodu?
Widząc, że rzeczy w Scali „po prostu działają”, ciągle myślę, że coś mi brakuje w podejściach przyjętych / zaproponowanych w C # / Java (8), prawdopodobnie jest to związane z obawami o kompatybilność wsteczną?