プレースホルダー構文クイズ(解答編)
淡々と解答編。
1. =の右辺の展開結果が全く同じになるコード例のグループを全て列挙してください
A.
(1-2, 1-5), (2-1, 2-2), (2-3, 2-4), (3-1, 3-5), (4-3, 4-4)
2. コンパイルできるコード例を全て抽出してください(e.g. 1-2, 1-3)。
A.
1-2, 1-3, 1-5, 2-1, 2-2, 2-3, 2-4, 3-3, 3-4, 4-3, 4-4
3. コンパイルできないコード例を二つ以上抽出し、その理由を簡単に述べてください。
A.
- 1-1: 右辺の展開結果が
($x, $y) => $x + $y
のようになり、左辺に$x, $yの型を推測するために必要な型情報が存在しないため。
- 1-4: 1-1と同じ。
- 3-1: 右辺の展開結果が
($x) => List(1, 2, 3).map($x)
のようになり、左辺に$の型を推測するために必要な型情報が存在しないため。
- 3-2: 右辺の展開結果は
($x: Int) => List(1, 2, 3).map( ($x:Int) )
のようになる。ここで、mapの引数としてはIntを受け取る関数が必要だが、$xの型はただのIntであり、型が合わない。
- 3-5: 右辺の展開結果は
($x) => List(1, 2, 3).map($x)
のようになるが、左辺の型はList[Int]であり、型が合わないため。
- 4-1: プレースホルダー(_)の外側の式が存在しないため。Scala Language Specification p.94「 Placeholder Syntax for Anonymous Functions」によれば、
Define an underscore section to be an expression of the form _:T where T is a type,
or else of the form _, provided the underscore does not appear as the expression
part of a type ascription _:T .An expression e of syntactic category Expr binds an underscore section u, if the following two conditions hold: (1) e properly contains u, and (2) there is no other expression of syntactic category Expr which is properly contained in e and which itself
properly contains u.
である。ここで、underscore section _または_:Tを真に含む式eが存在しなければいけないことが記述されている。しかし、4-1では、_を真に含む式が存在しないため、正しいプレースホルダー構文の条件が満たされない。
- 4-2: 右辺の展開結果は、
identity*1
となるが、左辺に$xの型を推測するために必要な型情報が存在しないため。
りりろじさんからの指摘を受けて追記。自分で作成した問題のくせに完全に抜けていたorz
4-5: 右辺の展開結果は、
identity( ($x) => identity($x) )
となるが、左辺に$xの型を推測するために必要な型情報が存在しないため。
とまあ、こんな感じです。需要があれば解説編書きますが、たぶん無い。
*1:$x) => identity($x