我用do-notation编写了以下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")
}
你能告诉我如何以优美的方式撰写文章吗?
Either.cond
。实际上,我想使用 scalaz 中的EitherT
而不是Either
,所以我搜索了EitherT
中的Either.cond
替代方法,但我找不到。您能告诉我是否知道吗? - ryo