[英]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; x <- xs; return x}
do {someStuff; x <- xs; return x}
= do {someStuff; xs}
do {someStuff; xs}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.