2011-09-20 14 views
6

F # Wyrażenia obliczeniowe pozwalają ukryć złożoność monadycznej składni za grubą warstwą cukru syntaktycznego. Czy w Scali jest coś podobnego?Odpowiednik do notacji Haskella lub Wyrażeń obliczeniowych F # w Scali?

Myślę, że to dla listowe ...

Przykład:

val f = for { 
    a <- Future(10/2) // 10/2 = 5 
    b <- Future(a + 1) // 5 + 1 = 6 
    c <- Future(a - 1) // 5 - 1 = 4 
} yield b * c   // 6 * 4 = 24 

val result = f.get 

Ale to naprawdę nie czuję się dobrze. Czy istnieje lepsza składnia?

dla exemple w Haskell trzeba

 
    main = do fromHandle <- getAndOpenFile "Copy from: " ReadMode 
      toHandle <- getAndOpenFile "Copy to: " WriteMode 
      contents <- hGetContents fromHandle 
      hPutStr toHandle contents 
      hClose toHandle 
      putStr "Done." 

ten przeciwieństwie Scala nie wyglądać jak pętla foreach. Składnia Scala wydaje się mieć zbyt silne sprzężenie ze zrozumieniem listy, co jest odrębną koncepcją. Które uniemożliwiają mi pisanie wewnętrznej DSL (monada), która nie wygląda dziwnie.

+4

Zrozumienie "za" jest dokładnie słuszne. Przywołują one do "map" i "flatMap" za kulisami, tak właśnie działa notacja Haskell 'do' (z wyjątkiem tych metod, które są nazywane' fmap' i '>> =' w Haskell). –

+0

@pelotom Chciałbym zobaczyć odpowiedź, która wyjaśnia nieco więcej. –

+5

@Dan Burton - To pytanie zostało zadane i udzielono odpowiedzi kilka razy ... Przekażę Ci tę doskonałą odpowiedź: http://stackoverflow.com/questions/1052476/can-someone-explain-scalas-yield/1059501 # 1059501 –

Odpowiedz

-2

Wygląda na to, że nie ma takiej składni dostępnej w scala i musielibyśmy ją zaimplementować samodzielnie za pomocą architektury wtyczki kompilatora.

+0

. Myślałem o używaniu makr - czy myślałeś o tym? –

4

brakujące ogniwo jest prawdopodobnie użycie = jest Scala za-listowe:

val f = for { 
    a <- Future(10/2) // 10/2 = 5 
    b <- Future(a + 1) // 5 + 1 = 6 
    c <- Future(a - 1) // 5 - 1 = 4 
    d = b * c   // 6 * 4 = 24 
} yield d 


val result = f.get 

Dzięki rozsądnemu mieszania zarówno <- i =, trzeba mieć wszystko, czego potrzeba elastyczności.

+1

Czasami życzyłbym, aby składnia "do" Haskella wyprowadzała "let" z użycia '=' –

Powiązane problemy