ニコニコ大百科モバイル

7/2(月)よりスマホまたはPCでアクセスした場合、各デバイス向けのサイトへ自動で転送致します


F#


ヨミ: エフシャープ
掲示板をミル!
6カキコ!

概要


F#(エフシャープ)とは関数型プログラミングの一種である。マイクロソフトリサーチマイクロソフト社の研究機関で生まれ、.NET仲間入りした。 ML、OCaml といった関数型言語の流れをむ静的型付けコンパイラの言であり、関数型言語ではあるがオブジェクト指向としての特徴を合わせ持つ。

コード記法が2種類用意されており、デフォルトでは軽量構文HaskellPython のようにインデントの深さでスコープを表現し、冗語構文よりも必要な予約の数を少なくできる。lightweight syntax)だが OCaml 冗語構文(verbose syntax)を選択することもできる。関数型言語とはいえ .NET Framework に対応したオブジェクト指向でもあるので、C# などのようにクラスを用いたコード記述表現を模したプログラミングも可である(もちろん GUI を用いることも可)。

F# ではコンパイラ型推論により、変数関数の定義においてが文脈から自動的に決まるのであれば宣言を省略できる。型推論に頼らず明示的に定することもできる。変数は基本的に不変(immutable)であるが、書き換え可(mutable)な変数として定義することもできる。

F# は正格評価を行う言であるが、シーケンス(F# におけるリストの類似機正格評価が基本の F# では Haskell などと違いサイズが巨大でメモリ上に展開できないリストは作れない。このような場合は F# では「シーケンス(Sequence)」を用いる。限長リストのような遅延評価が必要な場合リストの代替品としてシーケンスを利用することになる。)など一部の式評価においては遅延評価が行われる。明示的に定すれば任意の式を遅延評価の対とすることができる。

また、スレッド間の排他制御などマルチスレッド処理特有の問題への対策をカプセル化し、並列処理のコード記述をシンプル可読性の高いものにするために、他の.NETにない独特の構文表記方法とライブラリが用意されている。

F# は .NET Framework 上で動作する言として作られているため他の .NETと混在させたソフトウェア開発が可である。例えばC#で作られたライブラリをF#から利用したり、またその逆にも対応できるといったように.NET間の相互運用性が確保されている。

加えて、F#には、あたかもインタプリタのようにコマンドラインしたコードを即実行できる環境「F# Interactive」が用意されている(コードはまずコンパイルされてから実行される)。この機によりF#をスクリプト言語として活用することもできる。

Windows 向けの統合開発環境 VisualStudio シリーズの「VisualStudio 2010」以降、F# によるプログラミング環境が標準で搭載されているただし、「VisualStudio 2013」の時点では、Windowsフォームデザイナがない・リソース編集ツールがない等、他の.NETほどには開発支援がまだ整っていない。それらを利用する場合はC#など他の言プロジェクトを混在させて間接的に利用する形をとることになるだろう。


コード例


// 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 // 末尾再帰F# では関数の末尾再帰最適化が行われ、関数呼び出し時のスタック消費も抑えられる。を使って階乗 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倍して、全て足し合わせる }

関連動画


F#に関連する動画をご紹介ください。


関連商品


■az4873114667
■az4774145165
■az1933988924
■az0735670269
■az1449320295
■az1430246502
■az1617291323
■azB00GBK7QVE


関連項目



最終更新日: 15/03/13 23:30
タグ検索 パソコン版を見る


[0]TOP
ニコニコ動画モバイル
運営元:ドワンゴ