Skip to content

Commit 14abf73

Browse files
author
Kota Mizushima
authored
Merge pull request #496 from saka1/add-nil-type-annotate
型注釈について追記。 close #493
2 parents e80edf4 + eab6f70 commit 14abf73

File tree

1 file changed

+25
-0
lines changed

1 file changed

+25
-0
lines changed

src/collection.md

+25
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,31 @@ List(1, 2, 3).foldLeft(1)((x, y) => x * y)
312312

313313
とすることで求める結果を得ることができます[^fold-sum-product]。その他にも様々な処理を`foldLeft`を用いて実装することができます。
314314

315+
さて、節の最後に、実用上の補足を少ししておきます。
316+
少し恣意的ですが1つの例として、「リストのリスト」をリストに変換する(平らにする)処理というのを考えてみます。
317+
`List(List(1), List(2 ,3))``List(1, 2, 3)`に変換するのが目標です。安直に書くとこうなるでしょうか:
318+
319+
```scala
320+
scala> List(List(1), List(2, 3), List(4)).foldLeft(Nil)(_ ++ _)
321+
<console>:12: error: type mismatch;
322+
found : List[Int]
323+
required: scala.collection.immutable.Nil.type
324+
List(List(1), List(2, 3), List(4)).foldLeft(Nil)(_ ++ _)
325+
^
326+
327+
```
328+
329+
しかしコンパイルが通りません。
330+
エラーメッセージの意味としては、今回の`Nil``List[Int]`型と見なされてほしいわけですが、期待したように型推論できていないようです。
331+
`Nil`に明示的に型注釈を付けることで、コンパイルできるようになります。
332+
333+
```tut
334+
List(List(1), List(2, 3), List(4)).foldLeft(Nil: List[Int])(_ ++ _)
335+
```
336+
337+
このように、`Nil`が混ざった処理はそのままだとうまくコンパイルが通ってくれないことがあります。
338+
そういう場合は型注釈を試すとよい、と頭の片隅に入れておいてください。
339+
315340
#### 練習問題
316341

317342
`foldLeft`を用いて、`List`の要素を反転させる次のシグニチャを持ったメソッド`reverse`を実装してみましょう:

0 commit comments

Comments
 (0)