0098デフォルトの名無しさん2011/06/08(水) 10:27:21.76>>97 上級者は何を使うんだ? 0099デフォルトの名無しさん2011/06/08(水) 10:47:37.21 文字列のlistがあって、その文字列を表示できる矩形を重ならないように上から並べたrectと文字列のタプルのリスト返せっつったら、foldで次のトップと結果のlistを状態にするような感じでよろし? こういうのにfold使うのなんか微妙に違和感あるんだけれどこんなもんかね@関数型初心者。 0100デフォルトの名無しさん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 0101デフォルトの名無しさん2011/06/08(水) 21:30:46.81 F#って末尾最適化はやってくれている? 0102デフォルトの名無しさん2011/06/08(水) 22:13:07.22 コンパイル時に .tail がつく 0103デフォルトの名無しさん2011/06/08(水) 22:28:05.14 F#で文字の連結ってどうするんですか? +でできるのはわかるんですが、これだと遅いですよね? 0104デフォルトの名無しさん2011/06/08(水) 22:50:12.35 いっておくがStringBufferみたいなものはないからな 0105デフォルトの名無しさん2011/06/08(水) 22:51:05.82 StringBuilder使えって言っておけばいいのかな 0106デフォルトの名無しさん2011/06/08(水) 23:17:37.07 末尾最適化になってるはずなんだがstackOverFlowになるってことはなってないんだろうなぁ・・・何か確認する方法あったっけ。 そもそも要素一つずつ減らしてるから無限ループになるはずないのに4千件ぐらいでStackOverFlowになるってなんか変だ。 Console.WriteLineで出力しても途中まで減ってってるのに突然何も出さなくなって5秒ぐらいしてからStackOverFlowが出てもうわけわかめ(´;ω;`)ブワッ 0107デフォルトの名無しさん2011/06/09(木) 05:16:59.39>>106 コードkwsk 0108デフォルトの名無しさん2011/06/09(木) 05:19:42.26 .tailプリフィックス付いてても状況によっては無視されるって奴かな? 01091062011/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が空ならその時点のを結果とする。有るなら続き。 01101062011/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)
//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が空ならその時点のを結果とする。有るなら続き。 01121062011/06/09(木) 08:44:27.70 スペースを入れてもダメか。俺\(^o^)/オワタ 0113デフォルトの名無しさん2011/06/09(木) 09:16:04.56 htmlレンダリングの問題だけで、スレに書き込まれてるソース的には空白やタブ残ってたと思った。
リンク貼る形式なら、gistや>11の使うといいと思う 0114デフォルトの名無しさん2011/06/09(木) 09:46:14.43>>113 106ではないが、インデントを推測して貼ってみた。F#の構文がわからないので間違ってるかも ttp://ideone.com/JW8dl 0115デフォルトの名無しさん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 0116デフォルトの名無しさん2011/06/09(木) 10:51:09.46>>113の通りで、データとしては空白残ってるよ 俺はnavi2ch使ってるので普通にインデントが見れる http://ideone.com/eE0C0 01171062011/06/09(木) 11:37:16.53 >113-116 オマイラあり\(^o^)/
>115 いや、リストをなめていって見つかったらそれと、それ以降のやつをタプルで返してるのでそのやり方だとミリ。 なんかうまい高階関数あるのかもしれんが。 0118デフォルトの名無しさん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 が近いけどちょっと違うか。 こういう場合は素直に再帰をした方がいいのかな? 0119デフォルトの名無しさん2011/06/09(木) 12:06:19.24 >118 それ条件で振り分けるやつだからちょと違うと思われ
>・タプルを使った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的なものを入れるかどうかは迷ったのですが、結局入れませんでした。
追加点 F# Information Rich Programming - F# LINQ Queries - F# Type Provider mechanism - a set of built-in type providers for enterprise and web data standard IDEサポート増えるみたい。 0189デフォルトの名無しさん2011/09/16(金) 09:23:30.60 ファンクタ対応したのかな 0190デフォルトの名無しさん2011/09/16(金) 11:56:24.12 従来交わることのなかった OCaml 使いと C# 使いがそれぞれ別の切り口で文句を言いに集うスレはここですか? 0191デフォルトの名無しさん2011/09/16(金) 13:05:24.76>>190 仕事で両方使ってる人は、期待することはあっても文句はいわんだろ。