kmizuの日記

プログラミングや形式言語に関係のあることを書いたり書かなかったり。

プレースホルダー構文クイズ(解答編)

淡々と解答編。

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