Эквивалент do-нотации Хаскелла или Вычисления F # в Scala? - PullRequest
6 голосов
/ 20 сентября 2011

F # Выражения вычислений позволяют скрыть сложность монадического синтаксиса за толстым слоем синтаксического сахара. Есть ли что-то подобное в Scala?

Я думаю, что это для понимания ...

Пример:

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

Но на самом деле это не так. Есть ли лучший синтаксис?

Например, в Haskell у вас будет

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

это в отличие от скалы не похоже на петли foreach. Кажется, что у синтаксиса Scala слишком сильная связь с пониманием List, что является отдельной концепцией Что мешает мне писать внутренний DSL (монада), который не выглядит странно.

Ответы [ 2 ]

4 голосов
/ 20 сентября 2011

Недостающим элементом, вероятно, является использование = для понимания Скалы:

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

При разумном смешивании <- и = вы должны иметь всю необходимую вам гибкость.

0 голосов
/ 27 сентября 2011

Похоже, в scala такого синтаксиса нет, и нам нужно было бы реализовать его самостоятельно, используя архитектуру подключаемого модуля компилятора.

...