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

■ このスレッドは過去ログ倉庫に格納されています
2011/05/01(日) 02:46:49.52
MSResearchから出てきた.NETで使える関数型言語のひとつF#
OCAMLの流れを汲むこの言語、いろいろと面白そうなことができそう。
そろそろ日本語の情報が充実してきそうなこの言語について、幅広く語れ。

http://www.fsharp.net/

前スレ
【.NET】F#について語れ【OCAML】
http://hibari.2ch.net/test/read.cgi/tech/1186030985/

関連スレなどは >>2-
49デフォルトの名無しさん
垢版 |
2011/05/30(月) 19:59:14.67
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デフォルトの名無しさん
垢版 |
2011/05/30(月) 20:03:43.87
F#の嫌なところを1個見つけたよ。
インデント?空白?によって
ブロック的なものが決まることかなぁ。
だから、必然的に自動整形ってできないんだよね?
複数行選択後のtab/shift+tabができなかったら、
発狂するレベルだねw

あとは、クラスを定義する時の修飾子の多さも、ちょっとうんざりだよね;;
どういう書き方が一番エレガントなんだろう・・・

関数を定義する順番に依存しちゃうってのも、なんというか・・・
そこら辺はやっぱりscalaの方が上っぽい?
2011/05/30(月) 22:37:13.86
>>50
・オフサイドルールはうつくしい。まだまだシロートのようだな
・クラスあんまし書かないのがF#流だから木にスンナ
・偽関数型言語でよければScalaでおk
52デフォルトの名無しさん
垢版 |
2011/05/30(月) 22:48:20.11
>>51
カッコよりはインデントの方が良いとは思うが・・・
自動整形欲しいよorz

クラス使わないって厳しくない?

Scalaのどの辺が偽なの?F#も偽だと思うけど。
2011/05/31(火) 00:54:09.98
>>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()
2011/05/31(火) 18:17:18.40
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)
2011/05/31(火) 18:19:35.69

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..])+")"
2011/05/31(火) 18:22:50.97
インデントが全部消えてごめんなさい。

疑問点
・OP2をletで定義できないのはなぜだろうか?
・intからfloatへの変換は自動でできないのだろうか?
57デフォルトの名無しさん
垢版 |
2011/05/31(火) 21:12:59.18
関数型の本質は型推論によって、関数が気軽に定義できることだろうか?

例えばList.reduceはJavaでもC#でも、簡単に実装できる。
だけど、気軽に使うためには、
foldに与える関数を気軽に定義できなきゃいけない。
T arg_reduce(T t, S s)
こういう関数を簡単に定義できる枠組みを与えるのが関数型言語なんだろうか?
2011/05/31(火) 22:05:41.56
>>56
>・OP2をletで定義できないのはなぜだろうか?

以下のページの「let バインディングと do バインディング」が参考になるかも。
ttp://msdn.microsoft.com/ja-jp/library/dd233205.aspx

>・intからfloatへの変換は自動でできないのだろうか?

「プログラミングF#」の「2.1.3 変換処理」に、
「F#言語は暗黙的な型変換を行わないことを1つの方針としています。」
とか書いてあるんで無理なんじゃないかな。
59デフォルトの名無しさん
垢版 |
2011/05/31(火) 22:51:27.68
>>58
>静的メソッドからはこのフィールドにアクセスできません。
って書いてありました。ありがとう。

それはそうとdoバインディングってなんだろw
2011/05/31(火) 23:12:52.10
関数型の本質()とかどうでもいいわ。
問題は単にF#が便利なのかどうかだわ。
2011/06/01(水) 00:00:04.86
>>60
クラスブラウザがVSに実装されるまでは大規模開発が難しいのと
GUIエディタが無い現状はC#の代替にはならないかな、と思った。

F#は関数をさくさく作れる。
C#のクラス定義は単純明快だけど、
F#のクラス定義の方法は難解で、冗長で、読みにくいが、改行は少ない。
F#のyieldは便利。F#の()は読みにくい。F#のSeqは美しい。
F#は基本的に読みにくい。
2011/06/01(水) 00:26:26.68
>>61
F#のクラス定義の方法は
難解で読みにくいってのはまあ慣れと好みだが
冗長でってのはどうかね?

C#のクラス定義は単純明快ってのは
私はC#のクラス定義に慣れているんです
って以外に意味を持たない主張に思えるが。
63デフォルトの名無しさん
垢版 |
2011/06/01(水) 01:15:18.81
>>62
memberは明らかにいらない子
2011/06/01(水) 07:35:25.35
memberがいらないとか・・・
全然明らかじゃないからkwsk
2011/06/01(水) 09:04:05.36
F#ではfun x y ->x+yをx y->x+yに出来なかった言語仕様上の問題とかあったん?
2011/06/01(水) 09:32:09.49
>>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もクソ仕様。
2011/06/01(水) 18:11:51.65
funは正直鬱陶しいなあ。
68デフォルトの名無しさん
垢版 |
2011/06/01(水) 18:40:51.63
F#やってて、便利と思うのは
関数の中に関数をかけることだな。
しかも、F#における関数はOOPでいう関数ではなく、
OOPのクラスに相当する。

逆に不便だなって思うことは、共通して使う関数を作った時に
どこへ置けばいいかわからないこと。F#はスコープの制御がダメだね。
2011/06/01(水) 20:34:34.08
>>65
OCaml互換。C#の人かな。\x ->ならまだしもx ->はさすがに無理くねーか。
>>67
気持ちはわかります。

>>66
クラス内にはletとdoもかけるぞ。あとコンストラクタはメンバじゃねえ。

>>68
どこ置けばいいかわからない?F#でだけ?どの言語でも同じじゃまいか。
2011/06/01(水) 20:37:59.90
あと自動整形できないからっての、よくわからん。
整形されたコードしかコンパイル通らんのだから
そもそも整形する必要ないじゃんか。



まあ俺もオフサイドルール嫌いだけど。
2011/06/02(木) 12:42:05.73
オフサイドルールをやめるとすると、
他の選択肢ってなんだろ?
一つは{}だよね。
2011/06/02(木) 15:49:55.04
あれーC#から使う時に、F#のunionの各サブクラスへの変換とかなんかメソッドなかったっけ
FSharpUnion<Employee>.get_Manager的な。
isManagerでしてから普通にキャストすればよかったんだっけ?
2011/06/02(木) 16:13:53.96
>>71
つ Verbose syntax
2011/06/02(木) 20:42:24.42
FSIにnamespaceとかopenて流し込めないんだね・・・

デバッグの途中で
add 1 2
とか打てたらいいんだけど・・・
F#ってデバッグが難しいね;;

2011/06/02(木) 21:59:27.33
>>72
サブクラスとか、キャストとか、なんか根本的に間違ってないか。

>>74
openは流せる。まさかopen Listがエラーだからとか言わないよね?
76デフォルトの名無しさん
垢版 |
2011/06/02(木) 22:05:03.83
>>75
あぁ、ごめん。書き方が悪かった。

自分で定義したnamespaceを
openすることができないってことでした。すいません。
2011/06/02(木) 22:44:29.66
>75
いやC#からだとUnionそういう風にしか扱えなくなかったっけ?
そのUnionのインスタンスでIsManagerとかよべるけど。ManagerであるUnion値をManagerとして扱いたいときにどうしたらいいかって話。
もっとまともな方法あったっけ?
2011/06/03(金) 00:30:20.24
>>77
type Employee = ... | Manager of Hoge の場合↓

var emp = Employee.NewManager(hoge);

if (emp.IsManager) {
    var mngr = ((Employee.Manager)emp).Item;
    // dosomething
}

だからDesign Guidelinesにはまんま使うなと書いてある。
2011/06/03(金) 09:26:19.89
誰かF#のいいデバッグ方法教えてー
2011/06/03(金) 09:28:24.98
F#のC#に対して優れているところを教えてください
2011/06/03(金) 09:50:11.17
>>80
協力な型推論、nullがない、パターンマッチ、関数内関数ができる、対話環境、並列計算に強い
とかじゃね。
2011/06/03(金) 09:55:29.01
nullって悪者なんですか・・・
パターンマッチ、並列計算に強い はおもしろそう
2011/06/03(金) 10:13:46.63
>78
あーやっぱりそんな感じかー
>79
自分も最初は悩んでたけど、最近はなんも困ってないな。なんでだろ。途中でうまく止めて値見るのとWriteLineで出しとくのとヘルパーとか使ってFSharpFunc楽に実行できるようにしたところか?
そもそもDebugが必要になる羽目になることが少なくなったというのもある気がするが。
>80
Debugしながらでもソースがいじれるところ。
2011/06/03(金) 10:16:25.55
>>83
Debugしながらでもソースがいじれる・・・イイ!
2011/06/03(金) 11:02:45.96
>>82
実行時エラーがない方が運用上大いなるなメリットがあるのは当然だろJK
quick sortの発明者アントニーホーアはnullは10億ドルの過ちであると言っている。
ttp://news.livedoor.com/article/detail/4047613/
2011/06/03(金) 15:53:21.29
まあ、どんなの場面でもnull不要とはいわないけども、
Anders Hejlsbergも「nullableの概念は参照型/値型の概念とは独立させておくべきだった」っていってるしね。
非nullable参照型は欲しい。
2011/06/03(金) 18:18:05.09
>>86
関数型言語にはnullは必要ないよ。関数型プログラマはnull参照エラーみたいなアホみたいな実行時エラーとは
無縁の世界でプログラムしているよ。
88デフォルトの名無しさん
垢版 |
2011/06/05(日) 00:00:41.87
>>83
FSharpFuncってなんですか?

数値計算のプログラムを作ってる時は、
デバッグは絶対必要なんですよね・・・

関数の形で定義してると、途中で止めても
中の数値が見れないんですよねorz

let x=f a
とかしちゃってる時に、
f 1
の値を見る方法がないと、数値計算のプログラムのデバッグは
無理かなーと。

現状のF#を数値計算に使うと死ぬかも・・・・
2011/06/05(日) 06:40:44.23
伝統の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デフォルトの名無しさん
垢版 |
2011/06/05(日) 12:12:50.78
>>89
%Aでリスト(行列)を全表示できるのかな?
そうなら、そういう関数作っておけば、確かに楽そうだね。
DOS窓かよって不満はあるけどw
それやってみるよ。ありがと。

また、ただ、いろいろ細かい状態が知りたかったりするから
デバッグ中に値が知りたいというニーズは多いし、
あとはけっこう量が多いんだよね・・・うーん。
2011/06/05(日) 12:13:56.07
そういえばVSのデバッガは何だかんだでC#前提なままだったね。
2011/06/05(日) 12:25:05.75
> FSharpFuncってなんですか?
関数の型。クロージャ作るとそゆ型が付く。
まーF#の中にいる限りは特に意識する必要ないが。
C#と連携したいなら覚えておくといいかも。
93デフォルトの名無しさん
垢版 |
2011/06/07(火) 12:29:28.85
F#のイディオム的なテクニックを教えてほしいな。
例えば、クロージャーとか簡単なもの。

使い始めたんだけど、上手く使えてるか自信がない。
F#ならではの書き方あったら教えてください。
2011/06/07(火) 18:32:10.90
>>93
LINQは使ったことありますか?
2011/06/07(火) 20:10:49.92
>>94
C#では使ったことがあります。
2011/06/07(火) 23:39:58.82
>>93
関数型の場合何やるにも再帰。
とくに末尾再帰はしっかりみにつけるべき。
2011/06/08(水) 10:21:18.89
>>93
非関数型プログラマ: forやwhileループを使う
関数型入門者: 再起を使う
中級者: map, foldをなるべく使う

これが割と参考になるかも。
2011/06/08(水) 10:27:21.76
>>97
上級者は何を使うんだ?
2011/06/08(水) 10:47:37.21
文字列のlistがあって、その文字列を表示できる矩形を重ならないように上から並べたrectと文字列のタプルのリスト返せっつったら、foldで次のトップと結果のlistを状態にするような感じでよろし?
こういうのにfold使うのなんか微妙に違和感あるんだけれどこんなもんかね@関数型初心者。
2011/06/08(水) 11:11:11.30
>>99 こんな感じ?
let union rect1 rect2 = new Rect(rect1.x, rect1.y, max rect1.width rect2.width, rect1.height+rect2.height) in
ss
|> map (fun s -> getRectOf(s))
|> fold union empty_rect
2011/06/08(水) 21:30:46.81
F#って末尾最適化はやってくれている?
2011/06/08(水) 22:13:07.22
コンパイル時に .tail がつく
2011/06/08(水) 22:28:05.14
F#で文字の連結ってどうするんですか?
+でできるのはわかるんですが、これだと遅いですよね?
2011/06/08(水) 22:50:12.35
いっておくがStringBufferみたいなものはないからな
2011/06/08(水) 22:51:05.82
StringBuilder使えって言っておけばいいのかな
2011/06/08(水) 23:17:37.07
末尾最適化になってるはずなんだがstackOverFlowになるってことはなってないんだろうなぁ・・・何か確認する方法あったっけ。
そもそも要素一つずつ減らしてるから無限ループになるはずないのに4千件ぐらいでStackOverFlowになるってなんか変だ。
Console.WriteLineで出力しても途中まで減ってってるのに突然何も出さなくなって5秒ぐらいしてからStackOverFlowが出てもうわけわかめ(´;ω;`)ブワッ
2011/06/09(木) 05:16:59.39
>>106
コードkwsk
2011/06/09(木) 05:19:42.26
.tailプリフィックス付いてても状況によっては無視されるって奴かな?
109106
垢版 |
2011/06/09(木) 08:39:36.40
あれーインタラクティブに流し込んだらもっとたくさん流し込んでもさっくり動くよ…
そもそもデバッガーだと末尾最適化しないとかあったっけ?いやそんなことないよね…

問題だけどインタラクティブでさっくり動いたコードとりあえずまるっと載せてみる

let inRange from t v=from<=v&&v<=t

//rangeによってポイントをまとめる。
//現在のrange=from〜tに合うならptListに追加。
//合わないなら今までのptListを一組としてptListListに追加し、新しいポイントとしてptListに追加。
//合うrangeがなくなるか、iListが空になったら抜ける。
let rec toPtrListList (ptList,ptListList,((from,t)::rangeList)) (i::iList) indToInter indToVal=
// Console.WriteLine("toPtrLL----{0}",System.Environment.TickCount)
// Console.WriteLine ("toPtrLL iList={0},rangeL={1}",List.length iList,rangeList.Length)
let inter=indToInter i
let toPt()=inter,indToVal i
//System.Drawing.PointF(float32<|trans.XInterToUI inter,toUIY series.[i]|>float32)
//helper-----
//合うrangeを探してそれ以降を返す。
let rec findFitRange rangeList inter=
// Console.WriteLine("findFitR {0}",System.Environment.TickCount)
match rangeList with
|[]->None
|(from,t)::tail->
if inRange from t inter then Some rangeList
else findFitRange tail inter
//iListが空ならその時点のを結果とする。有るなら続き。
110106
垢版 |
2011/06/09(木) 08:40:17.92
//続き
let contOrBreak (ptList,ptListList,rangeList) iList=
// Console.WriteLine ("contOrBreak iList={0}",List.length iList)
match iList with
|[]->[],ptList::ptListList,rangeList
|_->toPtrListList (ptList,ptListList,rangeList) iList indToInter indToVal
// Console.WriteLine("toPtrLL---before helper {0}",System.Environment.TickCount)
//-----helper
if inRange from t inter then
//現在のrangeに合う。
contOrBreak (toPt()::ptList,ptListList,((from,t)::rangeList)) iList
else
//rangeに合わない
if t<inter then
//現在のrangeよりinterが先。
match findFitRange rangeList inter with
|Some (rangeList)->
//fitするものがあったのですすめる。
contOrBreak ([toPt()],ptList::ptListList,rangeList) iList
//なかったので現在のものを結果とする。
|_->[0,0],ptList::ptListList,(from,t)::rangeList
//inter<fromなので今のindを捨てる。
else
// Console.WriteLine ("hogehoge iList={0}",iList.Length)
contOrBreak (ptList,ptListList,((from,t)::rangeList)) iList

let test=
toPtrListList ([],[],[0,10000;10001,20000;20001,30000]) ([0..50000]@[0..100]) id (fun i->i+100000)

111106
垢版 |
2011/06/09(木) 08:43:47.05
インデントが(;´Д`)

let inRange from t v=from<=v&&v<=t

//rangeによってポイントをまとめる。
//現在のrange=from〜tに合うならptListに追加。
//合わないなら今までのptListを一組としてptListListに追加し、新しいポイントとしてptListに追加。
//合うrangeがなくなるか、iListが空になったら抜ける。
let rec toPtrListList (ptList,ptListList,((from,t)::rangeList)) (i::iList) indToInter indToVal=
// Console.WriteLine("toPtrLL----{0}",System.Environment.TickCount)
// Console.WriteLine ("toPtrLL iList={0},rangeL={1}",List.length iList,rangeList.Length)
let inter=indToInter i
let toPt()=inter,indToVal i
//System.Drawing.PointF(float32<|trans.XInterToUI inter,toUIY series.[i]|>float32)
//helper-----
//合うrangeを探してそれ以降を返す。
let rec findFitRange rangeList inter=
// Console.WriteLine("findFitR {0}",System.Environment.TickCount)
match rangeList with
|[]->None
|(from,t)::tail->
if inRange from t inter then Some rangeList
else findFitRange tail inter
//iListが空ならその時点のを結果とする。有るなら続き。
112106
垢版 |
2011/06/09(木) 08:44:27.70
スペースを入れてもダメか。俺\(^o^)/オワタ
2011/06/09(木) 09:16:04.56
htmlレンダリングの問題だけで、スレに書き込まれてるソース的には空白やタブ残ってたと思った。

リンク貼る形式なら、gistや>11の使うといいと思う
2011/06/09(木) 09:46:14.43
>>113
106ではないが、インデントを推測して貼ってみた。F#の構文がわからないので間違ってるかも
ttp://ideone.com/JW8dl
2011/06/09(木) 10:06:12.85
>>106
よくわからんがfindFitRangeは再帰しなくても高階関数使った方がシンプル
let inRange v (from, t) = from<=v&&v<=t
let isFit v ranges = ranges.exists(isRange v)
let findFitRange ranges inter =
if (isFit inter ranges) then Some ranges
else None
2011/06/09(木) 10:51:09.46
>>113の通りで、データとしては空白残ってるよ
俺はnavi2ch使ってるので普通にインデントが見れる
http://ideone.com/eE0C0
117106
垢版 |
2011/06/09(木) 11:37:16.53
>113-116
オマイラあり\(^o^)/

>115
いや、リストをなめていって見つかったらそれと、それ以降のやつをタプルで返してるのでそのやり方だとミリ。
なんかうまい高階関数あるのかもしれんが。
2011/06/09(木) 11:51:17.37
>>117
List.partition : ('T -> bool) -> 'T list -> 'T list * 'T list
ttp://msdn.microsoft.com/ja-jp/library/ee353782.aspx
が近いけどちょっと違うか。
こういう場合は素直に再帰をした方がいいのかな?
2011/06/09(木) 12:06:19.24
>118
それ条件で振り分けるやつだからちょと違うと思われ

というか自己解決したかも。
プロジェクトの設定でビルドタブに"tail呼び出しの生成"って項目あってそれオンにしたらサックリ動いた。
ってもこれ付けたらデバッグとかしにくくなんのかな。
お騒がせしますた。
2011/06/09(木) 12:12:10.32
※補足:
上の何も出さなくなって5秒ぐらいしてからStackOverFlowってのは例外になったのでVisualStudioが表示用とかに色々頑張ってる状態なんだろうね。
2011/06/09(木) 12:34:18.75
末尾呼び出しを最適化すると、関数のトレースが出来なくなる。
だから、デバッグするときは、最適化切ったりするね。
2011/06/11(土) 08:45:12.01
末尾最適化=スタックに積まないだからそりゃね。
でも再帰呼び出し時のスタック トレースが必要なことってある?
printf デバッグでいいんじゃねぇかと思うんだけど。
2011/06/11(土) 09:35:34.36
まぁそれいっちゃうとなんでもprintfデバッグで良くね?ってなるだろw
2011/06/11(土) 14:00:10.41
いやいやwスタックトレースは必要だと思ってるよw
どこからどう呼び出されてきた関数かはデバッグに不可欠
だけど、再帰の分に関しては必要ないんじゃね?って。
2011/06/11(土) 14:19:14.54
んーまぁ再帰でもなんでその条件分岐になったのか流れ見たいときはある希ガスんなぁ
printfでもいいけど。printfでいいか。
2011/06/11(土) 22:52:39.73
俺が想定してたのは再帰するしないで2分岐するだけの単純な再帰なんだけど
もしかするともっと複雑な再帰とかだとスタック見たいこともあるかも。
というかまあ見れる見れないだったら見れる方がありがたいのは確か。

ただ、再帰って、割とこうガチガチにロジカルに組まないとコンパイル通らない
ような気がしてて、スタック追っかけてまでデバッグする必要性あるかなあと
思ったりしたんだわ。
2011/06/15(水) 09:53:18.75
FSUnitとVisualStudioのテストおのおのどんなメリット・デメリットあるのかすら。
C#使ってた時はVSのつと使ってたけどF#だと使いにくい?
2011/06/15(水) 22:17:38.41
>>127
日本語?
母国語で頼む
2011/06/15(水) 22:59:09.06
母国語だとさらにわからないのでは?
2011/06/15(水) 23:15:40.40
中国語と韓国語なら読めるぜ
2011/06/16(木) 12:49:59.57
Alt+EnterでInteractiveに流し込もうとするとエラー音してできない時があるんだけど、そういう現象出てる人います?
ウィンドウ→新規で別ウィンドウ出すとそのソースからでもできるんだけどいまいち発生する条件がわからん。
2011/06/16(木) 18:49:46.13
結局TypeProviderってちょっとMeta情報与えてやることでF#でいろいろな情報がナイスに楽に使えるようになるってことでいいですか?(´・ω・`)
http://research.microsoft.com/apps/video/dl.aspx?id=150053&l=i
2011/06/18(土) 10:35:56.55
オブジェクトのXML相互変換、こんな感じに書けたよ( ・∀・)ノ
F#いいね。

http://ideone.com/IokO4
2011/06/24(金) 12:20:41.31
(・∀・)

Barrier使うぞ
http://blogs.msdn.com/b/mcsuksoldev/archive/2011/06/15/f-array-parallel-sort-functions-demonstrating-a-merge-sort-using-barrier.aspx

最近MCS UKの記事が多くなったけど、
MSR UK?から、だれか移ったのかな?
2011/06/27(月) 02:39:51.37
関数内で途中でreturn みたいに値を返したり
for内でbreakしたりしたいんですがどうやればよいですか?
136デフォルトの名無しさん
垢版 |
2011/06/29(水) 11:16:04.97
>>135
自分の場合はtryFindかtryPickかな。
どうしても途中で抜けたいなら、例外出して抜けるしかない。

自分もC++のコードをF#にしてみようと思ったときそこで悩みました。
結局、F#の繰り返しのfor文は全然使わないでList.mapかList.iterで処理するのがいいと思った。
137デフォルトの名無しさん
垢版 |
2011/07/01(金) 11:25:54.20
>>135
>関数内で途中でreturn みたいに値を返したり
条件で返す値を変える

>for内でbreakしたりしたいんですがどうやればよいですか?
手続き型のfor/whileは全て再帰だと思っていい
2011/07/02(土) 00:42:03.47
そこで継続ですよ。
139135
垢版 |
2011/07/02(土) 01:56:39.99
>>136-138

レスありがとうございます.
let loopですっきりとした記述ができました.
2011/07/05(火) 06:48:35.87
2011年、Ruby,Perl,PHP,Pythonって並べたときにさ
ここで、Ruby以外を選ぶ奴ってマジでなんなんだろうな


ゴミだし
2011/07/05(火) 13:47:18.60
これ ; デリミタっていうんだけどさ、これをつけなきゃエラーになるような
そんな言語使ってる奴ってどうみてもゴミだと思うんだけど

もしかして「;」これ打ち忘れてコンパイルエラー出すのが楽しいの?
そうか、二度と話かけんなよ


ゴミの分際でw
2011/07/10(日) 11:33:45.10
つ #light
2011/07/12(火) 18:22:39.87
コード見てないが、意外とF#遅くてがっかし(´・ω・`)
http://users.softlab.ece.ntua.gr/~ttsiod/score4.html
2011/07/17(日) 00:05:23.57
誰かseqのBuilderを実装しているソースどれかわかる人います?
2.0のソースはあるんだけど検索してもわからんです…
2011/07/17(日) 10:04:55.63
>>143
コード見ようや・・・
http://d.hatena.ne.jp/einblicker/20110712/1310476340
2011/08/07(日) 02:29:54.25
TIOBE TOP20入りしてた
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
msdnでドキュメント公開してるのも大きいんだろうな
2011/08/20(土) 02:34:49.66
F#って何がいいの?
って言う人には
http://www.slideshare.net/bleistift/cvbf
これを見るといいかもね?
2011/08/20(土) 02:38:41.36
あとこの辺も見ておくと
勉強になるかもね?
http://d.hatena.ne.jp/bleis-tift/20110803/1312345593
2011/08/20(土) 06:04:16.54
>>147 >>148
なってないなぁ…と思う。
そんなもん見るよりも、ちゃんと時間取って実践F#読む方がずっといいよ。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況