[解決済み] for-comprehensionでOptionとListを合成すると、順序によって型の不一致が発生する。
2023-06-06 20:27:09
質問
なぜこの構文はScalaでType Mismatchエラーを引き起こすのでしょうか?
for (first <- Some(1); second <- List(1,2,3)) yield (first,second)
<console>:6: error: type mismatch;
found : List[(Int, Int)]
required: Option[?]
for (first <- Some(1); second <- List(1,2,3)) yield (first,second)
SomeとListを入れ替えても問題なくコンパイルできます。
for (first <- List(1,2,3); second <- Some(1)) yield (first,second)
res41: List[(Int, Int)] = List((1,1), (2,1), (3,1))
これも問題なく動作します。
for (first <- Some(1); second <- Some(2)) yield (first,second)
どのように解決するのですか?
内包は
map
または
flatMap
メソッドを使用することができます。例えばこのようなものです。
for(x <- List(1) ; y <- List(1,2,3)) yield (x,y)
がそうなる。
List(1).flatMap(x => List(1,2,3).map(y => (x,y)))
したがって、最初のループ値(この場合。
List(1)
) を受け取ることになります。
flatMap
メソッド呼び出しを受け取ります。そのため
flatMap
の上に
List
は別の
List
を返した場合、for comprehensionの結果はもちろん
List
. (これは私にとって新しいことでした。for内包の結果が常にストリームになるとは限りません。
Seq
s.)
では、どのように
flatMap
がどのように宣言されているか見てみましょう。
Option
:
def flatMap [B] (f: (A) ⇒ Option[B]) : Option[B]
このことを頭に入れておいてください。それでは、誤った内包の仕方(
Some(1)
のあるもの)がどのようにマップ呼び出しのシーケンスに変換されるかを見てみましょう。
Some(1).flatMap(x => List(1,2,3).map(y => (x, y)))
さて、このようにすると、パラメータである
flatMap
を返すものであることがわかります。
List
を返しますが
Option
ではなく、必要な
事を解決するためには、以下のようにします。
for(x <- Some(1).toSeq ; y <- List(1,2,3)) yield (x, y)
これでうまくコンパイルできます。注目すべきは
Option
のサブタイプではないことに注意してください。
Seq
のサブタイプではありません。
関連
-
[解決済み] 依存するメソッドタイプの説得力のある使用例とは?
-
[解決済み] java.util.ListをScalaのリストに変換する方法
-
[解決済み] Scalaのアクター:受信と反応
-
[解決済み] 末尾再帰関数が最適化されるためのScalaアノテーションは何ですか?
-
[解決済み] Scalaの自動リソース管理にはどのようなものがありますか?
-
[解決済み] なぜ `private val` と `private final val` は違うのですか?
-
[解決済み] なぜScalaのimmutable Setは型が共変しないのか?
-
[解決済み] Scalaで2つ以上のリストをまとめてzipで圧縮することはできますか?
-
[解決済み] ScalaにおけるNull/Nothing/Unitの使用法
-
[解決済み] scalaのApp traitとmainメソッドの違いについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] IntelliJ IDEAで依存関係が変更された後、build.sbtから強制的に再ロードするには?
-
[解決済み] Scalaの配列の初期化
-
[解決済み] HDFSではなく、ローカルファイルをsc.textFileで読み込む方法
-
[解決済み] sbtとGradleの比較 [終了しました]。
-
[解決済み] Scalaでmapを使用してインデックスを受け取るにはどうしたらいいですか?
-
[解決済み] Apache SparkでDataframeのカラム値をListとして抽出する。
-
[解決済み] scalaでサブディレクトリ内の全ファイルをリストアップするには?
-
[解決済み] タプルのリストをマップに変換する (重複するキーに対処する?)
-
[解決済み] Scalaの場合 クラス継承
-
[解決済み] flatMap/Map変換のfor-comprehensionで迷う。