加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何在Scala中编写Haskell-do-notation

发布时间:2020-12-16 18:06:47 所属栏目:安全 来源:网络整理
导读:我使用do-nation编写了以下 Haskell代码. 我想将其转换为Scala代码 main :: IO ()main = do print $func1 (Right 1) (Right 2) print $func1 (Right 10) (Right 3)func1 :: Either String Int - Either String Int - Either String Doublefunc1 e1 e2 = do v
我使用do-nation编写了以下 Haskell代码.

我想将其转换为Scala代码

main :: IO ()
main = do
  print $func1 (Right  1) (Right 2)
  print $func1 (Right 10) (Right 3)


func1 :: Either String Int -> Either String Int -> Either String Double
func1 e1 e2 = do
  v1 <- e1
  v2 <- e2
  if v1 < v2
    then Right 1.515151  -- No meaning
    else Left  "some error"

这是Haskell的输出

Right 1.515151
Left "some error"

我写了Scala代码,如下所示.但是当我查看结果< - if if(v1< v2)...并且得到结果时,我感到很奇怪.

object Main {
  def main(args: Array[String]): Unit = {
    println(func1(Right(1))(Right(2)))
    println(func1(Right(10))(Right(3)))
  }

  def func1(e1: Either[String,Int])(e2: Either[String,Int]): Either[String,Double] =
    for{
      v1 <- e1
      v2 <- e2

      // Weird...
      result <- if(v1 < v2)
                  Right(1.515151)
                else
                  Left("some error")
    } yield result
}

这是Scala的输出

Right(1.515151)
Left(some error)

我想写下吼叫.但斯卡拉不允许我写.

// Invalid Scala Code
  def func1(e1: Either[String,Double] =
    for{
      v1 <- e1
      v2 <- e2
    } {
      if(v1 < v2)
          Right(1.515151)
        else
          Left("some error")
    }

你能告诉我你以漂亮的方式写作的想法吗?

解决方法

它可以被美化一些.

for {
  v1  <- e1
  v2  <- e2
  res <- Either.cond(v1 < v2,1.515151,"some error")
} yield res

只是投入一个保护条件会很好,但根据Scala docs,这是不支持的,因为要么没有withFilter方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读