前書き
まずはじめに、自分のF#歴が短いことと、特にF#関係のコミュニティーに属さず、また自分が勤めている会社にもF#使いがいないため、半ば独自解釈の部分が多いと思います。
「これってそうじゃなくて、こういうことなんだよ」という指摘がたくさん出てくるかもしれませんが、技術に関する指摘は大歓迎ですので、これを機会に勉強させてください。
経緯
2015年ごろから関数型言語に興味を持ち始め、はじめにラムダ計算を勉強しつつ、2016年あたりから本格的にF#を使い始める。
自分が勤めている会社内でもF#の良さをアピールしつつ布教活動を続けているが、自分以外で使っている人は今の所1人しか居ない(しかもこの子は派遣さん)。
布教活動の中でいくつかのフィードバックをもらい、ザックリまとめると、こんな感じ。
- C#に比べて利点がよく分からない
- それLINQでもできるよね?
- ラムダ式使われると可読性が落ちる(ちょっと言いがかり的?F#関係ないじゃん)
- 関数型ってほら、LispとかMathematicaとか? (向こうもよくわかっていない感満載)
なぜF#か?
多分、自分がずっとWindows PC向けアプリケーション開発に携わり、そのほとんどが.NET Framework上のアプリケーションだったので、必然的にF#という選択をしたと思う。HaskellとかScalaとかにも興味あるんだけど。
あと、.NET Frameworkのライブラリとかも使用できるから、ちょっとした自分ツールや自分ライブラリを作るときにF#は便利だったりする。(作ったライブラリはC#側から呼べるし)
F#を始めるために
開発環境の構築
詳しくはF# Software Foundation(http://fsharp.org) のサイトに書かれているが、英語なのでザックリいうと、
- 選択肢1:
- Visual Studioをインストールする
- 選択肢2:
- Visual Studio Codeをインストールし、機能拡張「Ionide-fsharp」をインストールする
お金をかけないで揃えるなら、手間がちょっとかかるけど選択肢2が良い。ただ、幸いにもC#の開発環境を整えている方なら、すでにF#を試す環境は整っていると思って良い。
さあ、始めよう
最初に覚えて欲しいこと
それはコメントの書き方です。
いきなりコメントの書き方について項を持ってくるのは珍しいと思われるが、まず最初にコメントを書いてからプログラムコードを書いて欲しいという想いもあり、1番最初に持って来てみる。
他のプログラミング言語と同様に1行コメントと複数行コメントの両方を使える。
// 行コメント
(*
複数行コメント
*)
変数や関数の宣言
F#は関数型言語と呼ばれる言語であるため、変数と関数は同等に扱う。その証拠となるのが宣言の仕方で、 変数の宣言方法と関数の宣言方法はほとんど変わらない。
// 変数の宣言
let n = 5
// 関数の宣言
let f x = x * 2
この時n
はint型の変数で値が5
になる。f
は引数x
を受け取り2倍して返す関数になる。
尚、同様の表現をC#で行なった場合は次のようになる。
// 変数の宣言
int n = 5;
// 関数の宣言(あえてF#と同等の書き方にした)
int f(int x){ return x * 2; }
プログラム実行方法
F#はスクリプト言語のような環境が用意されており、好きな行のみを実行することができる。そのような制約があるため、F#では未定義な変数(シンボル)は参照前に記述する必要がある。
// 関数の宣言
let f x = x * 2
// 関数の実行例
f 5 // 10が返される
g 10 // エラー!
// 後から宣言しても上記gは実行できない。
let g x = x * 5
では実行方法について見て行きます。やり方は次の通り
- 実行したいコードをマウス選択する
- Alt+Enterを押す(Visual Studio/Code両方これでいけた気がする)
- F# Interectiveウインドウが表示され、実行結果が出る。
実行結果の最後の行にあるval it : int = 10
が最後に実行した式の結果が格納される。
val it
とは実行環境が最後に実行した式の結果を格納するためのシンボル名で 予約語の一部となっている。もちろん、最後に実行した式の戻り値が関数の場合も 同様にit
が関数になる。
終わりに
サマリー
今回の流れをまとめると次の通り。
- F#も他の言語と同様に行コメントと複数行コメントがある。コメントの書き方はもう分かりましたね?
- F#における変数と関数の宣言について、同じようなフォームになっており、関数も変数と 同等の扱いをすることが伺える(と自分は感じました)。
- F#のコードを実行する方法について記載した。コンパイルした 実行可能形式については後日記載します。
次回以降の流れ
- 静的型付言語なんだけど型推論のおかげで色々楽にコーディングできることを何となく説明したい
- C#との大きな違いは部分適用と合成だよなーってことを説明したい
- 副作用の有無を意識するだけでも他言語に応用できることを説明したい
- 難しいことは抜きにして、モナドについて説明したい