MSResearchから出てきた.NETで使える関数型言語のひとつF#
OCAMLの流れを汲むこの言語、いろいろと面白そうなことができそう。
そろそろ日本語の情報が充実してきそうなこの言語について、幅広く語れ。
http://www.fsharp.net/
前スレ
【.NET】F#について語れ【OCAML】
http://hibari.2ch.net/test/read.cgi/tech/1186030985/
関連スレなどは >>2-
【.NET】F#について語れ2【OCAML】
■ このスレッドは過去ログ倉庫に格納されています
2011/05/01(日) 02:46:49.52
2011/06/01(水) 00:26:26.68
>>61
F#のクラス定義の方法は
難解で読みにくいってのはまあ慣れと好みだが
冗長でってのはどうかね?
C#のクラス定義は単純明快ってのは
私はC#のクラス定義に慣れているんです
って以外に意味を持たない主張に思えるが。
F#のクラス定義の方法は
難解で読みにくいってのはまあ慣れと好みだが
冗長でってのはどうかね?
C#のクラス定義は単純明快ってのは
私はC#のクラス定義に慣れているんです
って以外に意味を持たない主張に思えるが。
63デフォルトの名無しさん
2011/06/01(水) 01:15:18.81 >>62
memberは明らかにいらない子
memberは明らかにいらない子
2011/06/01(水) 07:35:25.35
memberがいらないとか・・・
全然明らかじゃないからkwsk
全然明らかじゃないから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もクソ仕様。
クラスを定義してるのが明らかなのだから、
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#はスコープの制御がダメだね。
関数の中に関数をかけることだな。
しかも、F#における関数はOOPでいう関数ではなく、
OOPのクラスに相当する。
逆に不便だなって思うことは、共通して使う関数を作った時に
どこへ置けばいいかわからないこと。F#はスコープの制御がダメだね。
2011/06/01(水) 20:34:34.08
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でしてから普通にキャストすればよかったんだっけ?
FSharpUnion<Employee>.get_Manager的な。
isManagerでしてから普通にキャストすればよかったんだっけ?
2011/06/02(木) 16:13:53.96
>>71
つ Verbose syntax
つ Verbose syntax
2011/06/02(木) 20:42:24.42
FSIにnamespaceとかopenて流し込めないんだね・・・
デバッグの途中で
add 1 2
とか打てたらいいんだけど・・・
F#ってデバッグが難しいね;;
デバッグの途中で
add 1 2
とか打てたらいいんだけど・・・
F#ってデバッグが難しいね;;
2011/06/02(木) 21:59:27.33
76デフォルトの名無しさん
2011/06/02(木) 22:05:03.832011/06/02(木) 22:44:29.66
>75
いやC#からだとUnionそういう風にしか扱えなくなかったっけ?
そのUnionのインスタンスでIsManagerとかよべるけど。ManagerであるUnion値をManagerとして扱いたいときにどうしたらいいかって話。
もっとまともな方法あったっけ?
いや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にはまんま使うなと書いてある。
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
2011/06/03(金) 09:55:29.01
nullって悪者なんですか・・・
パターンマッチ、並列計算に強い はおもしろそう
パターンマッチ、並列計算に強い はおもしろそう
2011/06/03(金) 10:13:46.63
>78
あーやっぱりそんな感じかー
>79
自分も最初は悩んでたけど、最近はなんも困ってないな。なんでだろ。途中でうまく止めて値見るのとWriteLineで出しとくのとヘルパーとか使ってFSharpFunc楽に実行できるようにしたところか?
そもそもDebugが必要になる羽目になることが少なくなったというのもある気がするが。
>80
Debugしながらでもソースがいじれるところ。
あーやっぱりそんな感じかー
>79
自分も最初は悩んでたけど、最近はなんも困ってないな。なんでだろ。途中でうまく止めて値見るのとWriteLineで出しとくのとヘルパーとか使ってFSharpFunc楽に実行できるようにしたところか?
そもそもDebugが必要になる羽目になることが少なくなったというのもある気がするが。
>80
Debugしながらでもソースがいじれるところ。
2011/06/03(金) 10:16:25.55
>>83
Debugしながらでもソースがいじれる・・・イイ!
Debugしながらでもソースがいじれる・・・イイ!
2011/06/03(金) 11:02:45.96
>>82
実行時エラーがない方が運用上大いなるなメリットがあるのは当然だろJK
quick sortの発明者アントニーホーアはnullは10億ドルの過ちであると言っている。
ttp://news.livedoor.com/article/detail/4047613/
実行時エラーがない方が運用上大いなるなメリットがあるのは当然だろJK
quick sortの発明者アントニーホーアはnullは10億ドルの過ちであると言っている。
ttp://news.livedoor.com/article/detail/4047613/
2011/06/03(金) 15:53:21.29
まあ、どんなの場面でもnull不要とはいわないけども、
Anders Hejlsbergも「nullableの概念は参照型/値型の概念とは独立させておくべきだった」っていってるしね。
非nullable参照型は欲しい。
Anders Hejlsbergも「nullableの概念は参照型/値型の概念とは独立させておくべきだった」っていってるしね。
非nullable参照型は欲しい。
2011/06/03(金) 18:18:05.09
88デフォルトの名無しさん
2011/06/05(日) 00:00:41.87 >>83
FSharpFuncってなんですか?
数値計算のプログラムを作ってる時は、
デバッグは絶対必要なんですよね・・・
関数の形で定義してると、途中で止めても
中の数値が見れないんですよねorz
let x=f a
とかしちゃってる時に、
f 1
の値を見る方法がないと、数値計算のプログラムのデバッグは
無理かなーと。
現状のF#を数値計算に使うと死ぬかも・・・・
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));;
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
それやってみるよ。ありがと。
また、ただ、いろいろ細かい状態が知りたかったりするから
デバッグ中に値が知りたいというニーズは多いし、
あとはけっこう量が多いんだよね・・・うーん。
%Aでリスト(行列)を全表示できるのかな?
そうなら、そういう関数作っておけば、確かに楽そうだね。
DOS窓かよって不満はあるけどw
それやってみるよ。ありがと。
また、ただ、いろいろ細かい状態が知りたかったりするから
デバッグ中に値が知りたいというニーズは多いし、
あとはけっこう量が多いんだよね・・・うーん。
2011/06/05(日) 12:13:56.07
そういえばVSのデバッガは何だかんだでC#前提なままだったね。
2011/06/05(日) 12:25:05.75
> FSharpFuncってなんですか?
関数の型。クロージャ作るとそゆ型が付く。
まーF#の中にいる限りは特に意識する必要ないが。
C#と連携したいなら覚えておくといいかも。
関数の型。クロージャ作るとそゆ型が付く。
まーF#の中にいる限りは特に意識する必要ないが。
C#と連携したいなら覚えておくといいかも。
93デフォルトの名無しさん
2011/06/07(火) 12:29:28.85 F#のイディオム的なテクニックを教えてほしいな。
例えば、クロージャーとか簡単なもの。
使い始めたんだけど、上手く使えてるか自信がない。
F#ならではの書き方あったら教えてください。
例えば、クロージャーとか簡単なもの。
使い始めたんだけど、上手く使えてるか自信がない。
F#ならではの書き方あったら教えてください。
2011/06/07(火) 18:32:10.90
>>93
LINQは使ったことありますか?
LINQは使ったことありますか?
2011/06/07(火) 20:10:49.92
>>94
C#では使ったことがあります。
C#では使ったことがあります。
2011/06/07(火) 23:39:58.82
2011/06/08(水) 10:21:18.89
2011/06/08(水) 10:27:21.76
>>97
上級者は何を使うんだ?
上級者は何を使うんだ?
2011/06/08(水) 10:47:37.21
文字列のlistがあって、その文字列を表示できる矩形を重ならないように上から並べたrectと文字列のタプルのリスト返せっつったら、foldで次のトップと結果のlistを状態にするような感じでよろし?
こういうのにfold使うのなんか微妙に違和感あるんだけれどこんなもんかね@関数型初心者。
こういうのにfold使うのなんか微妙に違和感あるんだけれどこんなもんかね@関数型初心者。
100デフォルトの名無しさん
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
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
101デフォルトの名無しさん
2011/06/08(水) 21:30:46.81 F#って末尾最適化はやってくれている?
102デフォルトの名無しさん
2011/06/08(水) 22:13:07.22 コンパイル時に .tail がつく
103デフォルトの名無しさん
2011/06/08(水) 22:28:05.14 F#で文字の連結ってどうするんですか?
+でできるのはわかるんですが、これだと遅いですよね?
+でできるのはわかるんですが、これだと遅いですよね?
104デフォルトの名無しさん
2011/06/08(水) 22:50:12.35 いっておくがStringBufferみたいなものはないからな
105デフォルトの名無しさん
2011/06/08(水) 22:51:05.82 StringBuilder使えって言っておけばいいのかな
106デフォルトの名無しさん
2011/06/08(水) 23:17:37.07 末尾最適化になってるはずなんだがstackOverFlowになるってことはなってないんだろうなぁ・・・何か確認する方法あったっけ。
そもそも要素一つずつ減らしてるから無限ループになるはずないのに4千件ぐらいでStackOverFlowになるってなんか変だ。
Console.WriteLineで出力しても途中まで減ってってるのに突然何も出さなくなって5秒ぐらいしてからStackOverFlowが出てもうわけわかめ(´;ω;`)ブワッ
そもそも要素一つずつ減らしてるから無限ループになるはずないのに4千件ぐらいでStackOverFlowになるってなんか変だ。
Console.WriteLineで出力しても途中まで減ってってるのに突然何も出さなくなって5秒ぐらいしてからStackOverFlowが出てもうわけわかめ(´;ω;`)ブワッ
107デフォルトの名無しさん
2011/06/09(木) 05:16:59.39 >>106
コードkwsk
コードkwsk
108デフォルトの名無しさん
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が空ならその時点のを結果とする。有るなら続き。
そもそもデバッガーだと末尾最適化しないとかあったっけ?いやそんなことないよね…
問題だけどインタラクティブでさっくり動いたコードとりあえずまるっと載せてみる
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)
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が空ならその時点のを結果とする。有るなら続き。
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^)/オワタ
113デフォルトの名無しさん
2011/06/09(木) 09:16:04.56 htmlレンダリングの問題だけで、スレに書き込まれてるソース的には空白やタブ残ってたと思った。
リンク貼る形式なら、gistや>11の使うといいと思う
リンク貼る形式なら、gistや>11の使うといいと思う
114デフォルトの名無しさん
2011/06/09(木) 09:46:14.43115デフォルトの名無しさん
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
よくわからんが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
116デフォルトの名無しさん
2011/06/09(木) 10:51:09.46117106
2011/06/09(木) 11:37:16.53 >113-116
オマイラあり\(^o^)/
>115
いや、リストをなめていって見つかったらそれと、それ以降のやつをタプルで返してるのでそのやり方だとミリ。
なんかうまい高階関数あるのかもしれんが。
オマイラあり\(^o^)/
>115
いや、リストをなめていって見つかったらそれと、それ以降のやつをタプルで返してるのでそのやり方だとミリ。
なんかうまい高階関数あるのかもしれんが。
118デフォルトの名無しさん
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
が近いけどちょっと違うか。
こういう場合は素直に再帰をした方がいいのかな?
List.partition : ('T -> bool) -> 'T list -> 'T list * 'T list
ttp://msdn.microsoft.com/ja-jp/library/ee353782.aspx
が近いけどちょっと違うか。
こういう場合は素直に再帰をした方がいいのかな?
119デフォルトの名無しさん
2011/06/09(木) 12:06:19.24 >118
それ条件で振り分けるやつだからちょと違うと思われ
というか自己解決したかも。
プロジェクトの設定でビルドタブに"tail呼び出しの生成"って項目あってそれオンにしたらサックリ動いた。
ってもこれ付けたらデバッグとかしにくくなんのかな。
お騒がせしますた。
それ条件で振り分けるやつだからちょと違うと思われ
というか自己解決したかも。
プロジェクトの設定でビルドタブに"tail呼び出しの生成"って項目あってそれオンにしたらサックリ動いた。
ってもこれ付けたらデバッグとかしにくくなんのかな。
お騒がせしますた。
120デフォルトの名無しさん
2011/06/09(木) 12:12:10.32 ※補足:
上の何も出さなくなって5秒ぐらいしてからStackOverFlowってのは例外になったのでVisualStudioが表示用とかに色々頑張ってる状態なんだろうね。
上の何も出さなくなって5秒ぐらいしてからStackOverFlowってのは例外になったのでVisualStudioが表示用とかに色々頑張ってる状態なんだろうね。
121デフォルトの名無しさん
2011/06/09(木) 12:34:18.75 末尾呼び出しを最適化すると、関数のトレースが出来なくなる。
だから、デバッグするときは、最適化切ったりするね。
だから、デバッグするときは、最適化切ったりするね。
122デフォルトの名無しさん
2011/06/11(土) 08:45:12.01 末尾最適化=スタックに積まないだからそりゃね。
でも再帰呼び出し時のスタック トレースが必要なことってある?
printf デバッグでいいんじゃねぇかと思うんだけど。
でも再帰呼び出し時のスタック トレースが必要なことってある?
printf デバッグでいいんじゃねぇかと思うんだけど。
123デフォルトの名無しさん
2011/06/11(土) 09:35:34.36 まぁそれいっちゃうとなんでもprintfデバッグで良くね?ってなるだろw
124デフォルトの名無しさん
2011/06/11(土) 14:00:10.41 いやいやwスタックトレースは必要だと思ってるよw
どこからどう呼び出されてきた関数かはデバッグに不可欠
だけど、再帰の分に関しては必要ないんじゃね?って。
どこからどう呼び出されてきた関数かはデバッグに不可欠
だけど、再帰の分に関しては必要ないんじゃね?って。
125デフォルトの名無しさん
2011/06/11(土) 14:19:14.54 んーまぁ再帰でもなんでその条件分岐になったのか流れ見たいときはある希ガスんなぁ
printfでもいいけど。printfでいいか。
printfでもいいけど。printfでいいか。
126デフォルトの名無しさん
2011/06/11(土) 22:52:39.73 俺が想定してたのは再帰するしないで2分岐するだけの単純な再帰なんだけど
もしかするともっと複雑な再帰とかだとスタック見たいこともあるかも。
というかまあ見れる見れないだったら見れる方がありがたいのは確か。
ただ、再帰って、割とこうガチガチにロジカルに組まないとコンパイル通らない
ような気がしてて、スタック追っかけてまでデバッグする必要性あるかなあと
思ったりしたんだわ。
もしかするともっと複雑な再帰とかだとスタック見たいこともあるかも。
というかまあ見れる見れないだったら見れる方がありがたいのは確か。
ただ、再帰って、割とこうガチガチにロジカルに組まないとコンパイル通らない
ような気がしてて、スタック追っかけてまでデバッグする必要性あるかなあと
思ったりしたんだわ。
127デフォルトの名無しさん
2011/06/15(水) 09:53:18.75 FSUnitとVisualStudioのテストおのおのどんなメリット・デメリットあるのかすら。
C#使ってた時はVSのつと使ってたけどF#だと使いにくい?
C#使ってた時はVSのつと使ってたけどF#だと使いにくい?
128デフォルトの名無しさん
2011/06/15(水) 22:17:38.41129デフォルトの名無しさん
2011/06/15(水) 22:59:09.06 母国語だとさらにわからないのでは?
130デフォルトの名無しさん
2011/06/15(水) 23:15:40.40 中国語と韓国語なら読めるぜ
131デフォルトの名無しさん
2011/06/16(木) 12:49:59.57 Alt+EnterでInteractiveに流し込もうとするとエラー音してできない時があるんだけど、そういう現象出てる人います?
ウィンドウ→新規で別ウィンドウ出すとそのソースからでもできるんだけどいまいち発生する条件がわからん。
ウィンドウ→新規で別ウィンドウ出すとそのソースからでもできるんだけどいまいち発生する条件がわからん。
132デフォルトの名無しさん
2011/06/16(木) 18:49:46.13 結局TypeProviderってちょっとMeta情報与えてやることでF#でいろいろな情報がナイスに楽に使えるようになるってことでいいですか?(´・ω・`)
http://research.microsoft.com/apps/video/dl.aspx?id=150053&l=i
http://research.microsoft.com/apps/video/dl.aspx?id=150053&l=i
133デフォルトの名無しさん
2011/06/18(土) 10:35:56.55134デフォルトの名無しさん
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?から、だれか移ったのかな?
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?から、だれか移ったのかな?
135デフォルトの名無しさん
2011/06/27(月) 02:39:51.37 関数内で途中でreturn みたいに値を返したり
for内でbreakしたりしたいんですがどうやればよいですか?
for内でbreakしたりしたいんですがどうやればよいですか?
136デフォルトの名無しさん
2011/06/29(水) 11:16:04.97 >>135
自分の場合はtryFindかtryPickかな。
どうしても途中で抜けたいなら、例外出して抜けるしかない。
自分もC++のコードをF#にしてみようと思ったときそこで悩みました。
結局、F#の繰り返しのfor文は全然使わないでList.mapかList.iterで処理するのがいいと思った。
自分の場合はtryFindかtryPickかな。
どうしても途中で抜けたいなら、例外出して抜けるしかない。
自分もC++のコードをF#にしてみようと思ったときそこで悩みました。
結局、F#の繰り返しのfor文は全然使わないでList.mapかList.iterで処理するのがいいと思った。
137デフォルトの名無しさん
2011/07/01(金) 11:25:54.20 >>135
>関数内で途中でreturn みたいに値を返したり
条件で返す値を変える
>for内でbreakしたりしたいんですがどうやればよいですか?
手続き型のfor/whileは全て再帰だと思っていい
>関数内で途中でreturn みたいに値を返したり
条件で返す値を変える
>for内でbreakしたりしたいんですがどうやればよいですか?
手続き型のfor/whileは全て再帰だと思っていい
138デフォルトの名無しさん
2011/07/02(土) 00:42:03.47 そこで継続ですよ。
140天使 ◆uL5esZLBSE
2011/07/05(火) 06:48:35.87 2011年、Ruby,Perl,PHP,Pythonって並べたときにさ
ここで、Ruby以外を選ぶ奴ってマジでなんなんだろうな
ゴミだし
ここで、Ruby以外を選ぶ奴ってマジでなんなんだろうな
ゴミだし
141天使 ◆uL5esZLBSE
2011/07/05(火) 13:47:18.60 これ ; デリミタっていうんだけどさ、これをつけなきゃエラーになるような
そんな言語使ってる奴ってどうみてもゴミだと思うんだけど
もしかして「;」これ打ち忘れてコンパイルエラー出すのが楽しいの?
そうか、二度と話かけんなよ
ゴミの分際でw
そんな言語使ってる奴ってどうみてもゴミだと思うんだけど
もしかして「;」これ打ち忘れてコンパイルエラー出すのが楽しいの?
そうか、二度と話かけんなよ
ゴミの分際でw
142デフォルトの名無しさん
2011/07/10(日) 11:33:45.10 つ #light
143デフォルトの名無しさん
2011/07/12(火) 18:22:39.87 コード見てないが、意外とF#遅くてがっかし(´・ω・`)
http://users.softlab.ece.ntua.gr/~ttsiod/score4.html
http://users.softlab.ece.ntua.gr/~ttsiod/score4.html
144デフォルトの名無しさん
2011/07/17(日) 00:05:23.57 誰かseqのBuilderを実装しているソースどれかわかる人います?
2.0のソースはあるんだけど検索してもわからんです…
2.0のソースはあるんだけど検索してもわからんです…
145デフォルトの名無しさん
2011/07/17(日) 10:04:55.63146デフォルトの名無しさん
2011/08/07(日) 02:29:54.25 TIOBE TOP20入りしてた
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
msdnでドキュメント公開してるのも大きいんだろうな
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
msdnでドキュメント公開してるのも大きいんだろうな
147デフォルトの名無しさん
2011/08/20(土) 02:34:49.66148デフォルトの名無しさん
2011/08/20(土) 02:38:41.36149デフォルトの名無しさん
2011/08/20(土) 06:04:16.54150デフォルトの名無しさん
2011/08/20(土) 10:46:16.38151デフォルトの名無しさん
2011/08/20(土) 11:46:15.04 Real-World Functional Programmingも宜しくね
152デフォルトの名無しさん
2011/08/20(土) 21:29:33.05 ちなみに何がなってないの?
153149
2011/08/21(日) 08:02:31.09 >>152
突っ込むために見直してみたら、そんなに突っ込み所は無かったかも。
>>149で頭ごなしに否定するのはまずかった。反省してる。
初見ではもっと気になる所があった気がしたけど、今見て思うのは以下。
・P35-P43 if式を(.NET中では)F#に特徴的、みたく書いてるけど、実はVB.NETにもif式はあるのです…
・P85 高性能、ではなくて、高機能、では?
・タプルを使ったPythonでいうアンパック代入相当の構文を備えていて、
多値関数の戻り値が(x,y) = funcHoge(a,b)みたいに自然に書ける説明が抜けてる。
・リスト操作用の組み込み高階関数の説明が無い。
とか。重箱の隅かもしれんけど、気になるんよ。
突っ込むために見直してみたら、そんなに突っ込み所は無かったかも。
>>149で頭ごなしに否定するのはまずかった。反省してる。
初見ではもっと気になる所があった気がしたけど、今見て思うのは以下。
・P35-P43 if式を(.NET中では)F#に特徴的、みたく書いてるけど、実はVB.NETにもif式はあるのです…
・P85 高性能、ではなくて、高機能、では?
・タプルを使ったPythonでいうアンパック代入相当の構文を備えていて、
多値関数の戻り値が(x,y) = funcHoge(a,b)みたいに自然に書ける説明が抜けてる。
・リスト操作用の組み込み高階関数の説明が無い。
とか。重箱の隅かもしれんけど、気になるんよ。
154関数型入門中
2011/08/21(日) 19:29:53.73 質問させてください。
ここ数ヶ月、関数型言語をいろいろ見ています。(Scala,Haskellなど)
実践F#という本を読んでいます。
ちょっとこういう場合どうすればいいか、わからないことがあり質問させてください。
あるレコードが定義されている場合、
そのレコードに対して適用できる一連の関数を知る方法ってありますか?
実践F#には、同じ名前空間に、レコードと同じ名前のモジュールを定義して、
そこに関連する関数を書くとよい、とされていますが、
実際そうされているものでしょうか。
一つに、Haskellの型クラスのような仕組みがあれば、見通しがよくなると思うんですが
そういう仕組みはないんですよね? (Scalaにもなかった。。)
なにか、自分で設計する場合、他人が見てもわかりやすい方法などあれば教えてください。
よろしくお願いします。
ここ数ヶ月、関数型言語をいろいろ見ています。(Scala,Haskellなど)
実践F#という本を読んでいます。
ちょっとこういう場合どうすればいいか、わからないことがあり質問させてください。
あるレコードが定義されている場合、
そのレコードに対して適用できる一連の関数を知る方法ってありますか?
実践F#には、同じ名前空間に、レコードと同じ名前のモジュールを定義して、
そこに関連する関数を書くとよい、とされていますが、
実際そうされているものでしょうか。
一つに、Haskellの型クラスのような仕組みがあれば、見通しがよくなると思うんですが
そういう仕組みはないんですよね? (Scalaにもなかった。。)
なにか、自分で設計する場合、他人が見てもわかりやすい方法などあれば教えてください。
よろしくお願いします。
155デフォルトの名無しさん
2011/08/21(日) 20:41:30.81 レコード型のメソッドにしてみてもいいんじゃないでしょうか
156デフォルトの名無しさん
2011/08/21(日) 21:20:09.09 >>154
ある型に対する一連の関数を知る方法は、簡単にはないですね。
AppDomainをリフレクションで総舐めとかすればそりゃ別ですが。
型と同名のモジュールを作ってーというお作法は、まあ、ふつうはそうするかなあと。
もちろん、ふつうじゃない場合もあるわけだけど。
Haskell型クラスが美人なのはわかりますが、すでにインターフェイスで筋通してる
.NET(あるいはJVM)においてそれを求めるのは、ちょっと難しいかなあという感想。
>>155
関数型でなくOOPで、と。ええ、おっしゃる意味は解りますが、といって、たとえば
Fooオブジェクトを必要とする振る舞いがすべてFooのメソッドとして定義されるとは
限らないわけで。BarクラスのメソッドがFooを引数に取ることだってあるでしょう。
このあたり、私は、F#においてのみ特別不便だ、とは感じません。
ある型に対する一連の関数を知る方法は、簡単にはないですね。
AppDomainをリフレクションで総舐めとかすればそりゃ別ですが。
型と同名のモジュールを作ってーというお作法は、まあ、ふつうはそうするかなあと。
もちろん、ふつうじゃない場合もあるわけだけど。
Haskell型クラスが美人なのはわかりますが、すでにインターフェイスで筋通してる
.NET(あるいはJVM)においてそれを求めるのは、ちょっと難しいかなあという感想。
>>155
関数型でなくOOPで、と。ええ、おっしゃる意味は解りますが、といって、たとえば
Fooオブジェクトを必要とする振る舞いがすべてFooのメソッドとして定義されるとは
限らないわけで。BarクラスのメソッドがFooを引数に取ることだってあるでしょう。
このあたり、私は、F#においてのみ特別不便だ、とは感じません。
157b
2011/08/21(日) 22:37:39.67 > 149
書いた人です。指摘してくれてありがとうございます!
>・P35-P43 if式を(.NET中では)F#に特徴的、みたく書いてるけど、実はVB.NETにもif式はあるのです…
確かに、誤解を招く書き方でした・・・
一応、VBのIf式は知っていたのですが、あくまでここでは
「C#にもVBにもif文があるけど、F#にはない」
ということが言いたかったのです。
>・P85 高性能、ではなくて、高機能、では?
うわ、全く気付いていませんでした・・・高性能はおかしいですね。
>・タプルを使ったPythonでいうアンパック代入相当の構文を備えていて、
多値関数の戻り値が(x,y) = funcHoge(a,b)みたいに自然に書ける説明が抜けてる。
これは微妙なところで、タプルのみに限った機能ではないので省きました。
例えば、
type t = { Name: string; Age: int}
という型があったとして、t型の値xに対して
let { Name = n } x
ということも可能ですし、そもそもローカル変数に限った話ではなく、
let name { Name = n } = n
のように引数に対してのマッチも可能です。
let x, y = y, x的なものを入れるかどうかは迷ったのですが、結局入れませんでした。
>・リスト操作用の組み込み高階関数の説明が無い。
これは、この時のターゲットを考えて意図的に入れませんでした。
確かに便利な高階関数は色々と用意されていますが、それを列挙する発表ってつまらなくないかなぁ、と思ったので。
ただ、LINQ to Objectには一対一で対応するものが無いような高階関数の紹介はやってもよかったかもしれません。
書いた人です。指摘してくれてありがとうございます!
>・P35-P43 if式を(.NET中では)F#に特徴的、みたく書いてるけど、実はVB.NETにもif式はあるのです…
確かに、誤解を招く書き方でした・・・
一応、VBのIf式は知っていたのですが、あくまでここでは
「C#にもVBにもif文があるけど、F#にはない」
ということが言いたかったのです。
>・P85 高性能、ではなくて、高機能、では?
うわ、全く気付いていませんでした・・・高性能はおかしいですね。
>・タプルを使ったPythonでいうアンパック代入相当の構文を備えていて、
多値関数の戻り値が(x,y) = funcHoge(a,b)みたいに自然に書ける説明が抜けてる。
これは微妙なところで、タプルのみに限った機能ではないので省きました。
例えば、
type t = { Name: string; Age: int}
という型があったとして、t型の値xに対して
let { Name = n } x
ということも可能ですし、そもそもローカル変数に限った話ではなく、
let name { Name = n } = n
のように引数に対してのマッチも可能です。
let x, y = y, x的なものを入れるかどうかは迷ったのですが、結局入れませんでした。
>・リスト操作用の組み込み高階関数の説明が無い。
これは、この時のターゲットを考えて意図的に入れませんでした。
確かに便利な高階関数は色々と用意されていますが、それを列挙する発表ってつまらなくないかなぁ、と思ったので。
ただ、LINQ to Objectには一対一で対応するものが無いような高階関数の紹介はやってもよかったかもしれません。
158b
2011/08/21(日) 22:39:15.22 あ、let { Name = n } = xです。
159デフォルトの名無しさん
2011/08/24(水) 01:30:04.05 お!本人であるbleisさんが降臨・・・
素敵!
素敵!
160デフォルトの名無しさん
2011/09/07(水) 22:14:16.34 F#のすごい日本人おしえれ
161デフォルトの名無しさん
2011/09/07(水) 22:14:49.33 いますぐフォローすべきF#の人的なやつ
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【サッカー】U-17日本代表、激闘PK戦制す 北朝鮮撃破で6大会ぶり8強入り U17W杯 [久太郎★]
- 「国民の憤りを引き起こした」中国側“高市首相発言の撤回改めて要求” [どどん★]
- 【インバウンド】中国からの“渡航自粛”…ツアー1000人分の直前キャンセル「キャンセル料は免除してくれ」 ことしいっぱいキャンセルに [1ゲットロボ★]
- 【芸能】日中関係悪化でエンタメ業界に大ダメージ… JO1の中国でのイベント中止、邦画は公開延期、STARTOアイドルへの影響も [冬月記者★]
- XやChatGPTで広範囲の通信障害 投稿や閲覧できず [蚤の市★]
- 【サッカー】日本代表、ボリビアに3発快勝 森保監督通算100試合目を飾る…鎌田、町野、中村がゴール [久太郎★]
- Perfume・あ~ちゃんの結婚相手の一般男性、吉田カバンの社長と判明 [977261419]
- 地球から無限km先の場所ってどうなっているの?
- 自民党議員「高市は先人が築き上げた日中関係を壊した。外務省が謝罪に言ってるが自分で責任を取れ」 [834922174]
- 日本、高市のお陰で破滅に近づくwwwwwwww
- まみちゃん
- 岡田克也「軽々しく存立危機事態とか言うべきじゃない」高市早苗「台湾で武力攻撃が発生したらどう考えても日本の存立危機事態」 [931948549]
