Scalaスケーラブルプログラミング本の疑問点

41 views
Skip to first unread message

M.I.

unread,
Oct 31, 2009, 3:15:28 AM10/31/09
to scala-be
こんにちは。

現在、Scalaスケーラブルプログラミング(コップ本)にて、Scalaを勉強中のものです。
すこし理解できない箇所が出てきたので、ご教授ください。

第9章の9.4の「新しい制御構造を作る」P167についてです。

例題として、twiceという関数を定義して、opという関数を二回実行させています。

=== 引用 ===
def twice(op: Double => Double, x: Double) = op(op(x))

twice(_ + 1, 5)
=== 引用 ===

となっています。

ここの、twice(_ + 1, 5) の「_」の意味がよくわかりません。
具体的には、どのような意味になるのでしょうか?

ちなみに、上記twiceの実行結果は、7となっています。

たぶん、opは以下のような定義になっているのだと思います。

def op(x:Double) = { x + 1.0 }


SAKAMOTO Kazunori

unread,
Oct 31, 2009, 3:41:24 AM10/31/09
to scal...@googlegroups.com
M.I.さん:

こんにちは、坂本と申します。

p147の8.5節「プレースホルダー構文」にて説明されています。

この場合の _ + 1 は (d: Double) => d + 1 という
関数リテラルのシンタックスシュガーになると思います。

2009/10/31 M.I. <inoue.m...@gmail.com>:
--
坂本 一憲
早稲田大学 理工学術院 基幹理工学研究科
情報理工学専攻 鷲崎研究室 修士1年
E-mail: exk...@gmail.com / ka...@ruri.waseda.jp
Mobile: unpack...@docomo.ne.jp
TEL: 090-7800-6023
twitter: exkazuu

M.I.

unread,
Oct 31, 2009, 4:52:07 AM10/31/09
to scala-be
坂本さま

ご返信ありがとうございます。

なるほど!!理解できました。

また、以下のようにして、実行してみましたが、やっぱり同じ結果ですね。
ありがとうございました。

===
twice( (d:Double) => d + 1, 5)
===

ちなみに、
twice( d:Double => d + 1, 5)

のように、d:Doubleの括弧を除くとエラーになりました。
これには、そのまま、実行できそうな気がしたので、ちょっと意外でした。



On 10月31日, 午後4:41, SAKAMOTO Kazunori <exka...@gmail.com> wrote:
> M.I.さん:
>
> こんにちは、坂本と申します。
>
> p147の8.5節「プレースホルダー構文」にて説明されています。
>
> この場合の _ + 1 は (d: Double) => d + 1 という
> 関数リテラルのシンタックスシュガーになると思います。
>
> 2009/10/31 M.I. <inoue.masay...@gmail.com>:
>
>
>
>
>
>
>
> > こんにちは。
>
> > 現在、Scalaスケーラブルプログラミング(コップ本)にて、Scalaを勉強中のものです。
> > すこし理解できない箇所が出てきたので、ご教授ください。
>
> > 第9章の9.4の「新しい制御構造を作る」P167についてです。
>
> > 例題として、twiceという関数を定義して、opという関数を二回実行させています。
>
> > === 引用 ===
> > def twice(op: Double => Double, x: Double) = op(op(x))
>
> > twice(_ + 1, 5)
> > === 引用 ===
>
> > となっています。
>
> > ここの、twice(_ + 1, 5) の「_」の意味がよくわかりません。
> > 具体的には、どのような意味になるのでしょうか?
>
> > ちなみに、上記twiceの実行結果は、7となっています。
>
> > たぶん、opは以下のような定義になっているのだと思います。
>
> > def op(x:Double) = { x + 1.0 }
>
> --
> 坂本 一憲
> 早稲田大学 理工学術院 基幹理工学研究科
> 情報理工学専攻 鷲崎研究室 修士1年
> E-mail: exka...@gmail.com / ka...@ruri.waseda.jp
> Mobile: unpack-ka...@docomo.ne.jp
> TEL: 090-7800-6023
> twitter: exkazuu

SAKAMOTO Kazunori

unread,
Oct 31, 2009, 1:05:46 PM10/31/09
to scal...@googlegroups.com
M.I.さん:

坂本です。

(d:Double) の () は省略したくなりますよね。

ちなみにーですが、
twice(d => d + 1, 5)
でも動きますよ。

twice の引数の型が Double というのは既知ですので、
型推論により d の型は省略できるようです。


2009/10/31 M.I. <inoue.m...@gmail.com>:

M.I.

unread,
Oct 31, 2009, 11:39:19 PM10/31/09
to scala-be
坂本さん

ご返信ありがとうございます。

> ちなみにーですが、
> twice(d => d + 1, 5)
> でも動きますよ。

ありがとうございます。
上記でも確認しました。

型推論は、まだ、なれないですね。。。

初めのうちは、わかりきっている場合でも、型を記述してしまいそうです。。。



On 11月1日, 午前2:05, SAKAMOTO Kazunori <exka...@gmail.com> wrote:
> M.I.さん:
>
> 坂本です。
>
> (d:Double) の () は省略したくなりますよね。
>
> ちなみにーですが、
> twice(d => d + 1, 5)
> でも動きますよ。
>
> twice の引数の型が Double というのは既知ですので、
> 型推論により d の型は省略できるようです。
>
> 2009/10/31 M.I. <inoue.masay...@gmail.com>:

Kenichi Kobayashi

unread,
Nov 3, 2009, 10:51:26 PM11/3/09
to scal...@googlegroups.com
みなさま
小林@豆蔵です。

Step by Step Scalaの[vol.01],[vol.02]のPDF資料を
http://groups.google.co.jp/group/scala-be/files
に公開しました。

今後も資料を順次公開していきます。
よろしくお願いします。

--
(株)豆蔵  小林健一
〒163-0434
東京都新宿区西新宿二丁目1番1号
新宿三井ビルディング 34階 私書箱302号
TEL: 03-5339-2165(BS事業部教育), FAX: 03-5339-1795
URL: http://www.mamezou.com/
E-mail: koba...@mamezou.com

tmiya

unread,
Nov 4, 2009, 10:19:27 AM11/4/09
to scala-be
tmiyaです

> Step by Step Scalaの[vol.01],[vol.02]のPDF資料をhttp://groups.google.co.jp/group/scala-be/files
> に公開しました。

Step by Step Scala Vol.3の発表資料のPDF版と演習課題資料のPDFを同じ場所に公開しました。

発表内容について、あるいは発表内容と関係無くても構いませんので、何か質問があればscala-beの方に書いて頂ければと思います。

tmiya

unread,
Nov 11, 2009, 10:46:12 AM11/11/09
to scala-be
Step by Step Scala Vol.3の演習課題の解答例のPDFもファイル置き場
http://groups.google.co.jp/group/scala-be/files
に 091104_ScalaChap67_answer.pdf として公開しました。

解答例についてはStep by Step Scala Vol.4の当日に丁寧に解答を解説する時間は
無いと思うので、この課題に興味のある方は各自ダウンロードして予め読んで
おいて頂ければと思います。
また質問は当日でもOKですが、このGoogle group上でもOKです。
Reply all
Reply to author
Forward
0 new messages