Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

Coś o Scali

Na samym wstępie – witam wszystkich. To mój pierwszy wpis nie tylko na blogu dobrychprogramów, ale i ogólnie w życiu. Prawdopodobnie nigdy bym go nie popełnił, gdyby nie nieopatrzna wzmianka pod którymś z wpisów dotyczących chyba wszystkim znanego Hostowego Challenge'u. Napisałem, że w Scali można sprawę załatwić w sposób równie dobry, a przy tym krótszy. Kilka osób wyraziło chęć przyjrzenia się takiej implementacji, więc... Czemu nie? Ale najpierw króciutko o języku.

Coś (króciutkiego) o pochodzeniu Scali

Scala to dzieło człowieka mocno zasłużonego w dziedzinie rozwoju Javy. Martin Odersky, bo o nim mowa, uznał, że Java jako język rozwija się zbyt ślamazarnie i coraz mniej nadaje się do podejmowania współczesnych nam wyzwań. Nie odrzucił jej jednak jako substytutu zła, szatana i polskiej służby zdrowia, ale zapragnął stworzyć dla niej coś, czym dla C był C++. Tyle że w wersji turbo.

Coś o zapożyczeniu z innych języków

Scala jest... skalowalna. Chodzi nie tylko o zastosowanie, ale i składnię. Pan Odersky może i jest jednym z tatusiów chrzestnych Javy, ale nie przeszkodziło mu to zauważyć, że niektóre sprawy w innych językach zorganizowano lepiej. Na przykład brak konieczności ciągłego wklepywania średników i typów zmiennych/funkcji. Te ciągle są poddawane silnej kontroli typów, ale w 90% sytuacji kompilator zrozumie, że skoro pakujemy do zmiennej/stałej łańcuch znaków, to nie oczekujemy raczej liczby zmiennoprzecinkowej. Mechanizm działa też z bardziej skomplikowanymi tworami (btw. w Scali nie ma typów prostych, wszystko jest obiektem) i zrozumie, jaką i jakiego typu utworzyć kolekcję. Zamiast długaśnego:

val t: Tuple2[Int, String] = new Tuple2(1, ”2”);

wystarczy:

val t = (1, ”2”).

Jeżeli jesteśmy „nieopatrzeni” i wolimy dokładnie widzieć, co w czym deklarujemy, możemy zachować

val t = Tuple2(1, ”2”)

Początkowo mnogość możliwości zapisu może wydawać się dziwna, ale trzykrotne zmniejszenie liczby znaków w deklaracji głupiej tupli chyba jest warte lekkiej zmiany przyzwyczajeń.

Coś o programowaniu funkcyjnym

C++ rozwinął C o między innymi mechanizmy obiektowości. Java miała je od początku, podobnie Scala (pełna obiektowość z kilkoma przydatnymi patentami). Novum stanowi pierwiastek programowania funkcyjnego, które ostatnimi laty przeżywa mały renesans. Nie chciałbym zagłębiać się w temat, o którym mam jeszcze nikłe pojęcie, ale po napisaniu pewnej ilości programów człowiek zaczyna dostrzegać zalety takiego podejścia. Autor języka w swoim (naprawdę świetnie napisanym) podręczniku wyraźnie je premiuje i co rusz pokazuje dowody, że tak jest zwięźlej i czytelniej, chociaż początkowo trudno się przestawić na konstrukcje raczej rzadko spotykane w światku języków imperatywnych.

Takie krótkie:

def list() = linesList.foreach(line => if(isHost(line)) println(line))

można rozpisać na javowe:

void list() { foreach(string line : linesList) { if (isHost(line)) println(line); } }

Co ciekawe, zaprezentowana postać funkcyjna została poddana lekkiemu tuningowi, bo na początku wyglądała tak:

def list(): Unit = { linesList.foreach((line: String) => {if (isHost(line)) println(line)}) }

Chwała najwyższemu, ewidentnie nadmiarowe nawiasy można pomijać. Podobnie jest z niektórymi nawiasami i kropkami między obiektem a wywoływaną metodą. Jeżeli człowiek się postara, funkcja może wyglądać niemal jak zdanie napisane (jakimś mocno pierwotnym :p) językiem naturalnym. Przykład: pizza add pepperoni, czyli pizza.add(pepperoni). Śliczne, chociaż prawdę mówiąc, sam się jeszcze do tego nie przyzwyczaiłem...

Oczywiście wszystko jest opcjonalne. Nikt nie będzie nam kasował kropek, nawiasów i średników. Pisanie długich deklaracji z uwzględnieniem każdego typu, każdego new i return (też są w dużej mierze opcjonalne) nie jest karane. Można mieszać programowanie funkcyjne i obiektowe, a nawet walnąć focha i postanowić „Tę klasę napiszę w czystej Javie” (i to będzie działać. Z poziomu Scali będzie można jej używać a nawet dziedziczyć). Tak na marginesie – pisząc w Scali, bez większych problemów możemy czerpać z przebogatego skarbca bibliotek javowych, po prostu importując to, czego nam potrzeba. Zaleta jak stąd (Polska, woj. dolnośląskie) do Mexico City.

Coś o tym, gdzie Scalę można wykorzystać

Jak to w przypadku języków ogólnego przeznaczenia – wszędzie. A dokładniej wszędzie, gdzie mamy JVM. Możemy pisać proste skrypty konsolowe (przykład za moment), aplikacje okienkowe (biblioteki graficznej z prawdziwego zdarzenia na razie brak, chociaż Scala świetnie działa ze Swingiem i są już wstępne wersje działającego Qt) i coraz głośniej robi się o Scali jako narzędziu w światku EE. Do czystoscalowego frameworka Lift dołączył chwalony za podobieństwo do Railsów Play2, szybko pojawia się cała masa narzędzi wspomagających (ORM, sterowanie zdarzeniami itd.). Fachowcy piszą o bardzo przyjemnym tworzeniu DSL-i (języków dziedzinowych).

Póki co Scala to język dla pasjonatów, ale i na naszym rynku powoli pojawiają się ogłoszenia, gdzie „Znajomość Scali będzie atutem” i coś czuję, że za jakiś czas będzie się dało na tym zarobić. Zwłaszcza że niektórzy ludzie związani z JVM typują Scalę na następcę Javy.

Coś o tym, czym Scala nie jest

Na pewno nie jest lekiem na całe zło. Tak naprawdę Scala stanowi swoistą „nakładkę” na Javę. Wygenerowany kod bajtowy będzie bardzo podobny do tego wyplutego z czystej Javy. Różnica jest taka, że przy podobnym efekcie piszemy zdecydowanie mniej, wygodniej i szybciej. Jeżeli chodzi o wydajność, różne są benchmarki i różne są wyniki. Wedle wszystkich Scala plasuje się w czołówce języków JVM. Czasem wyprzedza Javę, czasem nie i nie nastawiałbym się na 200% boost pisanych aplikacji.

Żeby to ładnie zobrazować:

Java to ogromne i solidnie zbudowane zamczysko, niestety zaniedbane i nadgryzione zębem czasu. Dalej spełnia swoją rolę, chociaż z oddali widać lepiej utrzymane twierdze i nowsze, lepiej zaprojektowane pałace. Scala to próba gruntownej renowacji. Naprawa ubytków, odmalowanie ścian, naprawa schodów, dobudowanie wind i podjazdów dla inwalidów. Nie zwiększa możliwości obronnych, ale sprawia, że wewnątrz dużo przyjemniej się mieszka, a zwiedzającym łatwiej jest wszędzie dotrzeć.

Coś o tym, czego nie opisałem, a co też jest fajne

W tym krótkim wpisie nie liznąłem nawet zagadnienia programowania obiektowego (może kiedyś...), chociaż dopiero tam Scala pokazuje pazurki. Znów jest zwięźlej (cała klasa wraz ze zmiennymi, konstruktorem parametrowym, metodami isEqual, hashCode i toString w pojedynczej linii), ale nie tylko. Na zachętę wspomnę tylko o nowym podejściu do interfejsów (nazwanych traits – cechami), w których wreszcie możemy implementować całe metody.

Coś praktycznego

W zasadzie ten wpis to bardzo ogólna... Nawet nie charakterystyka, ale raczej moje własne odczucia w stosunku do języka programowania, w którym zakochałem się już od pierwszego wejrzenia. Wybaczcie mizerną liczbę konkretów, ale tak to już jest w pierwszych fazach zakochania – zaburzona koncentracja, wyidealizowany obraz wybranki. Prawie jej nie znam, a już wydaje mi się, że chciałbym z nią spędzić życie. W przyszłości pewnie pochwalę się kilkoma przejawami tego, co tam razem zmajstrujemy.

Poniżej obiecana implementacja skryptu do edycji pliku hosts. Podejście proste i minimalistyczne. Nie jest to najzwięźlejsza z możliwych implementacja, ale w kodzie chciałem zobrazować parę ciekawostek wymienionych w tekście.

import scala.io.Source.fromFile import scala.util.matching.Regex import java.io.{FileWriter, File} // Import two classes from one package. // Scala is statically typing language with well designed type inference. val root = System.getenv("SystemRoot") // val root: String = System.getenv("SystemRoot") val host = """\system32\drivers\etc\hosts""" val linesList = fromFile(root+host, "utf-8").getLines.toList if (!args.isEmpty) args(0) match { case "list" => list() case "add" => if (args.length > 2) add() case "del" => if (args.length > 1) del() case _ => println("lol, wut?") } else println("Wut?") def isHost(line: String) = !line.trim.isEmpty && line.trim.head.isDigit // Without return function value = last value of block/line def list() = linesList.foreach(line => if(isHost(line)) println(line)) // Equal to: // def list(): Unit = { linesList.foreach((line: String) => {if (isHost(line)) println(line)}) } def add() { // FileWriter -> pure Java class. val fw = new FileWriter(root+host, true) fw write("\n\t" + args(1) + "\t\t" + args(2)) fw close // In Scala you can remove some dots and parentheses ( fw.write, fw.close() ). } def del() { val pattern = new Regex("(\\s|^|#)"+args(1)+"(\\s|$|#)") val newFile = linesList.filterNot(line => isHost(line) && !pattern.findFirstIn(line).isEmpty) val fw = new FileWriter(root+host, false) for(i <- 0 to newFile.length - 2) fw.write(newFile(i)+"\n") fw.write(newFile(newFile.length - 1)) fw.close }

I to tyle, jeśli chodzi o mój pierwszy (może nie ostatni) w życiu wpis na bloga ;-) 

programowanie

Komentarze

0 nowych
Druedain   14 #1 16.04.2012 10:37

Ładny wpis, gratuluję :)

Fajna ta skala, trochę o niej już czytałem, nawet prawie w niej coś napisałem, jednak brak czasu i większa ochota nauki innych rzeczy sprawiła, że pozostaje mi tylko cieszyć się jak głupi do sera czytając takie wpisy :P

  #2 16.04.2012 12:56

Czy ten język programowania ma duże zastosowanie? Bo z tego, co czytam język został udostępniony w 2004 r i jakoś słabo o nim słychać.

Macenty   3 #3 16.04.2012 12:59

Fajnie by było podobny wpis o Clojour przeczytać.

  #4 16.04.2012 13:36

Bardzo ładny wpis, osobiście używam Scali i bardzo cenię jej możliwości, propaguję ją gdzie się tylko da :)

Fajny awatar, to chyba Edward Norton jeśli mnie pamięć nie myli?

Frankfurterium   10 #5 16.04.2012 13:38

Pythona stworzono już w 1990 i chociaż jest świetnym językiem, też nie może przebić się do najgłówniejszego nurtu zabetonowanego przez dialekty post C++.

Scala przez parę lat była językiem czysto akademickim (normalna kolej rzeczy), ale już w 2009 roku zaczęło się o niej robić głośno w internecie. Jednak chociaż język zebrał sporo pochlebnych recenzji i wpisów blogowych, wciąż nie miał zaplecza. Dzisiaj jest już inaczej. Framework Lift zdążył dojrzeć, a Play szybko się rozwija i według mnie w nim można upatrywać źródła zarobku. Napisano sporo książek (po polsku niestety tylko jedną...), stworzono sporo technologii wspomagających + zaadaptowano kilka czysto javowych (np. google'wy GWT, Vaadin, Hibernate). Prawdopodobnie za jakiś czas w Scali będzie można użyć do większości zastosowań teraz Java only.

No i Scala nadaje się nie tylko dla programistów znających Javę, tak jak nie trzeba zaczynać od czystego C, żeby uczyć się C++. Nie znalazłem jeszcze dobrego kursu dla ludzi bez znajomości jakiegokolwiek języka programowania, ale na oficjalnej stronie języka są jakieś materiały dla programistów języków obiektowych (C++, Python, zwłaszcza C#) i funkcyjnych. Do tego podręcznik autora Scali w edycji pierwszej został udostępniony za darmo, edycja druga do wydatek niecałych 100 zł (w wersji elektronicznej).


Co do Clojure, sam chętnie bm coś takiego przeczytał, chociaż z 'Trójki Młodych Gniewnych na JVM' (razem z Groovym) właśnie Scala wydała mi się najbogatsza i najlepiej dostosowana do dzisiejszych potrzeb. Chętnie przeczytałbym felietonik mający (w kulturalny i merytoryczny sposób) mi udowodnić, że się mylę ;-)

iluzion   5 #6 16.04.2012 18:06

Świetny wpis. Tylko ten przykład funkcyjny z foreach na pierwszy rzut oka jest jakiś taki mało funkcyjny;) Elementy programowania funkcyjnego są bardzo dobrze opisane (i zobrazowane) w tym tutorialu:

http://learnyouahaskell.com/chapters

Co prawda przykłady są w Haskellu, ale nie to nie ma większego znaczenia.

"biblioteki graficznej z prawdziwego zdarzenia na razie brak, chociaż Scala świetnie działa ze Swingiem"

To zdanie brzmi tak jakby jedynym sposobem było importowanie Swinga bezpośrednio z Javy, a widzę, że Scala ma "własną" wersję (api) Swinga w bibliotece standardowej http://www.scala-lang.org/api/current/index.html#scala.swing.package

"The scala.swing package provides a collection of thin wrappers around Java Swing classes. Our goal is to deliver a library that at the same time feels natural to use in Scala and that is suf?ciently close to Java Swing to appeal to Java programmers with existing Swing experience."

http://www.scala-lang.org/sites/default/files/sids/imaier/Mon,%202009-11-02,%200...

Jedyne czego brakuje w tym momencie to designer/creator (chyba, że się mylę, bo w tym wypadku nie powinno być większych problemów z tego typu narzędziami).

@Anonim (niezalogowany)

"z tego, co czytam język został udostępniony w 2004 r i jakoś słabo o nim słychać"

W tym czasie powstały pewnie dziesiątki języków programowania, o których mało kto słyszał.

Software using Scala (wikipedia):

"In April 2009 Twitter announced they had switched large portions of their backend from Ruby to Scala and intended to convert the rest.

Foursquare uses Scala and Lift.

GridGain provides Scala-based DSL for cloud computing.

In April 2011, The Guardian newspaper's website guardian.co.uk announced that it was switching from Java to Scala, starting with the Content API for selecting and collecting news content. The website is one of the highest-traffic English-language news websites, and according to its editor has the second largest online readership of any English-language newspaper in the world, after the New York Times.

Swiss bank UBS approved Scala for general production usage.

LinkedIn uses the Scalatra microframework to power its Signal API."

To nie są firmy "krzak". Skoro szwajcarski bank potwierdza, że Scala nadaje się do zastosowania w warunkach produkcyjnych, to chyba jest to "używalny" język ;)

Nieco przeraża mnie tylko bogactwo tego języka i ilość sposobów rozwiązania problemu (z drugiej strony to duża zaleta mieć możliwość wyboru). Np. w "The Zen of Python" jest takie zdanie:

"There should be one-- and preferably only one --obvious way to do it."

W Scali to chyba nie ma zastosowania:)

Frankfurterium   10 #7 16.04.2012 18:53

Wszystko, o czym piszesz, to prawda.

Co do Swinga - to dobrze znany Swing javowy, jedynie opatulony w wyższą warstwę abstrakcji. Przyjrzałem mu się jedynie z daleka, bo cierpię na swingową awersję, ale wszystko wydaje się działać poprawnie i bez zauważalnego spadku wydajności, przy tym kod wygląda na sporo mniej zagmatwany. Mimo to scalowy Swing jakoś nie cieszy się wielką popularnością. Pewnie dlatego, że na razie populacja programistów Scali składa się w głównej mierze z korporacyjnych javowców i weteranów języków funkcyjnych, którzy radzą sobie bez fikuśnych okienek. Sam większą nadzieję pokładam w Qt Scampi, chociaż trudno znaleźć o tym wyczerpujące informacje. Gdybym teraz koniecznie musiał budować GUI, wolałbym je zmontować za pośrednictwem webowego GWT.


Dużo częściej Scala łamie "Explicit is better than implicit", bo naprawdę wiele dzieje się niejawnie/domyślnie/poza kodem. Oczywiście można z tych mechanizmów całkowicie zrezygnować (dla pewności można chyba nawet ich zakazać przez odpowiedni parametr przy kompilacji).



I - tak, to Edward Norton. Uwielbiam Fight Club (pisany i filmowy) i tego aktora :P

  #8 16.04.2012 18:59

Zapraszamy na irc://irc.freenode.net/#scala.pl

alucosoftware   7 #9 16.04.2012 23:11

@Frankfurterium

Wpis po prostu świetny!

iluzion   5 #10 17.04.2012 00:32

Nie da się w krótkim wpisie przekazać wszystkiego, ale warto wspomnieć, że Scala działa również na .NET, a "nakładka na Javę" nie oznacza "protezy". Nawiązując do porównania Java - zamczysko, Scala - dobrze zaprojektowany pałac, można zacytować zdanie, które podobno powiedział twórca Javy James Gosling: "If I were to choose language other than Java it would be Scala".

budda86   9 #11 17.04.2012 08:16

Scala nie jest żadną nakładką na Javę. Może być kompilowana do bajtkodu działającego na JVM, ale (o czym wspomniał przedmówca) może być też kompilowana do kodu działającego na .NET Framework. Jest zupełnie niezależnym językiem. Nakładką na Javę to jest np. Groovy.

Mnie boli brak porządnego IDE dla Scali. Wtyczka do Eclipse niestety jest daleka od ideału.

patryk9200   8 #12 17.04.2012 20:21

Super! Cieszę się, że zdecydowałeś się w końcu przedstawić ten język. Nawet nie miałem pojęcia, że jeden mój wpis na temat stworzonego przezemnie progamu spowoduje taki odzew i całą serię kolejnych wpisów.
Świetnie piszesz, bardzo przyjemnie czyta się ten wpis! :)

djfoxer   18 #13 17.04.2012 22:49

Ciekawy język, dość mocno uproszczony. Ktoś używał scali dla .NETa?Widzę, że na stronie projektu pracują nad wtyczką do Visuala, oby jak najszybciej wydali, to można będzie się pobawić.

iluzion   5 #14 17.04.2012 23:33

@djfoxer

Uproszczony? To raczej jeden z najbogatszych języków. Masz na myśli zwięzły?

Dwa przykłady z serii Java vs Scala:

http://i.imgur.com/9BtSS.png

iluzion   5 #15 17.04.2012 23:58

Tak przy okazji... Dokumentacja zaleca stosowanie wcięć w kodzie na 2 spacje.

http://docs.scala-lang.org/style/indentation.html

W Pythonie np. standardem są 4 spacje, chociaż niektórzy (szczególnie w większych lub komercyjnych projektach) stosują wcięcia na 2 spacje. Osobiście nie mogę ogarnąć wzrokowo kodu, w którym wcięcia mają szerokość 8 spacji lub jakieś egzotyczne pośrednie rozwiązanie:)

Frankfurterium   10 #16 18.04.2012 01:28

No niestety. Przy częstej pracy z regexami zawsze trzeba mieć gdzieś pod ręką [0-9a-zA-ZąćęłńóśźżĄĆĘŁŃÓŚŹŻ]

djfoxer   18 #17 18.04.2012 08:04

@iluzion
Zwięzły, dokładnie :) RaveStar trafnie zauważył, że drugi przykład można regexem zastąpić, ale deklaracja klasy i automatyczne przypisanie wartości jest ciekawe. To taka odwrotność "przegadanej" składni javy i .neta ;)

Druedain   14 #18 18.04.2012 08:54

@iluzion Większość IDE i tak potrafi automatycznie zmienić wcięcia w kodzie po naciśnięciu skrótu, więc ja bym się bardzo tym nie przejmował. Sam u siebie przestawiam wcięcia właśnie na 8, ale jakby ktoś bardzo był smutny, to wyklikać inny rozmiar można w pół minuty.

iluzion   5 #19 18.04.2012 17:27

@RaveStar

Przykład pochodzi z książki, której autorem jest twórca Scali. Raczej miał pokazać ogólne podejście, bez wnikania w szczegóły.

@Druedain

Ok, ale publikując kod lub fragmenty kodu zgodnie z zaleceniami dobrego stylu, zmniejsza się ilość powodów do smutku;)

matzu   5 #20 18.04.2012 17:58

@djfoxer
No nie wiem, czy trafnie. Uruchamianie silnika wyrażeń regularnych tylko po to, żeby sprawdzić, czy string zawiera jedną wielką literę, to lekki overkill.

Pomijam już fakt tego, że podane przez RaveStar wyrażenie regularne nie jest równoznaczne z kodem wrzuconym przez iluzion.

djfoxer   18 #21 18.04.2012 20:30

@matzu
Ogólnie jakieś bardziej skompilowane działania na stringu miło jest zrobić na regexie (np. walidacja @).

matzu   5 #22 18.04.2012 22:01

@djfoxer
"skompilowane działania na stringu miło jest zrobić na regexie"

Skomplikowane - zdecydowanie tak (chyba, że będzie istniało lepsze - w sensie wydajniejsze - rozwiązanie, nie powodujące znacznego przyrostu nakładu pracy). Kwestia tego co kto rozumie pod terminem skomplikowane. Kod, który wrzucił iluzion, pod ten termin nie podpada (nie chce mi się wierzyć, że uważasz inaczej).

@RaveStar
"Po dołożeniu polskich znaków"

Nie chodzi przecież tylko o polskie znaki. Informacje o co mi chodziło znajdziesz w dokumentacji metody isUpperCase. Hasło klucz do napisania poprawnego (w sensie dającego te same rezultaty, co kod iluzion) wyrażenia regularnego to "Unicode Character Categories".

To zdanie
"Poza tym, regex jest zwykle wykorzystywany do walidacji danych wprowadzanych przez użytkownika"

i to
", więc w zasadzie jego szybkość nie ma większego znaczenia."

wzajemnie się wykluczają (przynajmniej moim zdaniem). IMO walidacja to proces, który powinien przebiegać w miarę bezboleśnie (czytaj bez zauważalnego spowolnienia) dla użytkownika. Przecież walidacja, czy to np. adresu e-mail, czy też kodu pocztowego nie może trwać kilka sekund.

matzu   5 #23 20.04.2012 01:05

@RaveStar
"Robiłem kolejny test z regex tym razem poprawnie z uwzględnieniem unicodu. Walidacja jest tylko 2x wolniejsza, Tylko. To zupełnie do zaakceptowania."

Ciekawe, IMO 2x to wciąż dużo, ale ogólnie spodziewałem się większych różnic w wydajności.

Zrób może coś takiego ... wygeneruj powiedzmy 10 000 string-ów, z których żaden (to ważne) nie zawiera wielkiej litery i daj znać o wynikach.

BTW czy Java nie ma żadnego fajnego odpowiednika .NET-owej technologii LINQ? Nie chcę tu nikogo na siłę przekonywać do swoich racji, ale wyrażenie regularne tutaj po prostu nie pasuje :P Przykładowo w C# kod sprawdzający, czy dany string zawiera przynajmniej jedną wielką literę wyglądałby tak:

bool hasUpper = someString.Any(c => char.IsUpper(c));

Frankfurterium   10 #24 20.04.2012 11:51

I właśnie między innymi takimi pierdółkami, których od dawna nie można się w Javie doprosić, zajęła się Scala. Z brakujących mi w Javie rzeczy Scala posiada też przemyślane przeciążenia operatorów (tak naprawdę nie ma żadnych operatorów, tylko metody +, - itd.), a autor języka, zanim odszedł od Javy, dorzucił do niej typy i kolekcje generyczne.

Theres   1 #25 23.04.2012 00:54

@matzu
Dla Javy nie ma jakiegoś _pięknego_ odpowiednika LINQ, ale są 'jakieś' (lepsze i gorsze...) np. http://code.google.com/p/lambdaj/
w Scali można natomiast napisać tak: val hasUpper = someString.exists(_.isUpper) co jest prawie identyczne do tego co oferuje w tym zakresie LINQ :)