F#(エフシャープ)とは関数型プログラミング言語の一種である。マイクロソフトリサーチ[1]で生まれ、.NET 言語に仲間入りした。 ML、OCaml といった関数型言語の流れを汲む静的型付けコンパイラ型の言語であり、関数型言語ではあるがオブジェクト指向型言語としての特徴を合わせ持つ。
コード記法が2種類用意されており、デフォルトでは軽量構文[2](lightweight syntax)だが OCaml 風の冗語構文(verbose syntax)を選択することもできる。関数型言語とはいえ .NET Framework に対応したオブジェクト指向型言語でもあるので、C# などのようにクラスを用いたコード記述表現を模したプログラミングも可能である(もちろん GUI を用いることも可能)。
F# ではコンパイラの型推論機能により、変数・関数の定義において型が文脈から自動的に決まるのであれば型宣言を省略できる。型推論に頼らず明示的に型を指定することもできる。変数は基本的に不変(immutable)であるが、書き換え可能(mutable)な変数として定義することもできる。
F# は正格評価を行う言語であるが、シーケンス(F# におけるリストの類似機能[3])など一部の式評価においては遅延評価が行われる。明示的に指定すれば任意の式を遅延評価の対象とすることができる。
また、スレッド間の排他制御などマルチスレッド処理特有の問題への対策をカプセル化し、並列処理のコード記述をシンプルで可読性の高いものにするために、他の.NET言語にない独特の構文表記方法とライブラリが用意されている。
F# は .NET Framework 上で動作する言語として作られているため他の .NET 言語と混在させたソフトウェア開発が可能である。例えばC#で作られたライブラリをF#から利用したり、またその逆にも対応できるといったように.NET言語間の相互運用性が確保されている。
加えて、F#には、あたかもインタプリタ型言語のようにコマンドライン入力したコードを即実行できる環境「F# Interactive」が用意されている(コードはまずコンパイルされてから実行される)。この機能によりF#をスクリプト言語として活用することもできる。
Windows 向けの統合開発環境 VisualStudio シリーズの「VisualStudio 2010」以降、F# によるプログラミング環境が標準で搭載されている[4]。
// Hello, World! の例 ←先頭の「//」記号はこの行がコメントであることを表す
[<EntryPoint; System.STAThread>]
do
printfn "Hello, World!"
// .NET Framework のクラスライブラリを直接利用した Hello, World! の例
[<EntryPoint; System.STAThread>]
do
System.Console.WriteLine("Hello, World!")
// a 、b 共にstring 型の値として定義される
let a = "Hello" // 型推論により a は string 型に自動的に決まる
let b : string = "Hello" // 識別子の後ろに型名を書いて指定することも可
// 引数 x と y を足した値を返す関数 add (各引数の間はコンマではなくスペースで区切る)
let add x y = x + y
// 関数 add に引数を適用した例(評価結果は3となる) add 1 2
// 明示的に型指定を行う場合(int型のxとyを足して、返り値もint型を返す関数として指定)
let add2 (x : int) (y : int) : int = x + y
// 引数 x 、 y、 z を全て足した値を返す関数
// 「fun」の後ろに仮引数を並べ、「->」記号の後ろに式を書く)
fun x y z -> x + y + z
// 上記の式に引数を適用した例(評価結果は6となる)
(fun x y z -> x + y + z) 1 2 3
// 関数定義その1
// 再帰呼び出しを使って階乗 n ! を計算 // 再帰呼び出しする関数には let の後に rec を必ず付ける let rec fact1 n = match n with // パターンマッチ構文 | 1 -> 1 // n が1なら1を返す | _ -> n * fact1 (n - 1) // n が1以外なら再帰呼び出し
// 関数定義その2 // 末尾再帰[5]を使って階乗 n ! を計算 let fact2 n = let rec fact2sub n acc = match n with | 1 -> acc // n が1になったら計算結果を返す | _ -> fact2sub (n - 1) (acc * n) // 再帰呼び出し(末尾再帰) let result = fact2sub n 1 result // 返り値
// 関数定義その3 // 手続き型プログラミング風に階乗 n ! を計算 let fact3 n =
let mutable result = 1 // mutable 指定により値書き換えを許可する
for i in 1..n do // for ループ、i は1から n まで変化
result <- result * i // mutable で定義された値を書き変えるには「<-」記号を使う
result // 返り値
// 関数定義その4 // 1から n までのリストと畳み込み関数 fold を使って階乗 n ! を計算 let fact4 n = List.fold (fun acc x -> acc * x) 1 [ 1..n ]
// まず、C#のコード例
var v = System.Linq.Enumerable.Range(1, 100) // 1から100までの整数の集合から .Where(x => (x % 3) == 0) // 3で割り切れる要素を選び出し .Select(x => x * 2) // 各要素を2倍して .Sum(); // 全て足し合わせる
// C#でLINQを使った場合 var v = (from x in System.Linq.Enumerable.Range(1, 100) // 1から100までの整数の集合から where (x % 3) == 0 // 3で割り切れる要素を選び出し select x * 2 // 各要素を2倍して ).Sum(); // 全て足し合わせる // F#で上記と同様の処理を行うコードの例
// F#でパイプライン演算子「|>」を使った場合 let v = seq{1..100} // 1から100までの整数の集合から |> Seq.where (fun x -> (x % 3) = 0) // 3で割り切れる要素を選び出し |> Seq.map (fun x -> x * 2) // 各要素を2倍して |> Seq.sum // 全て足し合わせる
// F#でクエリー式を使った場合 let v = query { for x in 1..100 do // 1から100までの整数の集合から where (x % 3 = 0) // 3で割り切れる要素を選び出し sumBy (x * 2) // 各要素を2倍して、全て足し合わせる }
掲示板
6 ななしのよっしん
2015/11/29(日) 17:43:53 ID: NnPqzBDBtE
C#から移行してみたけどスムーズに書けるから今ではお気に入り
判別共用体、パターンマッチング、パイプライン演算子が最高すぎる
ただ、巷のライブラリのほとんどがC#/VB.NET前提で作られているからF#からだと使いにくいことが多いのが欠点
Reactive Extensions(F# で使いやすくするライブラリがあるけどPCLに対応してない)使ってるけど、仕方ないので自分で関数を作っている
7 ななしのよっしん
2020/09/09(水) 09:54:15 ID: hkkp/ikg9+
8 ななしのよっしん
2020/09/09(水) 12:06:48 ID: hkkp/ikg9+
あ、Inriaが開発に関わってるらしいからF#とCoqの隠し子って感じか
急上昇ワード改
最終更新:2024/12/26(木) 00:00
最終更新:2024/12/25(水) 23:00
ウォッチリストに追加しました!
すでにウォッチリストに
入っています。
追加に失敗しました。
ほめた!
ほめるを取消しました。
ほめるに失敗しました。
ほめるの取消しに失敗しました。