我使用do-nation編寫了以下Haskell代碼。如何在Scala中編寫Haskell-do-notation
,我想將它轉化成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"
這裏是哈斯克爾
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
}
這裏是斯卡拉
的
Right(1.515151)
Left(some error)
輸出我想波紋管寫。但斯卡拉不允許我寫。
// 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")
}
你能告訴我你用美麗的方式寫作的想法嗎?
非常感謝你,jwvh!我不知道'two.cond'。其實我想在scalaz中使用'EitherT'而不是'Either',所以我搜索'EitherT'中的'Either.cond'選項,但是我找不到它。你能告訴我,如果你知道嗎? – redstone
對不起,不知道斯卡拉。它在我的TODO清單上。 – jwvh