gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 20:57:04 25 4
gpt4 key购买 nike

我使用 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 代码。但我看result <- if(v1 < v2)...就感觉怪怪的和yield result .

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)

我想写如下。但 Scala 不允许我写。

  // Invalid Scala Code
def func1(e1: Either[String, Int])(e2: Either[String, Int]): 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 ,这不受支持,因为 Either 没有 withFilter 方法。

关于scala - 如何在 Scala 中编写 Haskell-do-notation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45343417/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com