【发布时间】:2011-11-20 18:02:23
【问题描述】:
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这与 scala 不同,它看起来不像 foreach 循环。 Scala 语法似乎与列表理解有很强的耦合,这是一个独特的概念。这使我无法编写看起来并不奇怪的内部 DSL (monad)。
【问题讨论】:
-
for理解是完全正确的。他们在幕后对map和flatMap脱糖,这正是Haskelldo表示法的工作原理(除了这些方法在Haskell 中称为fmap和>>=)。 -
@Dan Burton - 这个问题已经被问过并回答了好几次......我会推荐你这个很好的答案:stackoverflow.com/questions/1052476/…
-
更正我的第一条评论...
fmap实际上并没有在 Haskell 中对do-notation 进行脱糖,因为没有必要的yield声明(而且我们也可以'不确定所有Monads 都是Functors,即使它们应该是)...而不是关键字yield,您只需使用return函数,当作为@987654336 中的最后一个语句调用时@block,相当于fmap。 -
感觉不对的符号是怎么回事?
-
当然,我们可以一直争论下去,但这不会改变大多数人
for与循环相关的事实,这是有充分理由的。是的,有可能“克服它”,但这并不能真正改变重点。
标签: scala haskell f# monads do-notation