2012-04-16 18 views
6

Zaczynam studiować język programowania Scala. mam jakąś znajomość języków FP jak Erlang i Haskell i mam wątpliwości co do znaczenia dla/wydajność ekspresji, jak:Czy "wydajność" w Scali jest odpowiednikiem funkcji mapy?

for (arg <- args) yield arg.length 

byłoby zebrać tablicę długości dowolnego argumentu wejściowego. Z tego co zrozumiałem to wydaje się funkcji mapy w normalnym programowaniu FP:

map (\a -> a * 2) [1, 2, 3] (in Haskell) 

wiem, że biblioteka Scala zawiera metodę scala.collection.map, więc chciałbym wiedzieć: czy istnieje różnica lub ograniczenia w używaniu obu stylów lub są dokładnie takie same?

+1

możliwe duplikat (http://stackoverflow.com/questions/1052476/can-someone-explain-scalas-yield) –

+2

Scala dla zrozumienia są podobne do notacji "do" Haskella. –

+1

#Daniel, ale nie pytam o znaczenie "yield", ale o podobieństwo z innymi wyrażeniami FP! –

Odpowiedz

14

for ... yield zrozumienie w Scala jest tłumaczony przez kompilator do map, flatMap i withFilter wywołań metod. for bez yield zostanie przetłumaczone na wywołanie metody foreach. Można znaleźć kilka przykładów i więcej informacji tutaj: [? Może ktoś wyjaśnić plonu Scala]

http://tataryn.net/2011/10/whats-in-a-scala-for-comprehension/

i tutaj

http://adamwojtuniak.wordpress.com/2010/09/24/scala-for-comprehensions/

+4

I tak, flatMap i withFilter są równoważne konkat i wybierz ... Powinny naprawdę zdefiniować standardowy system nazewnictwa dla tych funkcjonalnych wzorów;) –

6

Scala for/yield wyrażenia są całkowicie równoważne listowe/Lista monady w Haskell, i mają dokładnie te same możliwości, tak długo, jak trzymać się jednego rodzaju na for wypowiedzi. (Nie wiem o Erlang, choć.)

W szczególności, Twój przykład dokładnie przekłada się [length arg | arg <- args], tłumacząc Scala wołania metod x.f zastosowaniu funkcji Haskell f x.

+1

Czy 'yield' generuje przyrostowy wynik, czy całą listę za jednym razem? –

+1

Dobry przykład Ptharien, Haskell zawsze wyprzedzał czas! O przyrostowym wyniku wydajności, myślę, że ma to znaczenie, gdy chcesz zrównoleglić kod, o czym pamiętam Scala ma kolekcję równoległą i metodę .par dla tego w 2.9. –

3

Przydział jest kompilowany do map - znajduje się w książce Programowanie w Scali.

Powiązane problemy