是否可以在从 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}
我正在做这样的事情
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}