7

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 "复制自:" ReadMode
          toHandle <- getAndOpenFile "复制到:" WriteMode
          内容 <- hGetContents fromHandle
          hPutStr toHandle 内容
          h关闭手柄
          putStr "完成。"

这与 scala 不同,它看起来不像 foreach 循环。Scala 语法似乎与列表理解有很强的耦合,这是一个独特的概念。这使我无法编写看起来并不奇怪的内部 DSL (monad)。

4

2 回答 2

4

缺少的部分可能是使用=scala 的 for-comprehensions:

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

通过明智地混合<-=,您应该拥有所需的所有灵活性。

于 2011-09-20T08:31:39.973 回答
-2

在 scala 中似乎没有这样的语法可用,我们需要使用编译器插件架构自己实现它。

于 2011-09-26T20:14:19.813 回答