Эквивалент do-нотации Haskell или F# Вычислительных выражений в Scala?
Выражения вычисления 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 "Копировать из:" Режим чтения toHandle <- getAndOpenFile "Копировать в:" WriteMode содержание <- hGetContents fromHandle hPutStr toHandle содержимое h Закрыть ручку putStr "Готово".
это в отличие от скалы не похоже на петли foreach. Кажется, что у синтаксиса Scala слишком сильная связь с пониманием List, что является четкой концепцией. Что мешает мне писать внутренний DSL (монада), который не выглядит странно.
2 ответа
Похоже, в 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
d = b * c // 6 * 4 = 24
} yield d
val result = f.get
С разумным смешением обоих <-
а также =
Вы должны иметь всю необходимую вам гибкость.