はじめに
関数型言語を使ったことがありますか?JavaやPHP、C#など長らくオブジェクト指向を中心とする言語の時代が続いており、関数型言語はあまりメジャーになってはいません。しかし、その有用性は認められつつあり、Swiftをはじめとするモダンな言語では、関数型の機能が取り入れられています。
関数型言語が普及しない原因のひとつには、オブジェクト指向からの考え方の転換が難しいことが挙げられます。その点、「F#」はオブジェクト指向と関数型とのハイブリットともいえる言語で、両方の側面を持っています。.NETとの親和性も高く、特にC#からの移行に最適です。
この記事では、関数型言語に興味がある.NETエンジニアの方のために、F#の概要と部分適用について解説していきます。ぜひご一読して、関数型言語の世界を体験してみてください。
F#はどんな言語なのか?
F# 公式サイト:http://fsharp.org/
GitHubリポジトリ:https://github.com/fsharp/fsharp
F#とは
F#は、マイクロソフトが開発しているオープンソースの関数型言語です。同じく関数型言語のOCamlがベースになっており、構文が非常によく似ています。また、標準ライブラリも互換性があります。関数型言語とはいっても、オブジェクト指向もサポートしていて、両方のパラダイムを使うことが可能です。C#やVB.NETなど他の.NET言語と相互にアクセス可能なので、必要な部分のみライブラリとしてF#で記述する、といったこともできます。
F#をブラウザで手軽に試そう
Try F#:http://www.tryfsharp.org/Create
とりあえず手軽に試してみたい方が多いと思いますので、ここではブラウザで試す方法を紹介します。「Try F#」では、ブラウザからF#コードを実行することができ、入力補完やファイルの作成などの機能もあります。なお、動作にはSilverlightが必要です。他の選択肢としては、Visual Studioなどのツールがあります。下記のページを参照して、お好きな方法を選んでください。
Use F#:http://fsharp.org/use/windows/
関数型言語で重要な部分適用
基本的な関数宣言
まずは、F#での基本的な関数宣言について説明しておきます。次の例を見てください。
let add x y = x + y
xとyを受け取って、足した値を返すだけの簡単なadd関数です。返り値は、最後に評価された値が自動的に返ります(ここではx + y)。引数の型は型推論によって、静的に型付けされています。次のように明示的に型を指定することも可能です。
let add (x: int) (y: int) = x + y
この関数を使うには次のようにします
let result = add 1 2
これで関数が呼びだされ、変数resultには3が束縛されます。束縛とは、つまり代入のことです。デフォルトでは変更不可なため、変更可能な変数を宣言するには「let mutable」を使う必要があります。
関数の部分適用
実は、上記のように宣言された関数は「カリー化」されています。カリー化は、言葉で説明してもよくわからないと思いますので、実例をみていきましょう。まずは、先ほどの関数のシグネチャ(定義)を次に示します。
x: int -> y: int -> int
このシグネチャがなにを示しているかというと、はじめに引数xを受け取って「引数yを受け取って返り値(int)を返す関数」を返すということです。つまり、引数をひとつだけ適用すると関数が返ってきます。実際にやってみましょう。
let add1 = add 1
新しい関数が変数add1に束縛されました。これが「引数の部分適用」というものです。シグネチャがどうなっているか見てみましょう。
y: int -> int
引数xが消えて、引数yだけを受け取る関数になりましたね。先ほど引数xとして渡した1が部分適用されています。それでは、確かめてみましょう。
add1 2 // 3を返す add1 3 // 4を返す add1 4 // 5を返す
うまくいっていますね。このように、F#では引数の部分適用を活用したプログラミングができます。
カリー化しない関数
一方、従来通りのカリー化しない関数を作ることもできます。たとえば、次のようにします。
let add (x: int, y: int) = x + y
なんだか馴染みのある形式になりましたね。この関数のシグネチャは次のようになっています。
x: int * y: int -> int
なにやら引数の間に「*」が入っていますね。これはタプルを表します。タプルとは、複数の値の組み合わせです。呼び出す際には次のようにします。
add (1, 2) // 3を返す
add関数の引数として渡している「(1 ,2)」はタプルのリテラルです。1と2は別々の値ではなく、ひとつのタプル(組)なのです。そのため、タプルを引数にする関数は部分適用できません。
純粋なF#として関数を作る際には、カリー化関数を使うことになるでしょう。しかし、C#やクラスライブラリで定義されている関数(メソッド)は非カリー化関数なので、タプルを使う必要があります。両方の形式を適切に使い分けられるようにしておきましょう。
まとめ
F#は非常に興味深い言語です。C言語などの手続き型からオブジェクト指向にパラダイムが移行したように、いつか関数型言語の時代が来るのかもしれません。特に、関数型言語は並列処理に有効です。マルチスレッドプログラミングや非同期プログラミングではとても役立つことでしょう。また、F#はスクリプト言語としての側面も持っているため、ちょっとした処理をするのにも便利です。あなたなりの使い道を見つけてみましょう。あなたはどんなことにF#を使ってみたいと思いますか?
本ブログは、Git / Subversionのクラウド型ホスティングサービス「tracpath(トラックパス)」を提供している株式会社オープングルーヴが運営しています。
エンタープライズ向け Git / Subversion 導入や DevOps による開発の効率化を検討している法人様必見!
「tracpath(トラックパス)」は、企業内の情報システム部門や、ソフトウェア開発・アプリケーション開発チームに対して、開発の効率化を支援し、品質向上を実現します。
さらに、システム運用の効率化・自動化支援サービスも提供しています。
”つくる情熱を支えるサービス”を提供し、まるで専属のインフラエンジニアのように、あなたのチームを支えていきます。
No Comments