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 (モナド) を書くことができなくなります。

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 に答える