是否可以在从哈斯克尔的 do 块返回之前检查一些条件?



我在做这样的事情

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}

相关内容

  • 没有找到相关文章

最新更新