こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

F#って何??

F#って何??

最初はC言語から初めて,その次にC++を触りだして,GUIが必要になったのでC#で触り始めて
「.NetFrameworkってなんだか凄いんじゃね?」と思い始めたくらいの初心者プログラマからの質問です.

VS2010から使えるようになったF#って一体どんな言語ですか?
調べてると,「C#の処理の一部を任せるのに向いている」だとか,「メニーコアでのプログラミングに向いている」だとか,色々言われているみたいなんですが,
いったい,何が出来て,何をするのに向いている言語なのでしょうか??

どなたか易しめに教えていただけないでしょうか?
あと,関数型言語とCとかの言語の違いについても簡単に説明していただけると嬉しいです.

投稿日時 - 2010-10-29 22:06:18

QNo.6283983

すぐに回答ほしいです

質問者が選んだベストアンサー

Cross999さん向けの答え方をします。
.NetFramework、そしてその申し子言語であるC#は、プログラミング言語の中では結構後発なので、先輩言語、先輩基盤の成功や失敗を鑑みて設計されており、いろいろな部分で洗練されています。
F#は、C#よりさらに後発の.NetFramework上で動作する言語で、色々な指向を持たせた言語です。
C++のようなオブジェクト指向はもちろん、関数型言語の特徴も持っていて、文法定義もでき、非同期処理に強く、型もいちいち指定しなくても推測してくれるという、素晴らしい言語です。
コード量が少なく、簡潔で、しかもバグが出にくいです。

何ができて……という問いには、何でもできると答えておきます。ただ、.NetFramework主体の言語なので、C++のようなネイティブ処理ではなく、マネージコード(.NetFramework)前提で設計されていると思います。なので、範囲としては、C#と同じような範囲であって、ネイティブならば、C++や、C++/CLIとかがよいと思います。
何をするのに向いている……という問いならば、マルチ指向に設計されているのですから、用途は広いと思います。特に、非同期処理が得意なわけですから、Silverlight、WPF、WindowsForm などのGUIの処理にも向いています。

F# の F は、FunctionalのFで、他からの移植でなくて.NetFrameworkから生まれた言語の中では、初めて関数型言語の性質を持つという特徴を持っています。ただ、関数型だけではなくマルチ指向なので、ご注意ください。

さて、関数型言語について少しだけ書きます。これは、F#ではなく関数型についての特徴です。
CやC++が手続き型言語と言われて、手続きを示すのに対し、宣言型言語とも言われます。
つまり、手続き型言語のように「あれしてからこれをしてそれを返す」といった感じではなく、「○○という処理は、こういうものを返す」という約束を書くようなものです。
SQLは関数型ではありませんが、宣言型言語ではあります。あれしてこれしてという処理ではなくて、Select文やUpdate文で、「これこれこういうものをこうする」と一文で書きますね。
関数型言語は、なるべく状態を持たせない、なるべく変数を使わないものです。手続き型から移行するためには、一度頭を切り替えないとダメなので、一言ではなかなか説明は難しいため、関数型ではないSQLを引き合いに出してしまいましたが、そういう宣言が集まって定義されているものです。
関数を引数として受け取ったり、戻り値が関数だったりするのは、関数型では普通です。逆に、CやC++の戻り値voidに当たる処理はありません。すべての関数は、何らかの戻り値を必ず返します。
そして、数学のように=で結ばれた右辺と左辺は等しいです。Cのように、a = a + 1 みたいなのは、関数型にはありません。F#でいえば、aはあらかじめ変化できる特別なもの(変数)と定義しておいて(通常は一度決めたら変化させないので)、a <- a + 1 と書きます。イコールではないですね。

CodeZineには、いくつか割と解りやすい入門記事が載っています。参考URLに載せておきます。
また、MSDN Magazineにも解りやすい記事があるので、以下に載せておきます。
http://msdn.microsoft.com/ja-jp/magazine/ff714588.aspx

参考URL:http://codezine.jp/article/detail/4254

投稿日時 - 2010-11-06 02:08:20

お礼

Ogachaさん,回答ありがとうございます.
私はプログラムが強い人間では無いので,Ogachaさんが易しめに書いてくれたので助かりました.

>何ができて……という問いには、何でもできると答えておきます。
「何ができるのか?」という質問は愚問でした.
たしかに,プログラミングって,やろうと思えば,何でもできますよね,書き方が違うだけで.

>何をするのに向いている……という問いならば・・・
最近は,C#4.0で導入されたTPL等の勉強をしていますので,非同期処理は,大変興味があります.

>さて、関数型言語について少しだけ・・・・
な,なんとなくは,分かりました.


結局は,自分で触ってみないと分からないものですが,触ってみる気になりました.
ありがとうございました.

投稿日時 - 2010-11-15 22:14:24

ANo.4

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

使ったことがないので、「F#って一体どんな言語ですか?」という問いには申し訳ありませんが正面から答えることができません。
しかし、ANo.1の人は何か他のものと勘違いしていないでしょうか。
・F#はFortranには全く似ていません。言語系統的にはML→Caml→OCamlの流れをくんでいます。
・関数型言語というのは、コンピュータ科学的にはλ計算の概念を基礎とし、関数をファーストクラスのオブジェクトとして扱える言語というのが広い意味での定義です。値を返さないプロシージャ(手続き)に対して値を返すものを関数と呼んだのとは意味合いが異なります。

C言語プログラマーには馴染みのない型推論とか遅延評価とかの興味深い機能がありますが、それらが実用上どれくらい役に立つかは何とも言えません。

投稿日時 - 2010-11-03 22:12:48

お礼

回答ありがとうございます.

>C言語プログラマーには馴染みのない型推論とか遅延評価とかの興味深い機能がありますが、
>それらが実用上どれくらい役に立つかは何とも言えません。

そうですよね.触ってみるまで,本当に自分の役に立つのかは分かりませんよね.
とりあえず,興味は持てたので,触ってみようと思います.

投稿日時 - 2010-11-15 22:20:49

ANo.2

いやいやいや・・・関数型言語が「昔話」なんてのは・・・・
F#ってのはMSが最近出した「関数型言語」であって
なんで「昔話」の種類の言語が出てくるのでしょうかね.

それとFortranがF#のもとだというソースがどこなのかも知りたいです.
F#はOCamelがベースになっているってのはMSのサイトにもあるんですが.

実際の関数型言語は実はぜんぜん過去のものではないわけで
LispやHaskellも盛んだし,
関数型言語をいじると「再帰」が身につくほか
かなりスマートなコードが書けるようになります.

F#に限らず,関数型言語の特徴は
なんといっても「副作用」の取り扱いと
「関数そのものをデータとして扱う」という考え方で
関数に関数を与えちゃうんです.
「副作用」の代表格は「IO」ですけど,面倒なので割愛.
ほかにも
F#は「型推論」とか「静的で強い型付け」なんていう特徴もあるようで
正統的な関数型言語みたいですね.
#ほかにも「代入が存在しない」なんていう特徴もあることもがある

関数を値として扱うなんてのは,Cなんかだと「関数ポインタ」,
Perlなんかだと「無名関数」なんてので実現するけど
関数型言語は関数そのものをそのまま代入できるわけ

たとえば
f(x)=x+1と定義して
map(f, [1,2,3,4])
なんてすると
[2,3,4,5]というリストが戻ってくるなんてことができる
第一引数が「関数」にできたりする.
foldというタイプの関数が定義しやすいのも特徴かな

どうしてこういう言語を考えるのかという問題は
「副作用」の影響が大きいのかな
関数型言語ってのは
「同じものを与えれば同じものがもどってくる」
(大雑把に言えば「副作用がない」ってこと)
ってのがベースにあって,こういう風になっていると
違う環境で計算しても同じものが戻ってくるわけで
そうであれば「後で合体させる」ときに便利なのは分かるでしょう?

あとは関数を連結しやすいのです.いわゆるパイプです.

投稿日時 - 2010-11-03 21:53:31

お礼

回答ありがとうございます.

分からない言葉もありましたが,非常に参考になりました.(特に,「たとえば」以降)

ありがとうございました!!

投稿日時 - 2010-11-15 22:18:23

ANo.1

 F#というのは1960~1970年代に科学技術計算に多用された(もちろん今でもよく使われている)Fortranなる言語に似せて作られたプログラミング言語の名前で、それで作られたプログラムはMicrosoft .Net Framework上で実行する事ができる。

 ところで、Microsoft .Net Frameworkというものは、C#、VB.NET、F#で書くプログラム中から同じライブラリーを呼び出す事もできるし、C#で書いてコンパイルしたライブラリーをVB.NETから呼び出す事もできる。今ではほとんどやらないが.Net Frameworkのバージョンが若い頃はライブラリーロジックはC#で、それを呼び出して操作する画面はVB.NETで、なんて事もやられていた。
 F#がメニーコアでのプログラミングに向いているのかどうかは私は知らないが、単純な並列計算を力技で解かせる事が得意なのであれば、計算ロジックをF#で書いて、それを呼び出すインターフェース(画面だね)をC#やVB.NETで書くというのはアリ、だと思う。

 関数型言語というのは、全てのプロシージャー(手続きを一まとめにしたもの)が「値を返す」言語の事を言う。中学校で習ったよね。
 y=f(x)
 例えば、f(x)=x^2+5だとすると、C言語では以下のようになる。
 double f(double x) {
  return x^2+5;
 }
 これは極端な例だけど、これを
 double x, y;
 for(x = -1.0; x < 5.0; x += 0.01) {
  y=f(x);
 }
 などとして(後は画面描画機能を加えれば)画面上に二次関数を表示したりできるね。まぁ、関数型言語なんて言葉は既に意味の無いものになっているのであまり気にしなくても良いだろう。
 わざわざ「関数型言語」なんて言葉があるのは、その当時はプロシージャーが値を返さない言語も多かったという昔話でしかない。(その当時の)BASIC言語とか。GOSUB(サブにイけ)とかどんだけウホッ良いサブ(ルーチン)かっていう話ですよホント。「(F#プログラミングを)やらないか」とか言われたらもうそこであなたもF#プログラマーなわけです。ただ、F#が流行りそうか、と言われたら・・・・ボクには何とも言えない。

投稿日時 - 2010-11-01 03:19:28

お礼

anmochiさん
大変丁寧な説明ありがとうございました.

>ただ、F#が流行りそうか、と言われたら・・・・ボクには何とも言えない。
J#なる言語もありますよね.....
さすがに,せっかく,勉強しても流行らなかったら残念ですよね.

ただ
>1960~1970年代に科学技術計算に多用されたFortranなる言語に似せて作られたプログラミング言語
ということは,やっぱり,速かったりするんでしょうか?
それなら,.NetFrameworkってことも活かして,プログラム全体の統括をC#で,単純な重い処理をF#で,というのうはありなのでしょうか?

色々とご丁寧に回答していただきありがとうございます.

投稿日時 - 2010-11-03 12:58:03

あなたにオススメの質問