F#単語

26件
エフシャープ
3.4千文字の記事
  • 1
  • 0pt
掲示板へ

概要

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倍して、全て足し合わせる }

関連動画

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

関連商品

関連項目

脚注

  1. *マイクロソフト社の研究機関
  2. *HaskellPython のようにインデントの深さでスコープを表現し、冗語構文よりも必要な予約の数を少なくできる。
  3. *正格評価が基本の F# では Haskell などと違いサイズが巨大でメモリ上に展開できないリストは作れない。このような場合は F# では「シーケンス(Sequence)」を用いる。無限リストのような遅延評価が必要な場合リスト代替品としてシーケンスを利用することになる。
  4. *ただし、「VisualStudio 2013」の時点では、Windowsフォームデザイナがない・リソース編集ツールがない等、他の.NETほどには開発支援がまだ整っていない。それらを利用する場合はC#など他の言プロジェクトを混在させて間接的に利用する形をとることになるだろう。
  5. *F# では関数の末尾再帰最適化が行われ、関数呼び出し時のスタック消費も抑えられる。

【スポンサーリンク】

  • 1
  • 0pt
記事編集 編集履歴を閲覧

ニコニ広告で宣伝された記事

ニコニ広告 (単) 記事と一緒に動画もおすすめ!
提供: Fio
もっと見る

この記事の掲示板に最近描かれたお絵カキコ

お絵カキコがありません

この記事の掲示板に最近投稿されたピコカキコ

F#

F#

1 ななしのよっしん
2013/10/11(金) 05:47:00 ID: kFR+J9LoNm
あれ、記事あったっけ・・・と思ったら結構新しい
編集
👍
高評価
0
👎
低評価
0
2 ななしのよっしん
2014/03/29(土) 01:05:24 ID: thojbvy1l0
パイライン演算子が最高すぎる。
計算をする→その結果を次の関数に渡す→その結果を(ryとかしたい時、そのままの順番で書けるというのはうれしい。
(例)
[1 .. 5]          // 1から5までの整数リスト
|> List.map ((*) 2)    // それぞれ2倍して
|> List.filter ((<) 5)   // 5より大きいものを選んで
|> List.sum        // 足し合わせる

あとは最初から対話環境F# Interactive)がついてくるのも、C#VBに対してのアドバンテージだと思う。
👍
高評価
0
👎
低評価
0
3 ななしのよっしん
2014/07/02(水) 20:18:19 ID: tv8MKwIDbg
F#

タイトル:F#

twitterで紹介する

4 ななしのよっしん
2015/02/05(木) 20:31:45 ID: wbtt9+lGO5
👍
高評価
0
👎
低評価
0
5 ななしのよっしん
2015/07/05(日) 21:24:34 ID: ySC7gqmgG7
👍
高評価
0
👎
低評価
0
6 ななしのよっしん
2015/11/29(日) 17:43:53 ID: NnPqzBDBtE
C#から移行してみたけどスムーズに書けるから今ではお気に入り
判別共用体、パターンマッチング、パイライン演算子が最高すぎる

ただ、巷のライブラリのほとんどがC#/VB.NET前提で作られているからF#からだと使いにくいことが多いのが欠点
Reactive Extensions(F# で使いやすくするライブラリがあるけどPCLに対応してない)使ってるけど、仕方ないので自分で関数を作っている
👍
高評価
0
👎
低評価
0
7 ななしのよっしん
2020/09/09(水) 09:54:15 ID: hkkp/ikg9+
F*なる依存システム兄弟が居るらしい
👍
高評価
0
👎
低評価
0
8 ななしのよっしん
2020/09/09(水) 12:06:48 ID: hkkp/ikg9+
あ、Inria開発に関わってるらしいからF#Coqの隠し子って感じか
👍
高評価
0
👎
低評価
0