我在做这样的事情
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 中的 final if 语句只是一个过滤器,你可以这样写它:
do
xs <- xss
x <- xs
_ <- filter (>3) [x]
return x
根据评论进行编辑。甚至更好:
do
xs <- xss
filter (> 3) xs
在 Scala 中,你注定要在 for 循环中使用yield
,因为它是控制结构的一部分,而在 Haskell 中,return
只是一个函数,你可以避免使用它。一般来说,正如 monad 规则所述,do {someStuff; x <- xs; return x}
=do {someStuff; xs}