是否可以在从 Haskell 中的 do 块返回之前检查某些条件?

Is it possible to check some condition before returning from a do block in Haskell?

我正在做这样的事情

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 中你注定要在 for 循环中使用 yield 因为它是控制结构的一部分,在 Haskell 中 return 只是一个函数,你可以避免使用它。通常,正如 monad 规则所述,do {someStuff; x <- xs; return x} = do {someStuff; xs}