[過去ログ] 【.NET】F#について語れ2【OCAML】 (1002レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
93(3): 2011/06/07(火)12:29 AAS
F#のイディオム的なテクニックを教えてほしいな。
例えば、クロージャーとか簡単なもの。
使い始めたんだけど、上手く使えてるか自信がない。
F#ならではの書き方あったら教えてください。
94(1): 2011/06/07(火)18:32 AAS
>>93
LINQは使ったことありますか?
95: 2011/06/07(火)20:10 AAS
>>94
C#では使ったことがあります。
96: 2011/06/07(火)23:39 AAS
>>93
関数型の場合何やるにも再帰。
とくに末尾再帰はしっかりみにつけるべき。
97(1): 2011/06/08(水)10:21 AAS
>>93
非関数型プログラマ: forやwhileループを使う
関数型入門者: 再起を使う
中級者: map, foldをなるべく使う
これが割と参考になるかも。
98: 2011/06/08(水)10:27 AAS
>>97
上級者は何を使うんだ?
99(1): 2011/06/08(水)10:47 AAS
文字列のlistがあって、その文字列を表示できる矩形を重ならないように上から並べたrectと文字列のタプルのリスト返せっつったら、foldで次のトップと結果のlistを状態にするような感じでよろし?
こういうのにfold使うのなんか微妙に違和感あるんだけれどこんなもんかね@関数型初心者。
100: 2011/06/08(水)11:11 AAS
>>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
101: 2011/06/08(水)21:30 AAS
F#って末尾最適化はやってくれている?
102: 2011/06/08(水)22:13 AAS
コンパイル時に .tail がつく
103: 2011/06/08(水)22:28 AAS
F#で文字の連結ってどうするんですか?
+でできるのはわかるんですが、これだと遅いですよね?
104: 2011/06/08(水)22:50 AAS
いっておくがStringBufferみたいなものはないからな
105: 2011/06/08(水)22:51 AAS
StringBuilder使えって言っておけばいいのかな
106(7): 2011/06/08(水)23:17 AAS
末尾最適化になってるはずなんだがstackOverFlowになるってことはなってないんだろうなぁ・・・何か確認する方法あったっけ。
そもそも要素一つずつ減らしてるから無限ループになるはずないのに4千件ぐらいでStackOverFlowになるってなんか変だ。
Console.WriteLineで出力しても途中まで減ってってるのに突然何も出さなくなって5秒ぐらいしてからStackOverFlowが出てもうわけわかめ(´;ω;`)ブワッ
107: 2011/06/09(木)05:16 AAS
>>106
コードkwsk
108: 2011/06/09(木)05:19 AAS
.tailプリフィックス付いてても状況によっては無視されるって奴かな?
109: 106 2011/06/09(木)08:39 AAS
あれーインタラクティブに流し込んだらもっとたくさん流し込んでもさっくり動くよ…
そもそもデバッガーだと末尾最適化しないとかあったっけ?いやそんなことないよね…
問題だけどインタラクティブでさっくり動いたコードとりあえずまるっと載せてみる
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)
省14
110: 106 2011/06/09(木)08:40 AAS
//続き
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に合う。
省17
111: 106 2011/06/09(木)08:43 AAS
インデントが(;´Д`)
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
省12
112: 106 2011/06/09(木)08:44 AAS
スペースを入れてもダメか。俺\(^o^)/オワタ
上下前次1-新書関写板覧索設栞歴
あと 890 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.012s