我正在做这样的事情
do
xs <- xss
x <- x
if x > 3
return x
包含 if 的行给了我一个编译错误,但我不太确定编写相同内容的正确方法。
为了更清楚起见,在 Scala 中,我想要实现的等价物是:
for {
xs <- xss
x <- xs
if x > 3
} yield x
我正在做这样的事情
do
xs <- xss
x <- x
if x > 3
return x
包含 if 的行给了我一个编译错误,但我不太确定编写相同内容的正确方法。
为了更清楚起见,在 Scala 中,我想要实现的等价物是:
for {
xs <- xss
x <- xs
if x > 3
} yield x
您需要导入Control.Monad
和使用guard
import Control.Monad (guard)
do
xs <- xss
x <- xs
guard (x > 3)
return x
另外,由于 scala 中最后的 if 语句只是一个过滤器,你可以这样写:
do
xs <- xss
x <- xs
_ <- filter (>3) [x]
return x
编辑,根据评论。更好的是:
do
xs <- xss
filter (> 3) xs
在 Scala 中你注定要yield
在 for 循环中使用,因为它是控制结构的一部分,而在 Haskellreturn
中只是一个函数,你可以避免使用它。一般来说,如 monad 规则所述,do {someStuff; x <- xs; return x}
=do {someStuff; xs}