1read 100read
2011年11月2期プログラム15: 【.NET】F#について語れ2【OCAML】 (255) TOP カテ一覧 スレ一覧 2ch元 削除依頼

【.NET】F#について語れ2【OCAML】


1 :11/05/01 〜 最終レス :11/11/24
MSResearchから出てきた.NETで使える関数型言語のひとつF#
OCAMLの流れを汲むこの言語、いろいろと面白そうなことができそう。
そろそろ日本語の情報が充実してきそうなこの言語について、幅広く語れ。
http://www.fsharp.net/
前スレ
【.NET】F#について語れ【OCAML】
http://hibari.2ch.net/test/read.cgi/tech/1186030985/
関連スレなどは >>2-

2 :
- Try F#
http://www.tryfsharp.org/
- F# Documentation
http://msdn.microsoft.com/library/dd233154(VS.100).aspx
- F# Microsoft Research Site
http://research.microsoft.com/fsharp/fsharp.aspx

3 :
>>980ぐらいで新スレを建ててね。
注意事項 http://info.2ch.net/wiki/index.php?%C7%A6%CB%A1%C4%A1%B4%AC%CA%AA

4 :
Windowsでのインストールは、>>1から
Mac/LinuxでF#を使うにはmonoが必要です。
http://mono-project.com/
IDEにMonoDevelopを利用するなら、現時点ではmono-2.6系が必要です。
mono-2.10.1以降でF#が統合されていますので、IDEが必要ないならそのままCLI環境が使えます。
なんにせよ茨の道ですので、まずはブラウザ環境で実行できるTry F#のTutorialsを試しましょう。
Windowsでも(C#やCと組み合わせるなら、VS2010 C#/C++ Expressと) VS2010 Shell、F#2.0を組み合わせた
無償のIDE環境が使えます。

5 :
現在の最新版について
http://blogs.msdn.com/b/fsharpteam/archive/2011/04/22/update-to-the-f-2-0-free-tools-release-corresponding-to-visual-studio-2010-sp1-april-2011-ctp.aspx
http://www.microsoft.com/downloads/en/details.aspx?FamilyID=6b598327-9748-4052-884a-6ee737380dcd
・必要用件
サポートするOS:
Windows 7;Windows Server 2003;Windows Server 2008;Windows Server 2008 R2;Windows Vista;Windows XP
必要な環境:
.NET Framework 2.0 or an equivalent CLI implementation(Xbox 360, and Mono on Mac, Linux and other platform).
対応するソフトウエア(オプション):
Visual Studio 2010 Shell

6 :
>>1


7 :
言語の特徴としてはScalaとF#はそっくりだと思う。
*型推論:
 F#,Scala -> ◯
 C#,Java -> △,×
*代数データ型:
 F#,Scala -> ◯
 C#,Java -> ×
*パターンマッチ:
 F#,Scala -> ◯
 C#,Java -> ×
nullの廃止
F#,Scala -> ◯
C#,Java -> ×
モナド:
F#,Scala -> ◯
C#,Java -> ×
高階関数:
F#,Scala -> ◯
C#,Java -> △,×
変数:
F#,Scala -> デフォルトで破壊できない
C#,Java -> デフォルトで破壊できる
対話環境:
F#,Scala -> ◯
C#,Java -> ×
JavaからScalaへの大移動が始まっているのと同様のことがC#からF#に起こるに違いない!と言うのも本当かもしれない。
---------
要望があったやつ追加

8 :
>>7
名古屋ではF#が結構使われているという話を聞いたんだけど、やっぱり
自動車関係の仕事が多いからなのか?

9 :
http://www.itpl.co.jp/ocaml-nagoya/
これが関係してないか?

10 :
名古屋怖い(´・ω・`)

11 :
>>2, >>4 TryF# もよいけど、Silverlight入れたくない人やsmart phoneな人は
IdeOneも使える事を知っとくと良いよ。
hello worldを書いてみた。
http://ideone.com/ze0wq (こうやってソースと実行結果を貼ることもできる)

12 :
コード共有するのには、IdeOneみたいなサービスがいいけど、
F# InteractiveのWebコンソールとしては、これが便利かも。
Try F# in your web browser
http://tryfs.net/

13 :
そもそもなんでF#はF#という名前になったの?
FはFunctionのF?
あとC#がC++++から#になっているのは理解できるけど、
F++はもちろんF言語なんて聞いたことがないんだけど。

14 :
C#の名前を結構気に入ってたから、.NET言語になんでも#つけてた時期がある。

15 :
>>13
j#の後釜だからじゃね?
fは探せば有りそうだし

16 :
J#がでた段階か分からないけど、[A-Z]#なら.net用言語に見える
MSに関係する範囲では、C#,F#,J#のみっぽいけど。
http://en.wikipedia.org/wiki/List_of_CLI_languages

17 :
>>16
schemeが#Sなのにcommon LispがL#な所は狡猾さを感じるなw
宗教論争とか起きなかったんかね

18 :
結構粘ったやつも2009年ぐらいにメンテナンス止まってるみたい。
lisp系でメンテナンスが続いてるのは、結局Clojure(CLR)らしい。
https://github.com/richhickey/clojure-clr/downloads

19 :
F#で標準入力を遅延リストみたいに扱う方法ってあるのでしょうか?

20 :
ファイルの例だけど。
http://books.google.com/books?id=NcrMkjVxahMC&lpg=PA270&ots=pln0IBigeG&pg=PA99#v=onepage&q&f=false
Expert F#2.0 p.99 seq下のほう

21 :
F# 1.0の書籍だった。
F#2.0 は、こっち。
http://books.google.com/books?id=y3kaQxIns0oC&lpg=PP1&pg=PA96#v=onepage&q&f=false

22 :
>>20 >>21 ありがとうございます。

23 :
RT @igeta: 翻訳ありがたい。/「あなたの開発チームに F# を持ち込むリスクについての神話」 http://bit.ly/k8ZDo1 (by @finalfusion) #fsharp

24 :
scalaとF#使うならどっち?

25 :
>>24
MSならF#、それ以外ならScala。
構文は全然違うけど言語パラダイムはそっくりだから俺は両方勉強してるぜ。なかなかためになる。

26 :
誰かC#とF#の比較してくれねーかなー

27 :
違いすぎる→そんなに違わないな→やっぱ違うわ→まあ、同じとも言えるな。こんな感じが延々と続く。C#とF#の比較。

28 :
>>26
>>7 に書いてある。

29 :
>>7の「高階関数」でC#が△になってるのはなんか理由あんのかな
っていうか、「ファーストクラスの関数」でよくね
tail call elimination
nested functions
automatic currying
cons, tuple
list comprehension
あたりも比較項目につけくわえていい気がする

30 :
bingでF#検索すると残念なことに・・・

31 :
>>7
そっくりなところを比べればそりゃそっくりだろうさ

32 :
>>29
*tail call elimination
Java,C# -> ×
Scala,F# -> ○
*nested functions
Java,C# -> ×,△
Scala,F# -> ○
*automatic currying
Java,C#,Scala -> ×
F# -> ○
*cons, tuple
Java,C# -> ×
Scala,F# -> ○
*list comprehension
Java,C# -> ×
Scala,F# -> ○

33 :
Actorモデル
Scala->○
F#->○に近い△
C#,Jave->×
って感じ?ちょっと不勉強なので正確かわからん。

34 :
>>32
Scala は JVM の制限とかで tail call elimination ができないときがあるような
@tailrec アノテーションをつけておけば、できかなったときは教えてくれるけど
Scala は list comprehension あるんだっけ
for 式だったら、あれはどちらかというと Haskell の do に近いような

35 :
>>32
tail callは64ビット版.NET Framework は、ILがTailとマークしてなくても最適化してくれる(制限あり)。
あと、LINQはある意味list comprehensionsの一種なので、C#が×は納得いかない。

36 :
>>35 LINQでlist comprehension できるのか。知らなかった。
Haskellでの[x+y | x <- [0..9], y <- [0..9], x<y] みたいなのもLINQを使えば書けるのか?

37 :
LINQだと
from x in Enumerable.Range(0, 10)
from y in Enumerable.Range(0, 10)
where x < y
select x + y
とかそんな感じだろう

38 :
だれかF#でMonotouch開発しようとしてる人とかおらん?(´・ω・`)
F#にMonotouchが対応するのって、そもそも技術的に難しいんだっけ? Dictionary<int,Hoge>とかを使えないとかの制限にからんで。
それともF#なんかマイナー言語相手にしてる暇ねーぜヒャッハーってだけ?
FSharp.CoreとかのライブラリーをILAssembly使ってターゲット変えてゴニョゴニョすれば動くようになるとか言ってる人もいたんだけど。
Silverlightで同じようなことしてる人のBlogあったんだけどリンク切れちゃってた。
暇な人は"Reusing-NET-Assemblies-in-Silverlight"でぐぐって最初のエントリーのキャッシュ見てくんなまし。

39 :
monoは今レイオフされたり会社設立したりと本体がゴタゴタしててそれどころじゃないんだろ

40 :
>それともF#なんかマイナー言語相手にしてる暇ねーぜヒャッハーってだけ?
被害妄想?

41 :
Mono for AndroidよりMonoTouchのが制約きついみたいだね。
http://d.hatena.ne.jp/atsushieno/touch/20110407/p1 の最後の段落

42 :
しかしまあF#ってScalaほど必要とされている感がないんだよなー
なまじC#がよくできてるから

43 :
企業の後ろだてのある言語じゃなく、1研究社が作った言語が注目集めるとかおかしいだろ。
どんだけJavaはアレなんだよ。

44 :
>>42 確かにScalaは多くのJava技術者に注目を浴びているけど、Scalaいいって
言う人の言うことはそのままF#にも当てはまるんだよね。
ScalaがF#に比べて人気ある理由はC#がJavaより良くできているという以外に
構文がJavaから大きく離れてはいないという点があると思う。Javaコードを
コピペして微修正すればScalaコードとして動くし、Scalaコードを見てもある程度
読めそうな気になるから移行しやすいんだよね。

45 :

一方F#は構文が違いすぎるし、初見だと全然読めない。このとっつきにくさが
結構効いているんじゃないかな。
でもF#は関数型言語としてScalaよりずっといい線行っている(構文はキモいけど)
ので、Scalaへの大移動が現実になったときC#erはF#への移動を準備すべき。
C#erがレガシーな理由のみで残りつづけて老害とならないようになってほしい。

46 :
ScalaはGood Java。Javaに取って代わることを目標としているマルチパラダイム言語。
F#はあくまでもC#の補完。.NETファミリーの関数型言語の位置づけ。
scalaは関数型的な使い方をしなくてもいろいろ遊べる。
最初の関数型言語にScalaを選んでしまった場合、
Good Javaの部分だけで腹いっぱいになって関数型までたどり着けないことが多い。

47 :
Scalaは、未来のJavaを先取りした言語と表現してるが、
Scalaと同じ機能がある未来のJavaは構文がもっと複雑なんだろうな。

48 :
Scalaは関数型ってだけじゃなくてオブジェクト指向言語としてもJavaより進んでるのがウケてる理由の一つの気がするな

49 :
C#もまだ未熟なんだけどF#に手を出してみたよ!!
で、F#難し過ぎて、はやくも挫折しそうなんだけど・・・
ちょっと質問。
クラスのスコープ内に関数を定義したかったらC#の場合、こうできる。
class 振り分け{
double[] ratio;
public 振り分け(){
initRatio();
}
private initRatio(){うんたらかんたら}
}
同じことをF#でやる場合staticなメンバにしないといけないのかな?
type 振り分け=
class
val mutable ratio: float[]
static member initRatio=うんたらかんたら
new(){ratio=initRatio}
うーん、ようわからんwww

50 :
F#の嫌なところを1個見つけたよ。
インデント?空白?によって
ブロック的なものが決まることかなぁ。
だから、必然的に自動整形ってできないんだよね?
複数行選択後のtab/shift+tabができなかったら、
発狂するレベルだねw
あとは、クラスを定義する時の修飾子の多さも、ちょっとうんざりだよね;;
どういう書き方が一番エレガントなんだろう・・・
関数を定義する順番に依存しちゃうってのも、なんというか・・・
そこら辺はやっぱりscalaの方が上っぽい?

51 :
>>50
・オフサイドルールはうつくしい。まだまだシロートのようだな
・クラスあんまし書かないのがF#流だから木にスンナ
・偽関数型言語でよければScalaでおk

52 :
>>51
カッコよりはインデントの方が良いとは思うが・・・
自動整形欲しいよorz
クラス使わないって厳しくない?
Scalaのどの辺が偽なの?F#も偽だと思うけど。

53 :
>>49
type Foo() =
    let initRatio() : float array = Array.map ( (*) 2.0 ) [|1.1;2.2;3.3|] 
    let mutable ratio = initRatio()
    member x.Say() = printfn "%A" ratio
let _ =
   let foo = new Foo()
   foo.Say()

54 :
namespace Algebra
type Vector(elements: float[])=
member this.size=elements.Length
member this.elements=elements
member this.Item
with get i = elements.[i]
member this.squaredNorm=Vector.dot(this,this)
static member (~-) (v: Vector)=
new Vector([| for i in 0 .. v.size-1 -> -v.[i] |])
static member OP2 (v1:Vector) (v2:Vector) op=
new Vector([| for i in 0 .. v1.size-1 -> op v1.[i] v2.[i] |])
static member (+) (v1: Vector, v2: Vector)=
Vector.OP2 v1 v2 (fun x y -> x+y)
//new Vector([| for i in 0 .. v1.size-1 -> v1.[i]+v2.[i] |])
static member (-) (v1: Vector, v2: Vector)=
Vector.OP2 v1 v2 (fun x y -> x-y)
static member (.*) (v1: Vector, v2: Vector)=
Vector.OP2 v1 v2 (fun x y -> x*y)
static member (./) (v1: Vector, v2: Vector)=
Vector.OP2 v1 v2 (fun x y -> x/y)

55 :

static member (*) (a: float, v: Vector)=
new Vector([| for i in 0 .. v.size-1 -> a*v.[i] |])
static member (*) (v: Vector, a: float)=a*v
static member (/) (v: Vector, a)=(1./a)*v
static member dot (v1: Vector, v2: Vector)=
Array.reduce (fun x y -> x+y) (v1.*v2).elements
override this.ToString() =
"("+(Array.fold (fun (x:string) (y:float) -> x+","+string(y))
(string(elements.[0])) elements.[1..])+")"

56 :
インデントが全部消えてごめんなさい。
疑問点
・OP2をletで定義できないのはなぜだろうか?
・intからfloatへの変換は自動でできないのだろうか?

57 :
関数型の本質は型推論によって、関数が気軽に定義できることだろうか?
例えばList.reduceはJavaでもC#でも、簡単に実装できる。
だけど、気軽に使うためには、
foldに与える関数を気軽に定義できなきゃいけない。
T arg_reduce(T t, S s)
こういう関数を簡単に定義できる枠組みを与えるのが関数型言語なんだろうか?

58 :
>>56
>・OP2をletで定義できないのはなぜだろうか?
以下のページの「let バインディングと do バインディング」が参考になるかも。
ttp://msdn.microsoft.com/ja-jp/library/dd233205.aspx
>・intからfloatへの変換は自動でできないのだろうか?
「プログラミングF#」の「2.1.3 変換処理」に、
「F#言語は暗黙的な型変換を行わないことを1つの方針としています。」
とか書いてあるんで無理なんじゃないかな。

59 :
>>58
>静的メソッドからはこのフィールドにアクセスできません。
って書いてありました。ありがとう。
それはそうとdoバインディングってなんだろw

60 :
関数型の本質()とかどうでもいいわ。
問題は単にF#が便利なのかどうかだわ。

61 :
>>60
クラスブラウザがVSに実装されるまでは大規模開発が難しいのと
GUIエディタが無い現状はC#の代替にはならないかな、と思った。
F#は関数をさくさく作れる。
C#のクラス定義は単純明快だけど、
F#のクラス定義の方法は難解で、冗長で、読みにくいが、改行は少ない。
F#のyieldは便利。F#の()は読みにくい。F#のSeqは美しい。
F#は基本的に読みにくい。

62 :
>>61
F#のクラス定義の方法は
難解で読みにくいってのはまあ慣れと好みだが
冗長でってのはどうかね?
C#のクラス定義は単純明快ってのは
私はC#のクラス定義に慣れているんです
って以外に意味を持たない主張に思えるが。

63 :
>>62
memberは明らかにいらない子

64 :
memberがいらないとか・・・
全然明らかじゃないからkwsk

65 :
F#ではfun x y ->x+yをx y->x+yに出来なかった言語仕様上の問題とかあったん?

66 :
>>64
クラスを定義してるのが明らかなのだから、
memberという修飾子はいらない。
あと、そもそもletが冗長なのと
副作用がないならnewを省略したい。
下記のようなシンプルさが欲しい。
class A(a:float)
add b = A(a + b)
minus b = A(a - b)
inc = add 1
dinc = this.inc.inc
この場合、IDE側でクラス名と関数名に色をつけてくれないと
クソ読みにくい。オフサイドルールの欠点。
あとandもクソ仕様。

67 :
funは正直鬱陶しいなあ。

68 :
F#やってて、便利と思うのは
関数の中に関数をかけることだな。
しかも、F#における関数はOOPでいう関数ではなく、
OOPのクラスに相当する。
逆に不便だなって思うことは、共通して使う関数を作った時に
どこへ置けばいいかわからないこと。F#はスコープの制御がダメだね。

69 :
>>65
OCaml互換。C#の人かな。\x ->ならまだしもx ->はさすがに無理くねーか。
>>67
気持ちはわかります。
>>66
クラス内にはletとdoもかけるぞ。あとコンストラクタはメンバじゃねえ。
>>68
どこ置けばいいかわからない?F#でだけ?どの言語でも同じじゃまいか。

70 :
あと自動整形できないからっての、よくわからん。
整形されたコードしかコンパイル通らんのだから
そもそも整形する必要ないじゃんか。
まあ俺もオフサイドルール嫌いだけど。

71 :
オフサイドルールをやめるとすると、
他の選択肢ってなんだろ?
一つは{}だよね。

72 :
あれーC#から使う時に、F#のunionの各サブクラスへの変換とかなんかメソッドなかったっけ
FSharpUnion<Employee>.get_Manager的な。
isManagerでしてから普通にキャストすればよかったんだっけ?

73 :
>>71
つ Verbose syntax

74 :
FSIにnamespaceとかopenて流し込めないんだね・・・
デバッグの途中で
add 1 2
とか打てたらいいんだけど・・・
F#ってデバッグが難しいね;;

75 :
>>72
サブクラスとか、キャストとか、なんか根本的に間違ってないか。
>>74
openは流せる。まさかopen Listがエラーだからとか言わないよね?

76 :
>>75
あぁ、ごめん。書き方が悪かった。
自分で定義したnamespaceを
openすることができないってことでした。すいません。

77 :
>75
いやC#からだとUnionそういう風にしか扱えなくなかったっけ?
そのUnionのインスタンスでIsManagerとかよべるけど。ManagerであるUnion値をManagerとして扱いたいときにどうしたらいいかって話。
もっとまともな方法あったっけ?

78 :
>>77
type Employee = ... | Manager of Hoge の場合↓
var emp = Employee.NewManager(hoge);
if (emp.IsManager) {
    var mngr = ((Employee.Manager)emp).Item;
    // dosomething
}
だからDesign Guidelinesにはまんま使うなと書いてある。

79 :
誰かF#のいいデバッグ方法教えてー

80 :
F#のC#に対して優れているところを教えてください

81 :
>>80
協力な型推論、nullがない、パターンマッチ、関数内関数ができる、対話環境、並列計算に強い
とかじゃね。

82 :
nullって悪者なんですか・・・
パターンマッチ、並列計算に強い はおもしろそう

83 :
>78
あーやっぱりそんな感じかー
>79
自分も最初は悩んでたけど、最近はなんも困ってないな。なんでだろ。途中でうまく止めて値見るのとWriteLineで出しとくのとヘルパーとか使ってFSharpFunc楽に実行できるようにしたところか?
そもそもDebugが必要になる羽目になることが少なくなったというのもある気がするが。
>80
Debugしながらでもソースがいじれるところ。

84 :
>>83
Debugしながらでもソースがいじれる・・・イイ!

85 :
>>82
実行時エラーがない方が運用上大いなるなメリットがあるのは当然だろJK
quick sortの発明者アントニーホーアはnullは10億ドルの過ちであると言っている。
ttp://news.livedoor.com/article/detail/4047613/

86 :
まあ、どんなの場面でもnull不要とはいわないけども、
Anders Hejlsbergも「nullableの概念は参照型/値型の概念とは独立させておくべきだった」っていってるしね。
非nullable参照型は欲しい。

87 :
>>86
関数型言語にはnullは必要ないよ。関数型プログラマはnull参照エラーみたいなアホみたいな実行時エラーとは
無縁の世界でプログラムしているよ。

88 :
>>83
FSharpFuncってなんですか?
数値計算のプログラムを作ってる時は、
デバッグは絶対必要なんですよね・・・
関数の形で定義してると、途中で止めても
中の数値が見れないんですよねorz
let x=f a
とかしちゃってる時に、
f 1
の値を見る方法がないと、数値計算のプログラムのデバッグは
無理かなーと。
現状のF#を数値計算に使うと死ぬかも・・・・

89 :
伝統のprintfデバッグじゃダメ?
let dbg x = printfn "*debug:%A" x; x;;
こんな感じで使う。
[1..10] |> List.map ((+) 1) |> dbg |> List.map(fun x -> dbg(float x / 2.0));;

90 :
>>89
%Aでリスト(行列)を全表示できるのかな?
そうなら、そういう関数作っておけば、確かに楽そうだね。
DOS窓かよって不満はあるけどw
それやってみるよ。ありがと。
また、ただ、いろいろ細かい状態が知りたかったりするから
デバッグ中に値が知りたいというニーズは多いし、
あとはけっこう量が多いんだよね・・・うーん。

91 :
そういえばVSのデバッガは何だかんだでC#前提なままだったね。

92 :
> FSharpFuncってなんですか?
関数の型。クロージャ作るとそゆ型が付く。
まーF#の中にいる限りは特に意識する必要ないが。
C#と連携したいなら覚えておくといいかも。

93 :
F#のイディオム的なテクニックを教えてほしいな。
例えば、クロージャーとか簡単なもの。
使い始めたんだけど、上手く使えてるか自信がない。
F#ならではの書き方あったら教えてください。

94 :
>>93
LINQは使ったことありますか?

95 :
>>94
C#では使ったことがあります。

96 :
>>93
関数型の場合何やるにも再帰。
とくに末尾再帰はしっかりみにつけるべき。

97 :
>>93
非関数型プログラマ: forやwhileループを使う
関数型入門者: 再起を使う
中級者: map, foldをなるべく使う
これが割と参考になるかも。

98 :
>>97
上級者は何を使うんだ?

99 :
文字列のlistがあって、その文字列を表示できる矩形を重ならないように上から並べたrectと文字列のタプルのリスト返せっつったら、foldで次のトップと結果のlistを状態にするような感じでよろし?
こういうのにfold使うのなんか微妙に違和感あるんだけれどこんなもんかね@関数型初心者。

100read 1read
1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼