2

私はscalaが初めてです。誰か私に次のコードを説明してもらえますか?

 val l: Either[String, Int] = Left("flower")
 val r: Either[String, Int] = Right(12)
 l.left.map(_.size): Either[Int, Int] // Left(6)
 r.left.map(_.size): Either[Int, Int] // Right(12)

3 行目と 4 行目についていくつか質問があります。

  1. コンテキストで _.size は何を表していますか?
  2. r.left は何を返しますか?
  3. r.left.map は何を返しますか?
  4. r.left.map(_.size): Each[Int, Int] とはどういう意味ですか?

ありがとう!

4

1 に答える 1

5

l最初の行はtypeの変数を定義しますEither[String, Int]。(Either抽象) クラスは、何かが 2 つの可能な値のいずれかを保持できる場合を示すために使用されます。およびクラス サブクラスLeft、したがって有効な割り当て。慣例では、ある種の失敗 (例:何がうまくいかなかったかの説明)を示し、ある種の成功した計算/値を示します。この情報があれば、2 行目もかなり自明です。RightEitherLeftStringRight

l3 行目と 4 行目では、 変数と変数に射影を使用し、rを実行しmapます。leftおよびメソッドは射影を返します。変数にright射影するとleft、内部の値を超えることができます。変数に射影すると、. などで行う場合も同じです。LeftmaprightLeftRightmaprightLeft

したがって、3行目lはaLeftであり、それを射影すると、「花」の長さは6であるため、与えられた値を超えてleft適用されます。mapLeft("flower")Left(6)

4 行目でrRight、そうなので何もしません。

ご質問について:

  1. _.sizeはメソッドに渡される関数mapです。mapメソッドは内部の値を「アンパック」し( 4 行目は左射影であるためLeft何もしません)、それを呼び出します。Right.size

  2. r.left値の左射影を返しRight(12)ます。コードの 4 行目に見られるように、これをマッピングしても何も起こりません。

  3. 同じ古いRight(12)値。

  4. それはRight(12)and 型Right[_, Int]であるため、 をサブクラスEither[Int, Int]化するため、有効です。私が信じているタイプを示すためにそこにあるだけです。

REPL に移動して のようなタイプを入力すると、タイプval foo = Right(1234)が取得されます。タイプはすべてのタイプのサブクラスRight[Nothing, Int]であるため、これは「機能します」 。Nothing

関連するメモとして、これや Scala に慣れてきたら、Scalaz (型クラス、モナドなどの関数型プログラミングを提供する Scala 用のライブラリ) とValidationかなり似ているクラスをチェックすることをお勧めします。にEither

于 2012-09-20T01:42:13.947 に答える