繁体   English   中英

从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; x <- xs; return x} do {someStuff; x <- xs; return x} = do {someStuff; xs} do {someStuff; xs}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM