なぜ関数型プログラミングは難しいのか? ソフトウェアデザイン 2015年8月号 ― 2016年04月07日 08時38分44秒
ASAHIネット(http://asahi-net.jp )のjouwa/salonから。
---
最近、Lisp, 関数型プログラミング、Prologなどの本のお買い上げや、本の出版がいろいろあって、勝手に盛り上がっているという話を何度か書いたけど、まとめる時間がないので、小出しにする。これもその1つ。
お買い上げありがとうございます。
Lispから始まってるから、偉い!と思って、私も買って読みました。
PHPプログラマがScalaを習得するまでの話とか、Scalaにそんな言語仕様あったんだと思うことがあった。ScalaでCAS-UBという電子書籍の出版システムを書いたのは、もう6, 7年前ですからね。復習にもなりました。
http://www.amazon.co.jp/exec/obidos/ASIN/B00XVN1OSU/showshotcorne-22/
ソフトウェアデザイン 2015年 08 月号 [雑誌] 雑誌 – 2015/7/18
技術評論社にある紹介。目次もあります。
http://gihyo.jp/magazine/SD/archive/2015/201508
ソフトウェアデザイン 2015年8月号
なぜ関数型プログラミングは難しいのか?
Lisp,Scala,Haskell,Elixir,Python,Clojure,関数型のエッセンスを学習する
関数型言語を難しく感じるのは、手続き型、命令型の言語からは、発想の転換が必要だからでしょう。
関数型は、変数に、一度代入したら(値を束縛したら)、変更不可能(Scalaみたいに例外的に許す場合もある)。変数が変更不可能で、どうやってプログラムを書くんだと思うかもしれないが、むしろ、きれいに書けるんですよね。
関数型では、forやwhileといった、ループは書かないのが普通。ループなしでどうやってプログラムを書くんだと思うかもしれないが、むしろ、きれいに書けるんですよね。
データのストリームに次々と処理を当てはめる感じで、いわゆるコマンドチェーンのスタイルになる。
イメージとしては、工場の流れ作業です。
ベルトコンベアで流れている材料が、まず、きれいにカットされて、それが加熱されて、ああだこうだと色々と処理されて、最後は、パッケージに入れられて、商品になる。
ああいう感じがつかめれば、関数型言語は、ほぼ手中にできています。
別に関数型言語でなくても、そういうスタイルのプログラミングはできるし、本書でも、Pythonで関数型言語のスタイルで書く記事があります。
これは、RubyやJavaでもできます。C++にもそういうライブラリがあるし。
Java 8のストリームとコレクションなんかは、まさに、関数型のいいところを使って並列・並行処理ができるようになってますね。
Scalaは、最初から、関数型とオブジェクト指向のいいとこ取りをやってます。
関連:
http://iiyu.asablo.jp/blog/2016/03/23/8055737
はじめてのLisp関数型プログラミング――ラムダ計算からリファクタリングまで一気にわかる
http://iiyu.asablo.jp/blog/2016/02/15/8018864
「Scalaパズル 36の罠から学ぶベストプラクティス」、「関数型オブジェクト指向AI プログラミング―Scala による人工知能の実装」
http://iiyu.asablo.jp/blog/2015/03/29/7600131
Scala関数型デザイン&プログラミング、Effective Perl 第2版
http://iiyu.asablo.jp/blog/2013/11/13/7053738
「Clojureによる、初めての関数型プログラミング」ほか、新世代LispのClojureネタ
http://iiyu.asablo.jp/blog/2012/10/31/6618253
WEB+DB PRESS Vol.67、Jenkins, 関数型プログラミング
http://iiyu.asablo.jp/blog/2013/08/04/6934387
関数型言語の解説書目録、Functional Programming Bibliography
---
最近、Lisp, 関数型プログラミング、Prologなどの本のお買い上げや、本の出版がいろいろあって、勝手に盛り上がっているという話を何度か書いたけど、まとめる時間がないので、小出しにする。これもその1つ。
お買い上げありがとうございます。
Lispから始まってるから、偉い!と思って、私も買って読みました。
PHPプログラマがScalaを習得するまでの話とか、Scalaにそんな言語仕様あったんだと思うことがあった。ScalaでCAS-UBという電子書籍の出版システムを書いたのは、もう6, 7年前ですからね。復習にもなりました。
http://www.amazon.co.jp/exec/obidos/ASIN/B00XVN1OSU/showshotcorne-22/
ソフトウェアデザイン 2015年 08 月号 [雑誌] 雑誌 – 2015/7/18
技術評論社にある紹介。目次もあります。
http://gihyo.jp/magazine/SD/archive/2015/201508
ソフトウェアデザイン 2015年8月号
なぜ関数型プログラミングは難しいのか?
Lisp,Scala,Haskell,Elixir,Python,Clojure,関数型のエッセンスを学習する
関数型言語を難しく感じるのは、手続き型、命令型の言語からは、発想の転換が必要だからでしょう。
関数型は、変数に、一度代入したら(値を束縛したら)、変更不可能(Scalaみたいに例外的に許す場合もある)。変数が変更不可能で、どうやってプログラムを書くんだと思うかもしれないが、むしろ、きれいに書けるんですよね。
関数型では、forやwhileといった、ループは書かないのが普通。ループなしでどうやってプログラムを書くんだと思うかもしれないが、むしろ、きれいに書けるんですよね。
データのストリームに次々と処理を当てはめる感じで、いわゆるコマンドチェーンのスタイルになる。
イメージとしては、工場の流れ作業です。
ベルトコンベアで流れている材料が、まず、きれいにカットされて、それが加熱されて、ああだこうだと色々と処理されて、最後は、パッケージに入れられて、商品になる。
ああいう感じがつかめれば、関数型言語は、ほぼ手中にできています。
別に関数型言語でなくても、そういうスタイルのプログラミングはできるし、本書でも、Pythonで関数型言語のスタイルで書く記事があります。
これは、RubyやJavaでもできます。C++にもそういうライブラリがあるし。
Java 8のストリームとコレクションなんかは、まさに、関数型のいいところを使って並列・並行処理ができるようになってますね。
Scalaは、最初から、関数型とオブジェクト指向のいいとこ取りをやってます。
関連:
http://iiyu.asablo.jp/blog/2016/03/23/8055737
はじめてのLisp関数型プログラミング――ラムダ計算からリファクタリングまで一気にわかる
http://iiyu.asablo.jp/blog/2016/02/15/8018864
「Scalaパズル 36の罠から学ぶベストプラクティス」、「関数型オブジェクト指向AI プログラミング―Scala による人工知能の実装」
http://iiyu.asablo.jp/blog/2015/03/29/7600131
Scala関数型デザイン&プログラミング、Effective Perl 第2版
http://iiyu.asablo.jp/blog/2013/11/13/7053738
「Clojureによる、初めての関数型プログラミング」ほか、新世代LispのClojureネタ
http://iiyu.asablo.jp/blog/2012/10/31/6618253
WEB+DB PRESS Vol.67、Jenkins, 関数型プログラミング
http://iiyu.asablo.jp/blog/2013/08/04/6934387
関数型言語の解説書目録、Functional Programming Bibliography
将棋:第1期電王戦。がんばれー、山崎隆之・叡王・八段 ― 2016年04月07日 08時39分17秒
ASAHIネット(http://asahi-net.jp )のjouwa/salonから。
---
初代叡王の山崎隆之八段が、PONANZAと戦う、第1期電王戦。4月9日10日、今度の土日です。
http://www.shogi.or.jp/kisen/denou/
日本将棋連盟:電王戦
http://shogi1.com/yamasakitakayuki-musume-kinchaku/
山崎隆之八段、叡王戦決勝で娘の写真を巾着袋に忍ばせて、対局中にこっそり見ていた
2015/12/20
プロ棋士とコンピュータ将棋との対戦といえば、団体戦でやった第3回将棋電王戦で、豊島将之七段が、休戦を仕掛けて、YSSに快勝しましたが、このときの豊島七段の考え方が、それまでのぼくの常識とは正反対で、しかし、「なるほど、そういうことか」と思いました。
http://www.shogi.or.jp/kisen/denou/3/index.html
第3回将棋電王戦
それまでのぼくの常識というか、コンピュータ将棋に対する多くの人の常識は、コンピュータは終盤は強いが、大局観がよくないので、序盤はだめ、中盤も弱みがあるというもの。だから、序中盤で、リードを奪って逃げ切るのがいい。
これが常識だったと思います。
ところが、豊島七段が、YSSと練習将棋を1000局くらい指して(*1)得た結論は、休戦を仕掛けて、序中盤をなるべくすっとばして、自分の脳がフレッシュで、疲れていない間に、終盤にして、勝ちきってしまうということ。
*1
多忙な公式戦の合間に、1000局も指すというのが、すごいし、大変だっただろうなと思う。
数年前までは、ぼくは、定跡も日々変化しているし、いくらコンピュータが棋譜から機械学習をしても、人間は、まだ勝てると思っていましたが、もはや、羽生善治名人でも、コンピュータには継続的には勝てないと思っています。
負ける原因で一番大きいのは、人間は疲れるが、機械、コンピュータは疲れないこと。
それは、人間は、走るスピード、距離では、バイクや自動車に勝てないのと同じ世界です。
人間は、疲れればミスが出やすくなり、特に将棋は、最終盤で、もう勝ちは間違いないという局面でも、一手緩かったり、悪手を指すと、すぐ逆転負けになってしまうゲーム。
ということで、豊島さんは、休戦を仕掛けて、疲れる前に、終盤戦にして、読み切ってしまれば勝てるという戦略で勝ったことに、なるほどと思ったわけです。
終盤力に自信がある豊島七段ならではの戦略だったとは思いますが。
これに関して、森下卓九段が、人間の脳の疲れを軽減するために、頭の中だけで駒を動かして考えるのではなく、「継ぎ盤」(検討用の将棋盤)を人間が使って、駒を動かして検討していいようにすれば、人間はもっと戦えるだろうというので、実際にコンピュータと対戦しました。
結果は、森下九段の勝利が間違いない状況になったけれど、コンピュータはいさぎよく投了するということをせず、無駄に終局を長引かせるだけのなったので、森下九段の判定勝ちということになりました。
なお、森下九段には、コンピュータ将棋について、深い話があるので、それは、関連をみてください。
http://shogi1.com/denousen-revenge-match/
指掛けの電王戦リベンジマッチは指継がず、森下卓九段の判定勝ちと発表。ニコ生アンケート結果は良かった85%
2015/2/16 2015/3/2
山崎八段は、独創的な将棋を指し、定跡の進行より、力戦、乱戦を好む棋風。
これ、定跡通りの進行より、観ているほうは、はらはらどきどきで、楽しいんですが、負けるときは、いいところなく、あっという間に負けてしまうので、果たして、どういう戦略で、戦いの望むのか、興味深いです。
ちなみに、森信雄門下の弟弟子に、糸谷哲郎八段(「いとたに」じゃなくて、濁って「いとだに」です。だから、豊川孝弘七段は、「ダニー」と呼んでいます)、前竜王がいますが、彼も、独創的な棋風、力戦、乱戦を好む棋風です。
渡辺明竜王が復位した、この前の竜王戦。その棋風を、渡辺竜王に的確にとがめられていましたからね。
山崎八段もそうなる可能性もあるわけです。かといって、定跡の進行から序中盤の長い将棋になると、疲れが出るかもしれないし。
一応、2日制なので、人間が休む時間もあるんですけどね。
いや、ほんと、そういうことも加味して、どういう作戦で戦うのか、興味深いです。
関連:
http://iiyu.asablo.jp/blog/2008/09/15/3763998
将棋、森下卓九段の深い話
http://iiyu.asablo.jp/blog/2009/12/16/4759175
将棋ネタ。コンピュータ将棋はすごいよ。深浦王位の奥様はもっとすごいけど。
http://iiyu.asablo.jp/blog/2010/10/10/5394643
清水市代女流王将 VS あから2010
http://iiyu.asablo.jp/blog/2013/02/27/6732402
将棋界の一番長い日、完全中継。谷川さん、がんばれ。故米長永世棋聖のこと
---
初代叡王の山崎隆之八段が、PONANZAと戦う、第1期電王戦。4月9日10日、今度の土日です。
http://www.shogi.or.jp/kisen/denou/
日本将棋連盟:電王戦
http://shogi1.com/yamasakitakayuki-musume-kinchaku/
山崎隆之八段、叡王戦決勝で娘の写真を巾着袋に忍ばせて、対局中にこっそり見ていた
2015/12/20
プロ棋士とコンピュータ将棋との対戦といえば、団体戦でやった第3回将棋電王戦で、豊島将之七段が、休戦を仕掛けて、YSSに快勝しましたが、このときの豊島七段の考え方が、それまでのぼくの常識とは正反対で、しかし、「なるほど、そういうことか」と思いました。
http://www.shogi.or.jp/kisen/denou/3/index.html
第3回将棋電王戦
それまでのぼくの常識というか、コンピュータ将棋に対する多くの人の常識は、コンピュータは終盤は強いが、大局観がよくないので、序盤はだめ、中盤も弱みがあるというもの。だから、序中盤で、リードを奪って逃げ切るのがいい。
これが常識だったと思います。
ところが、豊島七段が、YSSと練習将棋を1000局くらい指して(*1)得た結論は、休戦を仕掛けて、序中盤をなるべくすっとばして、自分の脳がフレッシュで、疲れていない間に、終盤にして、勝ちきってしまうということ。
*1
多忙な公式戦の合間に、1000局も指すというのが、すごいし、大変だっただろうなと思う。
数年前までは、ぼくは、定跡も日々変化しているし、いくらコンピュータが棋譜から機械学習をしても、人間は、まだ勝てると思っていましたが、もはや、羽生善治名人でも、コンピュータには継続的には勝てないと思っています。
負ける原因で一番大きいのは、人間は疲れるが、機械、コンピュータは疲れないこと。
それは、人間は、走るスピード、距離では、バイクや自動車に勝てないのと同じ世界です。
人間は、疲れればミスが出やすくなり、特に将棋は、最終盤で、もう勝ちは間違いないという局面でも、一手緩かったり、悪手を指すと、すぐ逆転負けになってしまうゲーム。
ということで、豊島さんは、休戦を仕掛けて、疲れる前に、終盤戦にして、読み切ってしまれば勝てるという戦略で勝ったことに、なるほどと思ったわけです。
終盤力に自信がある豊島七段ならではの戦略だったとは思いますが。
これに関して、森下卓九段が、人間の脳の疲れを軽減するために、頭の中だけで駒を動かして考えるのではなく、「継ぎ盤」(検討用の将棋盤)を人間が使って、駒を動かして検討していいようにすれば、人間はもっと戦えるだろうというので、実際にコンピュータと対戦しました。
結果は、森下九段の勝利が間違いない状況になったけれど、コンピュータはいさぎよく投了するということをせず、無駄に終局を長引かせるだけのなったので、森下九段の判定勝ちということになりました。
なお、森下九段には、コンピュータ将棋について、深い話があるので、それは、関連をみてください。
http://shogi1.com/denousen-revenge-match/
指掛けの電王戦リベンジマッチは指継がず、森下卓九段の判定勝ちと発表。ニコ生アンケート結果は良かった85%
2015/2/16 2015/3/2
山崎八段は、独創的な将棋を指し、定跡の進行より、力戦、乱戦を好む棋風。
これ、定跡通りの進行より、観ているほうは、はらはらどきどきで、楽しいんですが、負けるときは、いいところなく、あっという間に負けてしまうので、果たして、どういう戦略で、戦いの望むのか、興味深いです。
ちなみに、森信雄門下の弟弟子に、糸谷哲郎八段(「いとたに」じゃなくて、濁って「いとだに」です。だから、豊川孝弘七段は、「ダニー」と呼んでいます)、前竜王がいますが、彼も、独創的な棋風、力戦、乱戦を好む棋風です。
渡辺明竜王が復位した、この前の竜王戦。その棋風を、渡辺竜王に的確にとがめられていましたからね。
山崎八段もそうなる可能性もあるわけです。かといって、定跡の進行から序中盤の長い将棋になると、疲れが出るかもしれないし。
一応、2日制なので、人間が休む時間もあるんですけどね。
いや、ほんと、そういうことも加味して、どういう作戦で戦うのか、興味深いです。
関連:
http://iiyu.asablo.jp/blog/2008/09/15/3763998
将棋、森下卓九段の深い話
http://iiyu.asablo.jp/blog/2009/12/16/4759175
将棋ネタ。コンピュータ将棋はすごいよ。深浦王位の奥様はもっとすごいけど。
http://iiyu.asablo.jp/blog/2010/10/10/5394643
清水市代女流王将 VS あから2010
http://iiyu.asablo.jp/blog/2013/02/27/6732402
将棋界の一番長い日、完全中継。谷川さん、がんばれ。故米長永世棋聖のこと
最近のコメント