2

我正在做这样的事情

do
  xs <- xss
  x <- x
  if x > 3
  return x

包含 if 的行给了我一个编译错误,但我不太确定编写相同内容的正确方法。

为了更清楚起见,在 Scala 中,我想要实现的等价物是:

for {
  xs <- xss
  x <- xs
  if x > 3
  } yield x
4

1 回答 1

4

您需要导入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}

于 2018-02-26T00:31:42.370 回答