ブログ「サイバー少年」

ブログ「サイバー少年」へようこそ!
小学六年生ごろからプログラミングを趣味にしている高校生のブログです。
勉強したことについての記事などを書いています。フリーソフトも制作、公開しています。
(当ブログについて詳しくは「ブログ概要紹介」を参照)

サイバー少年が作ったフリーソフトは「サイバー少年の作品展示場」へ

F#の勉強を始めた感想

最近、数学が好きなわけですが関数型言語は数学に近いようなので、ずっと新しいプログラミング言語を覚えるのは新年の抱負とかいうやつで目標にしていたわけですし、
関数型言語を覚えよう!と思いまして、.NET系列ということで手の届きやすいF#の勉強を、ぼちぼちと始めました。

というわけでF#の記事をいくらか書くかもしれないので「F#」カテゴリを作成。


そういえば昔、当ブログも、Microsoft MVP for F#を受賞されていて恐らく日本のF#業界の第一人者であろう“いげ太”さんからコメントもらったことありましたね。
(記事「Twitter上の有名人に見られている…!?」を参照)

当時はF#なんて興味ありませんでしたが、あの時に色々聞いておけばよかったな~と思います。

SwiftとかはAppleがメインで推しているので情報も多いのかと思いますが、Microsoftがメインに位置づけているのはC#であって、F#って少しマイナーなので日本語の情報が少ないんですよね。

スペシャリストの“いげ太”さんなら何でも知っていたであろうと…。


さて、F#って今は開発環境がVisual Studioに標準でインストールされていたりして、わりと楽に始められます。

私はコンパイラでやってますが、F#の解説サイトはコンパイラが標準搭載される前から存在していたからか、一行ずつ実行する対話型のインタプリタを使っての解説となっているんですよ。

だから、文の終わりのセミコロンとか、コンパイラとは微妙に書き方が違う部分があるんじゃないかな。
だから、そういう些細な違いが私のような初学者にはキツいですよね~。


私がF#を勉強していて現状、一番わからないのは文法機能じゃなくて、
ここはセミコロン1つでいいのに、ここは2ついるとか、でもここで2つ書いたらエラーになるとか、セミコロン要らない場所もあるとか。
letで宣言したあとセミコロンを書かないといけなかったりinを書かないといけなかったりとか、

どう表現するべきかよくわかりませんけども、文の構成に苦戦していますね。



あと、今まで手続き型言語を使ってきましたので当然っちゃ当然ですが、関数型プログラミングの手法には慣れないですね。


まず第一に、関数が標準で値になっているということですか。
どのようにこれを活用していけるか、まだよくわかりませんが、使いこなせばすごく便利なのかもしれないですね。

+などの演算子も()でかこえば関数になって、つまりは値になるとういわけで、

let add = (+)

とか書けるわけです。
見た目シュールですが。


さらには、C#などでは私はなるべく再帰呼び出しを使わないようにしてきましたが、F#では再帰呼び出しバンザイなので、そのカルチャーショックにも対応しないと駄目ですよね。

ただ、F#も普通の再帰では普通にスタックメモリを食うので、やはりあまり使うべきじゃないのかなと私は思います。

末尾再帰として書くように心がける必要がありますね。
それは少し難しいことなので、スキルを身に付けないといけないんじゃないですかね。


ifとかもif文じゃなくてif式なんですよね。
ExcelのIF関数みたいなもので、条件がtrueになるかどうかに応じてtrueの場合の値とfalseの場合の値を返すんですよ。


あと、特に面白いと思ったのは、引数が複数ある関数を定義したときに、引数を普通に順序対(F#的な言い方をすればタプルになるのか)として渡すのかと思ったら、そうじゃないんですね。

まあ敢えてタプルを引数として取るように関数定義すればそうなるのでしょうが、

普通に定義したらカリー化というみたいで、例えば「a,bを引数にとってcを返す関数」だったら、
「aを引数にとって「bを引数にとってcを返す関数」を返す関数」として定義されるようです。

初見では「は?」となるかもしれませんが、じっくり考えてみてください。
そういうことです。

この「bを引数にとってcを返す関数」にbを与えたらcが返ってくるわけですね。
引数が3個とかもっとある場合も、同じようなことで関数の階層が深くなります。


これでどうなるのかというと、引数の複数ある関数がすべて1つの引数だけになるんですね。
まあ、それによってどのような恩恵が得られるのかは知りませんが…。


それと内部的には多分、関数の実行に必要な引数が全部揃うまで引数の保持だけしといて、引数が揃った階層の一番奥の関数を実行した時点で本当に関数が実行されるんでしょうね。

それまでの引数はいつ評価されるのか、つまり保持の時点で評価されるのか最後の実行時に評価されるのかは疑問でしたが、いま実験してみたところ保持の時点で評価されるっぽいです。


というわけで、現在は主に

F#入門
http://fsharpintro.net/

というサイトで勉強しているのですが、というかマトモに情報が載ってる日本語のサイトがここしかないのですが、とりあえずletの使い方とかif式、for、whileを見ました。

リスト等のデータ構造や、パターンマッチなんかはまだ全然見ていません。
これから勉強していこうと思います。



いやーしかし、数学をやってると初見で「は?」となるものに上手いこと対応する能力が身に付きますね。

今回のように、プログラミング言語の勉強で新しい概念が登場しても「あーこういうことね」と、わりとスムーズに理解することができますよ。

そこは数学やっていて本当にメリットだなと思います。


さて、今回はF#の勉強を始めて感じたことを書きとめてまいりましたが、久しぶりに記事として良質なものを作れたなと満足しています。

この頃はクソ記事ばっかりでしたからね~。

昔は当ブログも、我ながら良い記事多かったですけどね。
いや、昔は記事を書く数が多かったので玉石混交だっただけだろうか。

tag: プログラミング 数学 F# 関数型 MicrosoftMVP 勉強 再帰 カリー化

コメント

ふぁいと!

お久しぶりです。aridaiです。

私もF#のコードをちらっと見てみたのですが、
C#と全然違いますね。

定期的にサイバー少年さんのブログ記事を拝見させてもらうんですけど、
数学系の記事が増えてきてからは私はチンプンカンプンですねw

でも、私と同じ学科に(詳しくは忘れましたが)関数型言語を勉強している人がいて
その人が言っていたのですが、「評価方法が独特なようで...」などと言っていた気がしました。

私は数学がそこまで好きなわけではないので分からないですが、
そういうのがそのような分野に便利なんでしょうね。奥が深そうだなぁ。
でも、普段数学をそこまで使ったりしない私には難しいなぁw

> いやーしかし、数学をやってると初見で「は?」となるものに上手いこと対応する能力が身に付きますね。
そういうもんなんですかね。私もそういった能力が欲しいなぁ... (願望)


ところで、話は変わるのですが、
少し前から、私のFC2のブログは使っていません。
何を思ったのか、今、現在進行系で自分のホームページを作っている最中です。
リンク一覧にある私の旧ブログのリンクを削除してもらえたらうれしいです。

  • 2016/11/22(火) 17:48:35 |
  • URL |
  • aridai #-
  • [ 編集 ]

Re: ふぁいと!

お久しぶりですね。
しばらくブログ更新されてなかったので、どうしたのかなと思っていましたが、ふとaridaiさんのTwitterを発見しまして見てみたら、こっちこそ凄いなあと思いました。

DirectXプログラミングとか、Unityとか(Xamarinも?)やってるんですね。
なにより、知識の吸収力、やることのスピードがaridaiさんは優れていると思います。
知り合った当初はaridaiさんもビギナーで知識もあんまりないなと(なんとも失礼ですが)思って安心していたのですが、気づいたらめちゃめちゃ成長されていましたので、私なんてもう後ろのほうに置いていかれてしまいましたね。

私はたしかに数学やるというのは多少ハードル高いことかもしれないけれど、スピードが全然ですよ。
勉強は好きですが、長時間続けるのはおっくうでして…。
そんなことで、のらりくらりとやってるから、置いていかれてしまうんですね。
aridaiさんのモチベーションが欲しいなあ、昔は私も積極的に色々やってたんですけどね~。


ホームページ作ってるんですね。今度リンク削除しておきます。
完成したらリンクするのでご報告ください。

ところで、以前aridaiさんのTwitterを発見したとき「すごいですね」というだけのどうでもいい内容ですがメールをお送りしようと思ったら、メルアドなくなってましたね。
新しいメルアドがあればお教えいただけませんか?

以前、僕は特に有名でもすごくもないと言ったのにまた…そういう持ち上げ方してくる人は僕はあまり好かないですね。僕もあなたも F# に興味がある1人として同じでしょう?

スルーしようと思いましたが、aridai さんの行動力を無下にするのも違う気がしたので、ひとまず来ました。

で。F# に限らず、聞きたいことがあるなら、答えてくれそうな人が集まってる場所に自分から行くべきでしょう。ここで待っててもしょうがないし。

Twitter も1つですが、今なら gitter がいいんじゃないですかね、気軽で。

gitter.im/fsugjp/public

  • 2016/11/27(日) 15:20:30 |
  • URL |
  • いげ太 #-
  • [ 編集 ]

Re: いげ太

お久しぶりです。
いげ太さんは、(すごい賞ではないと以前ご指摘だったものの)Microsoft MVP F#であることや、F#の書籍などを執筆されていることなどから私はいげ太さんはF#のスペシャリストだと思っていたので、このように書かせていただきました。

そういう褒められかたをされるのが不快でしたら申し訳ありませんでした。
いげ太さんが以前、自分はすごい人ではないとおっしゃっていたのは、よくあるただの謙遜であろうと思っていましたので、不快に思っていることは以前のコメントから読み取れませんでした。


> で。F# に限らず、聞きたいことがあるなら、答えてくれそうな人が集まってる場所に自分から行くべきでしょう。ここで待っててもしょうがないし。

そのとおりですね。
教えていただいたサイトも参考に、自発的な行動を心がけるようにいたします。
この度はコメントありがとうございました。

個人的な快・不快というか、その、あまり上下関係みたいなものを持ち込まない方がいいんじゃないかなという、僕のポリシーです。

コミュニティのメンバーは対等な立場で切磋琢磨していくのが望ましい関係性でしょう。教わるときの謙虚さを否定するわけじゃなくて、無用な持ち上げは不要でしょう、と。

それとして。漠然と色々聞きたいじゃなくて、なにか明確な疑問があるなら、このブログに書いても全然僕はたまにですが見に来るので、気が向けばコメントもしますよ。

でも、twitter や gitter の方がよりアクティブに回答を得られると思いますよ。

  • 2016/11/29(火) 23:10:43 |
  • URL |
  • いげ太 #-
  • [ 編集 ]

Re: いげ太

なるほど。
まあ、そこまで持ち上げるような表現に意味があるわけではないので、あんまり気にしないでいただきたいです。

気が向けば教えてくださるということでありがとうございます。
ブログを通じて意思疎通を図るというのもなんなので、よろしければ質問するためのメールアドレス伺ってもよろしいですか?
メールあまり使わないとか、教えるのは自分のタイミングでやりたいということでしたらブログ上で構いません。

なんかこの記事のコメント欄、メルアドばっかり聞いてる…。

僕は君の専属教師になるつもりはありません。ブログでも Twitter でもオープンな場でどうぞ。gitter には僕はいないけど、他たくさんの人が集ってるからおすすめ。

  • 2016/12/01(木) 02:23:36 |
  • URL |
  • いげ太 #-
  • [ 編集 ]

コメントの投稿

トラックバック

トラックバック URL
http://cyberboy6.blog.fc2.com/tb.php/478-7768a1dc
この記事にトラックバックする(FC2ブログユーザー)

当ブログをご利用(閲覧等)になる場合は必ず「当ブログの利用規定」をお守りください。