背景
Scala初心者です。
ドワンゴのScala研修資料で、1個ずつ練習問題を解きながらScalaを勉強しています。
分からなかった練習問題
次の練習問題の解答が分かりませんでした。
練習問題
次のシグニチャを持つmapメソッドをfoldLeftとreverseを使って実装してみましょう:
scala
1def map[T, U](list: List[T])(f: T => U): List[U] = ???
解答
scala
1def map[T, U](list: List[T])(f: T => U): List[U] = { 2 list.foldLeft(Nil:List[U]){(x, y) => f(y) :: x}.reverse 3}
質問
解答の以下の項目について、教えていただきたいです。
{(x, y) => f(y) :: x}
のx
,y
の型は?たとえばmap(List(1,2,3))(x=>x*x)
を実行したときの場合など。f(y) :: x
と、Listの連結を行っている理由は?{(x, y) => f(y) :: x}
で、波括弧を使っている理由は?foldLeft
の使用箇所では、丸括弧を使っている。
また、map
メソッドをfoldLeft
とreverse
で実現するイメージが想像できません。
以下のツリー構造のような、分かりやすい表現がありましたら、そちらも教えていただきたいです。
txt
1 + 2 / \ 3 + 3 4 / \ 5 + 2 6 / \ 7 0 1
※ドワンゴ研修資料から引用
補足
「変数x
とy
の型は?」の質問内容が不十分だったため、補足いたします。
ドワンゴ研修資料には、foldLeft
のサンプルとして、以下のコードが載っていました。
scala
1List(1, 2, 3).foldLeft(0)((x, y) => x + y) 2//⇒ 6
上記のサンプルプログムから、私は以下のように判断しました。
- 上記のプログラムの、初期値、変数
x
,y
の型はInt
- したがって、
foldLeft
で使う初期値、変数x
,y
の型は、List
の型パラメータ
このような理解で、「mapメソッドをfoldLeftとreverseで実装する問題」の解答を見たとき、
以下の項目が疑問に思いました。
- 初期値の型は
List
? - 変数
y
の型はInt
だけど、x
の型はList
? - 変数
x
と変数y
の型は同じでなくてよい?
以上が、「変数x
とy
の型は何?」と質問した経緯です。
Scala APIドキュメント
では、foldLeft
の宣言は、
scala
1def foldLeft[B](z: B)(op: (B, A) ⇒ B): B
となっており、
- 初期値、変数
x
に対応する型パラメータはB
- 変数
y
に対応する型パラメータはA
でした。
変数x
とy
の型は異なっていて、いいんですね。
以上、foldLeft
の理解不足による質問でした。
参考にしたサイト
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/13 07:22
2018/01/13 07:34