1 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 14:03:05 ] MSResearchから出てきた.NETで使える関数型言語のひとつF# OCAMLの流れを汲むこの言語、いろいろと面白そうなことができそう。 まだまだ英語の情報しかないこの言語について、幅広く語れ。 research.microsoft.com/fsharp/fsharp.aspx
66 名前:デフォルトの名無しさん mailto:sage [2007/09/02(日) 17:46:24 ] >>65 いや、ベータじゃないバージョンでリリースされてるのかということ。 自己責任だとしても製品に使っていいものかどうか。
67 名前:デフォルトの名無しさん mailto:sage [2007/09/03(月) 23:14:51 ] >>66 LINQ自体(.NET 3.5)はまだベータで、RTMは年末頃だけどそういう話?
68 名前:デフォルトの名無しさん mailto:sage [2007/09/04(火) 01:15:25 ] >>67 そういう話。さんくす。
69 名前:デフォルトの名無しさん [2007/09/04(火) 14:38:45 ] 全部lazyにしとけば遅延評価として正常に動作するもんどすか? それともHaskelとかと比べて注意しないといけないとこあり?
70 名前:デフォルトの名無しさん mailto:sage [2007/09/28(金) 00:02:20 ] age
71 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 07:06:18 ] 普段 Visual C++ で業務アプリ書いている俺が 酔狂で関数言語(関数型言語?)をいじってみようと思うんだけど、 ocaml と haskell とどちらがお勧め? 手続きがたべったりの俺には無理?
72 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 08:37:50 ] だから、ドトネッツはクラスベースだって。
73 名前:71 mailto:sage [2007/10/05(金) 09:24:00 ] F# 入れてみた。おもしれぇ。 Visual Haskell も入れてみたけど、とっつきにくかった。 www.haskell.org/visualhaskell/ そういやなんでも IL 上でつくられてね? IronPython とか IronRuby とか。
74 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 09:30:50 ] J#は?
75 名前:デフォルトの名無しさん [2007/10/05(金) 09:32:03 ] JAVAとC#どちらが優れているか教えてください Part2 ttp://pc11.2ch.net/test/read.cgi/prog/1189919634/196 いまのオープンソースの流れから考えてもC#は数年後には今のJ#と同じ道を辿る。 利潤追求の激しい企業が本来ならば仲間にしなければならない開発者までも食い物に していることも分からず、M$マンセーしている奴は頭を齧られ過ぎて考えることも出来ない くらいに脳みそがなくなっているんだろ。可哀想だよ。
76 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 09:52:10 ] >>71 はじめはOCamlで、慣れてきたらHaskellもやってみるのがよろしいかと。 OCamlだけだと遅延評価とか関数合成あたりが学びづらいし、 Haskellだけだと再帰とかモジュールシステムあたりが学びづらい。
77 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 10:01:19 ] ____________________________ (^o^)ノ オワタ 三┌(^o^)┘オワタ /| ノ( ヘヘ 三 ┘> 三 ┌(^o^)┘オワタ | ミ (^o^)ノ オワタ 三 ┌(^o^)┘オワタ ┘>/ | ミ \( ^o^)/ オワタ ノ( ヘヘ (^o^)ノ オワタ 三 ┘> ┌(^o^)┘オワタ / ミ |_/ ノ( ヘヘ 三 ┘> / / | ノ ノ  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| / | ミ | / | ヽ(^o^ )ノ オワター ミ \( ^o^)/ オワタ _____________________|/ | \(\ノ ミ |_/ | | ミ ノ ノ | | ミ \( ^o^)/ オワタ ______ ______ | | |_/ ||// .|| ||// || │ | ノ ノ ||/ .|| ||/ || │ | || || ||._____________ ...|| │ | ミ || || ||| (^o^) | || │ | ミ\(^o^)/ オワタ  ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄ | | ┘|
78 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 10:02:50 ] Adobe『AIR』は、「MSによるオフィスアプリ支配」を崩すか ttp://wiredvision.jp/news/200709/2007090520.html
79 名前:デフォルトの名無しさん [2007/10/05(金) 10:31:33 ] ttp://journal.mycom.co.jp/articles/2007/10/01/moesuku/menu.html
80 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 10:57:46 ] J#って何のためにあるの? ttp://pc11.2ch.net/test/read.cgi/tech/1179314479/l50
81 名前:71 mailto:sage [2007/10/05(金) 12:58:50 ] >>75 C# はどうなるかわかんないけど、 C++/CLI の出来はいいと思うよ。 Managed C++ でいろいろと改良点が指摘されて それが十分に生かされていると思う。
82 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 13:01:43 ] 基地外にマジレス不要
83 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 17:17:39 ] うほ。 System.Windows.Forms とか見えてる・・・ もしかして俺が C# で書いたフォームを Haskell から呼び出したりできるのか??
84 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 17:18:14 ] Haskell じゃなかった、 F# だた。 両方並行していじってると頭がおかしくなるみたい。
85 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 18:05:32 ] 出来るお(´・ω・`)
86 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 20:09:58 ] F#速いお OCamlよりも速いお 立ち上がってからの話だけど・・・ ちょっと言ってみたかっただけだお
87 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 20:52:17 ] Python並みにコードが短く、C#のように実行が速い ttp://www.strangelights.com/blog/archive/2007/06/17/1588.aspx
88 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 23:21:11 ] C#って速いか? C#って速いか? C#って速いか? C#って速いか? C#って速いか?
89 名前:デフォルトの名無しさん mailto:sage [2007/10/05(金) 23:29:39 ] 遅いのはGDI+
90 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 01:02:09 ] 初回起動時のコンパイルもかな
91 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 07:23:48 ] >>88 速いと思うよ。 >>90 が言うように初回起動時に JITコンパイラのようなものが働いているみたいで、 確かにデバッグ・実行繰り返しているときに いらいらすることがある。デバッグコードだから かもしれないけど。 あと、実際に多用するかどうかはともかくとして、 C#だとどうしても速く書けない部分があっても DLLの呼び出しが簡単なので、Cやアセンブラで 書いたコードを呼び出せるし。Javaのネイティブ メソッドよりも簡単に。
92 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 09:43:34 ] >>91 interopでのDLLやCOMの呼び出しは確かに簡単だが、マーシャリングの コストが高いので細切れにCの小さなコードを呼ぶような使い方はすべきでない。 そういうことがしたいなら、むしろC++/CLIを使うべきだろう。
93 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 11:46:01 ] >>92 C#のP/InvokeとC++/CLIの暗黙のP/Invokeのマーシャリングにかかるコストは実は差がない。 違いはC++/CLIではデフォルトでSupressUnmanagedCodeSecurityAttributeが付加され、 C#は付かないということ。 C#のP/Invokeに[SupressUnmanagedCodeSecurity]をつけると途端に速くなるから試してみるといい。
94 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 17:26:28 ] UTF-8 で書いておけば日本語もおkなんだね。
95 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 17:43:08 ] >>93 それってセキュリティ的にどうなの?
96 名前:デフォルトの名無しさん mailto:sage [2007/10/06(土) 17:57:10 ] >>95 セキュリティって文字列に反応しているようだけど、 この設定はセキュリティ関連のチェックを事前にできるように するかどうかというだけの設定じゃなかったっけ? ドトネトなプログラムは実行時にたとえば「ディスクへの書き込み はしちゃだめだからね」なんていうセキュリティ上の制約を つけて実行することができるようだけど、プログラムが全体として その制約を満たしているかどうかを実行開始前にチェックできるように するか、実行時に「おいおい、書いちゃダメだってば」って 例外を出すようにするかって違いじゃないの? F#の話から外れて申し訳ないが。
97 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 01:14:32 ] ほっしゅほっしゅ 入れてみたよ〜。なんだか面白そうだ。
98 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 04:04:22 ] >>97 ttp://blogs.msdn.com/dsyme/archive/2007/10/17/s-somasegar-on-taking-f-forward.aspx うは、Luke HobanがF#チームに異動か。 まあOrcasでの仕事もほぼ終わったところだろうし、いいタイミングなのかも。
99 名前:98 mailto:sage [2007/10/18(木) 04:05:26 ] ごめん、>>97 は関係ない。
100 名前:名無しさん♯ mailto:sage [2007/10/18(木) 21:18:06 ] ttp://blogs.msdn.com/somasegar/archive/2007/10/17/f-a-functional-programming-language.aspx これって、F#を製品化するって話なの? 表現が微妙でそう読み取れないんだけど、反響を見るとそういう扱いになってる・・・。(´・ω・`)
101 名前:デフォルトの名無しさん mailto:sage [2007/10/19(金) 07:33:45 ] Iron ほげほげといい、F# といい、 Visual Studio で何でもありという感じだなぁ。 その一方で、 Visual Studio 2008 Beta 2 見ると J# がなくなっている・・・ 俺としては継続してほしかった。 さらにライセンス的に無理なんだろうけど JDK 1.6 にも対応してほしかった。 いまは JDK 1.1.4 相当だから。 スレちがいでごめん。
102 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 05:01:18 ] wikipedia の F# のページ ja.wikipedia.org/wiki/F_Sharp には F# は科学計算用途に適した言語であるといえる。 F# は、低級だが高速な数値計算言語 (Fortran など) と、 高級だが低速な言語 (Mathematica など) の両方の特徴をもつ。 って書いてあるんですけど、 F# によって matlab や R 言語で処理するような 事柄にむいていますか?向いているなら今から習得して修論に使おうと思って いるんですけど...
103 名前:102 mailto:sage [2007/10/20(土) 05:13:28 ] 後、同ページ ja.wikipedia.org/wiki/F_Sharp には、 F# は異なる言語に容易にアクセスすることができ、 LAPACK や FFTW などといったライブラリの利用が容易である。 と書いてありますが、これは、 C 言語など低級の言語のみならず、 matlab や mathematica や R 言語などにもアクセスする事は可能なんでしょうか?
104 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 12:13:22 ] 言語による
105 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 17:38:14 ] Cにはアクセスできるよ。 ほかのはCからいけるならとりあえずラッパコード書けばいけんじゃね?
106 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 18:28:41 ] matlab や R はインターフェイスがネイティブの C だよね? なので C++/CLI でラッピングすればドトネトの世界から アクセスできる。当然 F# からもアクセスできる。 でもあんまり F# 使う意味ないんじゃね? 俺にとっての F# を使う意義と言えば、 Visual Studio の中で仕事しているふりをしながら 現実逃避できるというところだろうか。
107 名前:102 mailto:sage [2007/10/21(日) 23:58:45 ] >>105 >>106 確かに、そうなると F# 使う意味なくなりますね... それはそうと、 >>102 の F# は科学計算用途に適した言語であるといえる。 F# は、低級だが高速な数値計算言語 (Fortran など) と、 高級だが低速な言語 (Mathematica など) の両方の特徴をもつ。 っていう記述は本当なのですか?もし本当なら、院生にとっては 夢のような言語のような気がするんですけど...
108 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 01:29:32 ] >>107 F#というよりベースになってるOCamlの特徴かな。 それなりの訓練は必要だが関数型言語はある種の科学技術計算に向いてる。 ただ、これを高級と呼ぶかどうかは知らんし、手続き型がいい場合もある。 関数型言語の多くは遅延評価で弱い型付けであるが、 OCamlは正確(遅延評価でないという意味)で、推論でしっかり型付けされるため、 コンパイルが可能でパフォーマンスがいい。 問題はまだ新しい言語でライブラリが充実してないところ。
109 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 10:41:59 ] >>107 どっかのページに大学院生でOCaml使っていて、こんなに(・∀・)イイ!!言語なのになんでマイナーなんだろうとかいう記述があったぞ >>108 F#なら.NETのライブラリが使えるお
110 名前:デフォルトの名無しさん [2007/10/23(火) 21:05:48 ] 正格だよね
111 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 23:34:50 ] >>108 > OCamlは正確(遅延評価でないという意味) 正格だボケ
112 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 00:24:58 ] ボケはお前だ
113 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 05:59:26 ] VC# expressしか持ってないんですが この場合VS上でのF#プログラミングって使えるんですかね
114 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 07:45:50 ] Expressは駄目。たしか、IronPythonのも駄目だった。 いまお金かけないとすると、VS2008のbetaですかね。
115 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 09:38:06 ] 2008 Beta2 Standardがおすすめ
116 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 10:25:49 ] F#はじめました。クロージャもどきを作ってみましたが、 let rec makeclr v n = let pr n = printf "closure %d\n" n in if n < 1 then v else (fun () -> pr(n)) :: (makeclr v (n - 1)) let makecl = makeclr [] ;; let v = makecl 10 in List.iter (fun x -> x()) v ;; リストの後方に追加するスマートな方法があったら教えてください。 逆にしたら怒られた。 (makeclr v (n - 1)) :: (fun () -> pr(n))
117 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 13:42:18 ] >>116 3行目で if n < 1 then rev v が定石かと思われ。 (makeclr v (n - 1)) @ [fun () -> pr n] は効率の面でおすすめできない。(´・ω・`)
118 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 14:37:10 ] >>117 ありがとう。最後にまとめて反転させたほうが早いわけですね。 末尾再帰になってなかったのでそうしたら反転の必要もなくなりました。 最初はforやwhileを使ってたのですがなんだかうまくないようです。 あまりforやwhileは使わないのでしょうか。配列専用の機能のように思えました。 let rec makeclr v n = if n < 1 then v else makeclr ((fun () -> printf "closure %d\n" n) :: v) (n - 1) let makecl = makeclr [] ;; let v = makecl 10 in List.iter (fun x -> x()) v ;;
119 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 15:11:11 ] >>118 ループとしてのfor, whileはほとんど使いません。(つーか、構文忘れてるし・・・。) ただし、内包表記のforはよく使います。 let makeclr n = [ for i in [1..n] -> fun () -> printf "closure %d\n" i ] でもまあ、最初のうちは再帰で解決する習慣を身につけるべきかと。(´・ω・`)
120 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 15:12:06 ] F#のメリットってなんですか? C#より優れてるところ、劣ってるところはなんですか? F#にできてC#にできないことってありますか?
121 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 16:04:01 ] >>119 こういうforの使い方があるのか。おいしくいただきまます。
122 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 20:08:41 ] あかん・・・手続き型べったりの俺には 簡単なコードで頭の体操するのが精いっぱい。 しかし使い慣れた Visual Studio で動くので なんとなく使えてる気になるけど。 やっぱり理論的な基礎をしっかりとやってない 専門学校上がりのコーダーには扱えないのかね。 Emacs における Emacs Lisp のように、 既存のネイティブ or ドトネトなプログラムの マクロ言語としておもしろい?とかオモタけど、 妄想だけにしときます。
123 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 01:28:33 ] >>118 を1行で。 [1..10] |> List.map (fun n () -> printf "closure %d\n" n) |> List.iter ((|>) ())
124 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 01:30:32 ] 暗号にしかみえんがみなさんはこういうのにメリット感じるの?
125 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 01:55:17 ] Microsoft、関数型言語F#をVisual Studioに統合へ――開発者からはおおむね好意的な反応 opentechpress.jp/developer/07/10/24/0310251.shtml
126 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 01:58:35 ] 手を広げすぎ
127 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 02:12:00 ] let flip f a b = f b a let delay f = fun () -> f let _ = [1..10] |> List.map (printf "closure %d\n" |> (delay >> flip)) |> List.iter ((|>) ())
128 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 04:27:16 ] right to leftの方が読みやすいかな。 let _ = List.iter ((|>) ()) << List.map (flip << delay <| printf "closure %d\n") <| [1..10]
129 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 08:26:45 ] 型推論ってなんですか?
130 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 09:46:24 ] 型を推論してくれるんです。
131 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 09:59:05 ] やけに賑やかDaNa
132 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 22:11:15 ] OCaml は整数型と実数型で足し算の演算子すら違って面倒だという話を聞いたことがありますが,本当ですか? F#もそうなってるんですか?
133 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 22:16:40 ] 整数の演算子 : + - * / 実数の演算子 : +. -. *. /.
134 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 22:47:06 ] めんどくさ
135 名前:デフォルトの名無しさん mailto:sage [2007/10/29(月) 23:50:47 ] >>132 > 1 + 0.1;; 1 + 0.1;; ----^^^^ stdin(7,4): error: FS0001: This expression has type float but is here used with type int stopped due to error > 1.0 + 0.1;; val it : float = 1.1 > 1.0 +. 0.1;; 1.0 +. 0.1;; ----^^^ stdin(9,4): warning: FS0062: This construct is for compatibility with OCaml. Use the overloaded infix operator '+' instead. Disable this warning using --no-warn 62 or #nowarn "62" val it : float = 1.1
136 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 10:22:05 ] >>132 F#では演算子は共通になった。 .NETのサポートするデータ型を全部サポートしなきゃいけないのでこうなったものと思われる。 ただし暗黙の型変換はないので整数+実数の計算は変換が必要になる。 > 3.2 + float 2;; val it : float = 5.2
137 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 10:24:25 ] F#ってVS2008についてくんの?
138 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 13:41:11 ] OCamlってフランス製だっけ?
139 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 15:13:40 ] そうざます
140 名前:デフォルトの名無しさん mailto:sage [2007/11/07(水) 23:39:11 ] おフランスwww
141 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 01:04:38 ] 140が見えない
142 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 00:21:33 ] なんで?
143 名前:名無しさん♯ mailto:age [2007/11/19(月) 14:52:34 ] F# 1.9.3.4が出ますた。( ゚д゚)ノ Asyncの実装がまた微妙に変わってますがな・・・。(´・ω・`)
144 名前:デフォルトの名無しさん [2007/11/19(月) 16:38:48 ] おぉ〜 この言語は普及するのかな
145 名前:名無しさん♯ mailto:sage [2007/11/19(月) 20:25:01 ] ありゃ、ライブラリのマニュアル、バージョン古いままだ・・・。(´・ω・`)
146 名前:デフォルトの名無しさん mailto:sage [2007/11/19(月) 23:47:01 ] 普及するわけないだろwwwwwwwwwww
147 名前:デフォルトの名無しさん [2007/11/20(火) 16:06:16 ] 並列計算の需要がものすごく増えてきてるから普及するんじゃないかねぇ
148 名前:名無しさん♯ mailto:sage [2007/11/20(火) 16:20:04 ] Async型って、Haskellで type Async a = Cont () (Either a Exception) って脳内変換すれば、unit, bindの実装の意味が理解できることに最近気がついた。 で、ごく一部の方々がActionを使った継続をやけに議論してた意味もようやくわかった。(つД`)
149 名前:名無しさん♯ mailto:sage [2007/11/20(火) 20:05:10 ] Eitherじゃぜんぜんダメだった・・・。orz エラー系の継続を最初からずっと保持してなきゃならんので、結局 type Async a = (a -> (), Exception -> ()) -> () こうするしかないですわ。(´・ω・`) でも、Asyncってモナド則を満たしてるんかいなという新たな疑問も・・・。
150 名前:名無しさん♯ mailto:sage [2007/11/20(火) 20:14:12 ] あ、型コンになってなかった。(´・ω・`) data Async a = Async ((a -> (), Exception -> ()) -> ())
151 名前:名無しさん♯ mailto:sage [2007/11/21(水) 08:05:42 ] Asyncを単純化するとこんな感じなのかな?( ´・ω・) #light type Async<'a> = Async of (('a -> unit) * (exn -> unit) -> unit) with static member Run (Async x) = x let unit a = Async (fun (cont, _) -> cont a) let bind m k = Async (fun (cont, econt) -> let cnext = fun a -> try Async.Run (k a) (cont, econt) with exn -> econt exn Async.Run m (cnext, econt)) で、実際にはここでのunit→resultPrim, bind→bindAsyncPrim相当でしかなくて、 これにキャンセルサポート(AsyncGroup)を追加してはじめてresultAsync, bindAsync相当になる、と。 モナドの定義自体にはスレッド云々は関係なくて、モナドを起動する側(Run, Spawn)の方で スレッドに結びつけてる、と。 これをC#で表現するのはめんどいのう。(´・ω・`)
152 名前:デフォルトの名無しさん [2007/11/21(水) 13:31:20 ] 関数型言語は図で説明できますか? フローチャートのように。 それが出来ないと、企業で使うのは難しいと思う。
153 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 13:48:56 ] フローチャート(笑)
154 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 13:53:48 ] 次の質問をどうぞ
155 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 14:30:48 ] 質問が正確じゃないな。 「Javaはむずかしすぎて使えません!」とギャグでなく主張する ド低脳にとっては関数型言語のほうが簡単なのですか? そうでないと、ドカタが使うのは難しいと思う。 こうだろ。
156 名前:デフォルトの名無しさん mailto:sage [2007/11/21(水) 14:38:19 ] おもしろくないよ
157 名前:名無しさん♯ mailto:sage [2007/11/21(水) 21:33:54 ] あ、>>151 間違えとる。(´・ω・`) Async.Runは Async<'a> -> 'a にしないとダメなのか・・・。 >>151 の実装は flip asyncApp 相当に過ぎないか。
158 名前:名無しさん♯ mailto:sage [2007/11/22(木) 01:13:05 ] うーん、やっぱりキャンセルサポートなしでAsync.Runまで作っても複雑になるなあ・・・。 #light type Async<'a> = Async of (('a -> unit) * (exn -> unit) -> unit) let app (Async x) = x let unit a = Async (fun (cont, _) -> cont a) let bind m k = Async (fun (cont, econt) -> let c = fun a -> try app (k a) (cont, econt) with exn -> econt exn app m (c, econt)) let catch p = Async (fun (cont, _) -> app p (cont << Choice2_1, cont << Choice2_2)) let start p = app p ((fun () -> ()), (fun exn -> raise exn)) type Async<'a> with static member Run p = let res = ref None // val res : Choice<'a, exn> option ref let cont = fun r -> res := Some r; unit () start (bind (catch p) cont) match Option.get !res with | Choice2_1 a -> a | Choice2_2 exn -> raise exn これでAsync.Spawn, Async.Parallelまで挑戦するのは無理ぽ。(´・ω・`)
159 名前:デフォルトの名無しさん [2007/11/22(木) 12:12:02 ] 1.9.3.6リリース
160 名前:デフォルトの名無しさん [2007/11/22(木) 23:56:53 ] >153-154 図星だったようだね。
161 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 00:06:19 ] ?
162 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 01:28:54 ] 政治的な理由で図が必要なら、Executable UMLでも 使ってれば? あと>>155 が答え。
163 名前:名無しさん♯ mailto:sage [2007/11/23(金) 12:20:33 ] CPSだとアピールするよう、>>158 のstartをプチ改良。w let id x = x let start p = app p (id, (fun exn -> raise exn))
164 名前:名無しさん♯ mailto:sage [2007/11/23(金) 17:12:31 ] これはすばらしすぎるwww ttp://channel9.msdn.com/Showpost.aspx?postid=358968 コメント欄もなかなか熱い。(;^ω^)
165 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 01:29:29 ] もうちょっとHaskellよりなOCamlがいいと思う
166 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 01:46:59 ] OCamlは副作用に対して寛大で、保守性や開発効率を保ったまま言語仕様を定めるのが忙しくて 165の様な要望に対しては手一杯
167 名前:名無しさん♯ mailto:sage [2007/11/27(火) 22:37:56 ] F#のオブジェクト機能をちょっとまじめに使ってみますた。( ゚д゚) ttp://cid-c42499cb3a347006.skydrive.live.com/self.aspx/Public/DLRSample.fs
168 名前:デフォルトの名無しさん [2007/11/28(水) 01:53:52 ] 日本語の解説はないの? htmlは読みにくいからpdfのドキュメントはないの?
169 名前:名無しさん♯ mailto:sage [2007/11/28(水) 17:21:32 ] 両方ともにすばらしい。(´ー`) (.ppt注意) ttp://qcon.infoq.com/sanfrancisco/file?path=/QConSF2007/slides/public/ErikMeijer_LINQIntro.ppt ttp://qcon.infoq.com/sanfrancisco/file?path=/QConSF2007/slides/public/ErikMeijer_Confessions.ppt モナドの観点では、LINQの標準クエリ演算子で最重要なのは実は SelectMany なのね。 >>168 日本語の解説は見たことないです。 英語のなら最近すごくいい入門記事が出ましたが・・・。 ttp://tomasp.net/articles/fsharp-i-introduction/article.pdf
170 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 21:07:15 ] >>169 モンドリアン風なのが気に入ったw
171 名前:デフォルトの名無しさん [2007/11/29(木) 01:54:58 ] F#がC#より優れている点ってあるの? すべてにおいてC#が優っているように思えるのだが。
172 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 02:04:46 ] んじゃC#使えばいいじゃにあか
173 名前:デフォルトの名無しさん [2007/11/29(木) 02:06:18 ] そうだけど何かメリットがあるならF#を使ってみようかと思って。 無いなら使わないけど。
174 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 04:51:48 ] F#とC#は使い所が違うんじゃないかな
175 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 05:38:33 ] (::)が関数として使えないんだけどそういうもん?
176 名前:デフォルトの名無しさん [2007/11/29(木) 20:23:52 ] F#の機能とかっていずれC#も取り込みそうな気がする。C#って何気に巨大言語だよね。
177 名前:デフォルトの名無しさん mailto:sage [2007/11/29(木) 20:49:05 ] へじたんの夢の固まりだからな
178 名前:デフォルトの名無しさん [2007/11/29(木) 21:22:37 ] C#でできることすべてはF#でできない。 F#でできることすべてはC#でできる。
179 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 01:29:16 ] 逆だろ
180 名前:デフォルトの名無しさん [2007/11/30(金) 01:30:02 ] 逆じゃない。
181 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 01:41:23 ] C#、F#でできることの集合をそのままC#、F#と書く 1行目から C# ∩ F# = φ 2行目から F# ⊆ C# ∴F# = φ アッー
182 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 01:45:50 ] aho
183 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 01:52:06 ] (C#でできることすべて)はF#でできない。 ではなく C#でできることにはF#でできないことがある。 という意味なのか
184 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 01:59:02 ] 仕様書でこういうどちらとも取れる言葉遣いをしていたら揉め事の種になるな
185 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 02:00:23 ] F#使ったことないけど、 C#では var f = i=>i で型推論が働かず、コンパイルが通らない。 F#ではできる!(=F#でしかできない事) という認識で良いでしょうか?
186 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 09:14:42 ] 開発はなに使ってますか?VS2008?
187 名前:名無しさん♯ mailto:sage [2007/11/30(金) 10:30:03 ] 気がつけば、F# 1.9.3.7にマイナーアップデート。 ttp://research.microsoft.com/research/downloads/Details/e8478d6b-49c0-4750-80eb-0e424d1631a3/Details.aspx そして待望のこれ。F#との相性よろし。(´ー`) ttp://www.microsoft.com/downloads/details.aspx?FamilyID=e848dc1d-5be3-4941-8705-024bc7f180ba&DisplayLang=en 改めてこちらにも注目。 ttp://research.microsoft.com/research/downloads/Details/f9d6994e-45f6-49b8-b3c9-2a44bb2a4c50/Details.aspx
188 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 10:50:05 ] C#で航海関数(なぜか変換できない)かけるのかとこ一時間
189 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 10:58:20 ] ハァ?
190 名前:名無しさん♯ mailto:sage [2007/11/30(金) 18:05:31 ] System.Linq.ParallelEnumerable System.Linq.Parallel.Enumerable まぎらわしい・・・。(´・ω・`) 前者はIParallelEnumerable用、後者はIEnumerable用。
191 名前:名無しさん♯ mailto:sage [2007/11/30(金) 19:00:00 ] ParallelEnumerableに、ForAllなんていうAction系の拡張メソッドが。 オリジナルのEnumerableにもこれ付けてほしかったのに。(つД`)
192 名前:名無しさん♯ mailto:sage [2007/11/30(金) 19:36:06 ] Parallel.Aggregateはどこへ行った?と思ったら、 Parallel.For<TLocal> Parallel.ForEach<TSource, TLocal> がその代わりらしい。でも、使い方がちょっとわかりにくい・・・。(´・ω・`)
193 名前:名無しさん♯ mailto:sage [2007/11/30(金) 20:05:28 ] >>191 のForAllは、inverted enumerationというやつだった。 ForEachのつもりで使うと、順番がバラバラで困ったことになる。 MSDN Magazineできちんと解説してた内容をすっかり忘れてた・・・。orz ttp://msdn.microsoft.com/msdnmag/issues/07/10/PLINQ/default.aspx
194 名前:デフォルトの名無しさん [2007/11/30(金) 23:25:34 ] research.microsoft.com/research/downloads/Details/e8478d6b-49c0-4750-80eb-0e424d1631a3/Details.aspx www.microsoft.com/downloads/details.aspx?FamilyID=e848dc1d-5be3-4941-8705-024bc7f180ba&DisplayLang=en research.microsoft.com/research/downloads/Details/f9d6994e-45f6-49b8-b3c9-2a44bb2a4c50/Details.aspx
195 名前:名無しさん♯ mailto:sage [2007/12/01(土) 00:16:49 ] SEQUENTIAL_THRESHOLDがからむと、チューニング(値決め)がむずかしそうですのう。(´・ω・`)
196 名前:名無しさん♯ mailto:sage [2007/12/01(土) 13:20:31 ] TPLむずかし杉ワロタw #r "System.Core.dll"; #r "System.Threading.dll"; #light open System open System.Linq open System.Threading open Int32 let _ = let sum = ref (to_int64 0) do Parallel.For(0, 1000000, new Func<_>(fun _ -> !sum), new Action<_,ParallelState<_>>(fun i st -> st.ThreadLocalState <- st.ThreadLocalState + (to_int64 (i + 1))), new Action<_>(fun localSum -> Interlocked.Add (sum, localSum) |> ignore)) Console.WriteLine("TPL : {0}", !sum) let _ = let seq = ParallelEnumerable.Range(1, 1000000) ParallelEnumerable.Aggregate(seq, to_int64 0, new Func<_,_,_>(fun sum i -> sum + (to_int64 i))) |> fun sum -> Console.WriteLine("PLinq : {0}", sum)
197 名前:名無しさん♯ mailto:sage [2007/12/02(日) 01:01:31 ] dual coreでのパフォーマンスアップは1.5〜1.6倍といったところでしょうか。 quadで動かしてみたいのう。(´・ω・`)
198 名前:名無しさん♯ mailto:sage [2007/12/02(日) 23:54:31 ] F#じゃないけど、こんなのを取りまとめ中。 ttp://cid-c42499cb3a347006.skydrive.live.com/self.aspx/Public/LinqUtils.cs C#も十分関数的ですのう。(´・ω・`)
199 名前:デフォルトの名無しさん mailto:sage [2007/12/03(月) 03:17:53 ] なんかむずむずする関数名だな。
200 名前:デフォルトの名無しさん mailto:sage [2007/12/03(月) 04:41:19 ] >>198 ・Unitは確かにムズムズするな。unit 型と混乱しそう。 ・IsEmptyの実装は Enumerable.Count<T>使うより Enumerable.Any<T>使った方が良いんでは? Count使うと無限リストで死ねる。 てかAnyがあるからIsEmpty要らん気もするけど。個人的には。
201 名前:デフォルトの名無しさん mailto:sage [2007/12/03(月) 09:10:48 ] C#もラムダ式で再帰を書く方法の改善と末尾再帰の最適化をやってくれるようになったら 関数型っぽく遊べるようになるんだがな。
202 名前:デフォルトの名無しさん mailto:sage [2007/12/03(月) 09:14:32 ] その辺は棲み分けでしょ .net frameworkって糊を上手く使う所ってことで
203 名前:名無しさん♯ mailto:sage [2007/12/03(月) 10:49:17 ] >>200 コメント感謝です。 > ・Unitは確かにムズムズするな。unit 型と混乱しそう。 前は「Lift」って名前にしてたんですが、そっちの方がわかりやすいでしょうか? > ・IsEmptyの実装は Enumerable.Count<T>使うより > Enumerable.Any<T>使った方が良いんでは? Anyの使い方を知らなかっただけでつ。(´・ω:;.:... 勉強になりますのう。
204 名前:デフォルトの名無しさん mailto:sage [2007/12/03(月) 11:17:49 ] >>203 個人的にはLiftで良いと思う。 ただ、.NET全般として見たときには Nullableのところで"Lift"を使っちゃってて面倒鴨。 ttp://msdn2.microsoft.com/en-us/library/system.linq.expressions.unaryexpression.islifted(VS.90).aspx monadがあればこの辺のメタな名前の衝突は回避できるというか統合できるのかのぅ。
205 名前:名無しさん♯ mailto:sage [2007/12/03(月) 11:29:57 ] >>204 修正しますた。ついでに使用例も。( ゚д゚)ノ ttp://cid-c42499cb3a347006.skydrive.live.com/self.aspx/Public/LinqUtilsDemo.cs > monadがあればこの辺のメタな名前の衝突は回避できるというか統合できるのかのぅ。 monoid派が「Unit, Bindにすべし!」と言い出す悪寒・・・。
206 名前:名無しさん♯ mailto:sage [2007/12/03(月) 23:16:44 ] うーん、結局のところ かなり必要 → ZipWith できれば必要 → Lift (T -> IEnumerable<T> のインターフェイスで) ぐらいで、他は別にイラネって感じかもしれん・・・。(´・ω・`)
207 名前:名無しさん♯ mailto:sage [2007/12/03(月) 23:35:51 ] Cycleは漏れ的にはお気に入りだけど、実際には使わんよなあ・・・。(;´Д`)
208 名前:デフォルトの名無しさん mailto:sage [2007/12/04(火) 00:29:38 ] OCamlは糞言語だな。F#は大丈夫なんだろうな。
209 名前:名無しさん♯ mailto:sage [2007/12/04(火) 20:11:20 ] TPLは、TaskManagerPolicyを変えて、ParallelよりもConcurrentライブラリとして使えば便利かもしれん。 でもそれって何てjava.util.concurrent?(´・ω・`)
210 名前:デフォルトの名無しさん [2007/12/20(木) 02:46:46 ] Lisp系に比べるとML系って泥臭いというか、洗練されていない感じがする。頭悪そうな感じ。
211 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 08:06:21 ] でも得てしてそういう言語の方が広まったりしない?
212 名前:デフォルトの名無しさん [2007/12/21(金) 08:42:24 ] MLは普及してないだろ。
213 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 14:10:28 ] まさに目くそ鼻くそ
214 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 14:41:19 ] MS は # シリーズが Z までいったら, 次は $ シリーズを展開してくれると期待している.
215 名前:デフォルトの名無しさん mailto:sage [2007/12/21(金) 23:44:56 ] M$
216 名前:デフォルトの名無しさん mailto:sage [2007/12/23(日) 23:59:49 ] >>210 CL, Scheme, SML, OCaml なんかを比べているのであれば、 どれも大差無い様に見えるけど。歴史的に一番泥臭いのは CL だろうけど…
217 名前:名無しさん♯ mailto:sage [2007/12/24(月) 10:52:24 ] Scalaの言語仕様もよくできてますなあ。 F#よりもHaskellに近い希ガス。 もしかしたら、C# 4.0のヒントもこの中にあるのかもしれん。(´・ω・`)
218 名前:デフォルトの名無しさん mailto:sage [2007/12/24(月) 11:24:46 ] 気になる開発プロダクツ 第7回 Scala 2.6.0-final gihyo.jp/dev/serial/01/awdp/0007 初めて名前聞いた. ところでみんな将来的には業務に使おうと思ってF#とか 関数型言語をいじってるの?
219 名前:デフォルトの名無しさん mailto:sage [2007/12/26(水) 03:54:29 ] Scala、Rubyみたいな言語だなw
220 名前:名無しさん♯ mailto:sage [2007/12/26(水) 11:42:54 ] 一部で話題になってる論文。 ttp://www.cs.kuleuven.be/~adriaan/?q=genericshk これをJVM上の言語で実現したのはすごいなあ。 一方、.NETの方では・・・。(´・ω・`) ttp://www.haskell.org/pipermail/glasgow-haskell-users/2005-January/007603.html
221 名前:名無しさん♯ mailto:sage [2007/12/26(水) 21:40:07 ] いちおう動いたけど、なんか間違えてるような・・・(´・ω・`)? trait Monad[M[_]] { def returnM[T](x: T): M[T] def bindM[T, U](m: M[T], f: T => M[U]): M[U] } abstract class Maybe[T] case class Just[T](x: T) extends Maybe[T] case class None[T] extends Maybe[T] object Test { implicit object MaybeMonad extends Monad[Maybe] { def returnM[T](x: T) = Just(x) def bindM[T, U](m: Maybe[T], f: T => Maybe[U]): Maybe[U] = m match { case Just(x) => f(x) case _ => None() } } def test[T, U](a: Maybe[T], f: T => U)(implicit m: Monad[Maybe]) { m.bindM(a, (b: T) => m.returnM(f(b))) match { case Just(x) => println(x) case _ => println("None") } } def main(args: Array[String]) { test(Just(100), (x: Int) => x + x) // 200 test(None(), (x: Int) => x + x) // None } } testの第1引数にMaybeを使ってしまうと、Monadで汎化した意味がないような・・・。
222 名前:名無しさん♯ mailto:sage [2007/12/26(水) 21:52:51 ] しかも、JustとNone。名前の由来が微妙に混ざってる・・・。orz
223 名前:名無しさん♯ mailto:sage [2007/12/26(水) 22:23:36 ] あ、こうすればいいのか。(゚∀゚) def test[M[_], T, U](a: M[T], f: T => U)(implicit m: Monad[M]) { m.bindM(a, (b: T) => m.returnM(f(b))) }
224 名前:名無しさん♯ mailto:sage [2007/12/26(水) 22:50:55 ] 関数を { 〜 } で囲むと戻り値はUnitになっちゃうのか・・・。なるほど。(;`・ω・)
225 名前:名無しさん♯ mailto:sage [2007/12/26(水) 23:11:49 ] 修正版でつ。 trait Monad[M[_]] { def returnM[T](x: T): M[T] def bindM[T, U](m: M[T], f: T => M[U]): M[U] } abstract class Maybe[T] case class Just[T](x: T) extends Maybe[T] case class Nothing[T] extends Maybe[T] object Test { implicit object MaybeMonad extends Monad[Maybe] { def returnM[T](x: T) = Just(x) def bindM[T, U](m: Maybe[T], f: T => Maybe[U]) = m match { case Just(x) => f(x) case _ => Nothing[U]() } } def test[M[_], T, U](x: M[T], f: T => U)(implicit m: Monad[M]) = m.bindM(x, (y: T) => m.returnM(f(y))) def main(args: Array[String]) { def p[T](m: Maybe[T]) = m match { case Just(x) => println(x) case _ => println("Nothing") } p(test[Maybe,Int,Int](Just(100), (x: Int) => x + x)) p(test[Maybe,Int,Int](Nothing(), (x: Int) => x + x)) } }
226 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 14:09:13 ] 前、海外でF#使える人の求人あったけどどんなものなのかね? 日本でもかまわんけれど、実際のシステムで使われてるかなど教えてエロイ人
227 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 14:46:20 ] >>226 実際は雑用とかだろ
228 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 14:59:22 ] このスレ一人しかいないのか知らんけど、過疎ってるからってさすがにつっこむべきかと・・・・ そのコードF#ですか? >>226 基本的には.netアプリだけど、ASP.NETでスクリプト的に使うんだろうな〜 まあIronPythonもそうだがちゃんとしたフォームデザイナがないとGUIアプリは作りづらいし 当然C#とかVBを置き換わるものではない ってか常識で考えろ
229 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 23:12:31 ] >>228 常識が何をさしてるのか知らんが、別に既存の業務土方アプリ作るのにF#使うことは無いでしょう。 まぁF#のほうが生産性高いとは思うけれど、メンテや技術者の人数から見ても選択されることはないかと。 それよりも自分が見たのは、何かの科学計算に向けての実験的なアプリの作成などに絡む部門だったような。Lispとかの経験でも可とかいってたから何か面白そうなにおいがした。
230 名前:名無しさん♯ mailto:sage [2008/01/04(金) 22:35:35 ] Scalaをいろいろと触ってみましたけど、オブジェクトの発想が強すぎて 関数型としては扱いづらいですね・・・。(´・ω・`) F#の比較対象としては不向きかも。
231 名前:名無しさん♯ mailto:sage [2008/01/06(日) 21:44:12 ] fsi --quiet --exec hoge.fs hoge.fsを実行してそのまま終了。 今までこのオプションを知らんかった・・・。orz そうなると、DLRの使い道が一気に減ってしまうがな。(´・ω・`)
232 名前:デフォルトの名無しさん [2008/01/19(土) 17:56:27 ] F# 1.9.3.14あげ
233 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 08:32:45 ] ttp://www.iunknown.com/2008/02/langnet-wrap-up.html IronRubyの中の人による、Lang.NETのまとめ へじたんのお言葉 I think that the taxonomies of programming languages are breaking down. I think that languages are fast becoming amalgam. ... I think that in 10 years, there won't be any way to categorize languages as dynamic, static, procedural, object, and so on. だそうで。 F#の学習はいい先行投資かもしれないねぇ。まぁ楽しいからやってるんですし、皆さんそうなんでしょうけど。
234 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 00:18:28 ] どうせ次のC#までまた2年ぐらいあるんだろうしなぁ・・・ F#製品に使うことにするノシ
235 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 16:13:36 ] OCamlとか知らんでいきなり#lightでやるの危険だな letに宣言と式があるなんて知らんかったし、do,doneとかもかなり混乱する Web上だとそういう初歩の情報ないし。 OCaml入門は読むべしだ。互換性とか適当だけど。 Expert F#は割とわかりやすかった
236 名前:デフォルトの名無しさん mailto:age [2008/02/08(金) 00:45:43 ] ひゃー
237 名前:デフォルトの名無しさん [2008/02/08(金) 00:49:55 ] F#の日本語本うp
238 名前:名無しさん♯ mailto:sage [2008/02/24(日) 01:19:50 ] F#でMapReduceもどきを作ってみますた。(「もどき」なのは、sequentialにしか動かないから。w) C# LINQに比べると、やっぱり圧倒的に記述しやすいわ。 #light open System open Seq let ap_snd f (a, b) = (a, f b) // MapReduce let map_reduce m r = map_concat m >> groupBy fst >> orderBy fst >> map (ap_snd (map snd) >> r)
239 名前:名無しさん♯ mailto:sage [2008/02/24(日) 01:20:36 ] // word count demo let mapper (_, v : string) = v.Split [| ' '; ','; '.'; '!' |] |> filter (not << String.IsNullOrEmpty) |> map (fun s -> (s.ToLower(), 1)) let reducer = ap_snd (fold1 (+)) let data = [ "This is a pen."; "Hello, World!"; "All your base are belong to us."; "My name is nanashi." ] let _ = mapi (fun i s -> (i, s)) data |> map_reduce mapper reducer |> iter (fun (k, v) -> Console.WriteLine("{0}\t{1}", k, v))
240 名前:名無しさん♯ mailto:sage [2008/02/24(日) 12:44:20 ] C#版も置いておきまつ。クエリーの部分だけはきれいなんですが・・・。(´・ω・`) using System; using System.Collections.Generic; using System.Linq; // MapReduce public interface IMapper<K1, V1, K2, V2> { IEnumerable<KeyValuePair<K2, V2>> Map(KeyValuePair<K1, V1> p); } public interface IReducer<K2, V2, K3, V3> { KeyValuePair<K3, V3> Reduce(KeyValuePair<K2, IEnumerable<V2>> p); } public class MapReduceJob<K1, V1, K2, V2, K3, V3> { Func<KeyValuePair<K1, V1>, IEnumerable<KeyValuePair<K2, V2>>> mapper; Func<KeyValuePair<K2, IEnumerable<V2>>, KeyValuePair<K3, V3>> reducer; public MapReduceJob(IMapper<K1, V1, K2, V2> mapper, IReducer<K2, V2, K3, V3> reducer) { this.mapper = mapper.Map; this.reducer = reducer.Reduce; }
241 名前:名無しさん♯ mailto:sage [2008/02/24(日) 12:55:01 ] あれ?数分間書き込めなかった・・・。(´・ω・`) public IEnumerable<KeyValuePair<K3, V3>> Execute(IEnumerable<KeyValuePair<K1, V1>> data) { return from d in data from p in mapper(d) group p.Value by p.Key into g orderby g.Key select reducer(new KeyValuePair<K2, IEnumerable<V2>>(g.Key, g)); } } // word count class WCMapper : IMapper<int, string, string, int> { public IEnumerable<KeyValuePair<string, int>> Map(KeyValuePair<int, string> p) { return from s in p.Value.Split(' ', ',', '.', '!') where !String.IsNullOrEmpty(s) select new KeyValuePair<string, int>(s.ToLower(), 1); } } class WCReducer : IReducer<string, int, string, int> { public KeyValuePair<string, int> Reduce(KeyValuePair<string, IEnumerable<int>> p) { return new KeyValuePair<string, int>(p.Key, p.Value.Sum()); } }
242 名前:名無しさん♯ mailto:sage [2008/02/24(日) 12:55:35 ] static class Test { static string[] data = { "This is a pen.", "Hello, World!", "All your base are belong to us.", "My name is nanashi." }; static void Main() { var d = data.Select((s, i) => new KeyValuePair<int, string>(i, s)); var job = new MapReduceJob<int, string, string, int, string, int>(new WCMapper(), new WCReducer()); foreach (var p in job.Execute(d)) { Console.WriteLine("{0}\t{1}", p.Key, p.Value); } } }
243 名前:名無しさん♯ mailto:sage [2008/02/24(日) 13:37:52 ] Map/Reduce = Select/Aggregate だと今まで勘違いしてたけど、 Map -> SelectじゃなくてSelectMany(generator的な操作) Reduce -> 確かにAggregateの操作だけど、厳密にはSelectの中で(selectorとして)実行されるAggregate だったのね。実際に書いてみないとなかなか気づけんわ。(´・ω・`)
244 名前:名無しさん♯ mailto:sage [2008/02/24(日) 13:48:26 ] ついでにネタ振り。 末尾再帰のスタイルはどちらがお好み? #light // val sum : int list -> int let sum1 l = let rec sum' l v = match l with | [] -> v | h::t -> sum' t (v + h) sum' l 0 let sum2 = let rec sum' v = function | [] -> v | h::t -> sum' (v + h) t sum' 0 要は、sum' の引数の順番の問題なのですが・・・。
245 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 14:32:14 ] 僕は末尾再帰用の追加の引数は最後に置くなぁ もともと引数は「入力、出力」の順で書いてたので。 末尾再帰は局所定義にすることがほとんどで 部分適用をしないから、それでもいいかなと。
246 名前:名無しさん♯ mailto:sage [2008/02/24(日) 16:11:10 ] おお、即日レスがつくとは・・・。(つД`) >>245 > もともと引数は「入力、出力」の順で書いてたので。 確かにそうですね・・・。 sum2の方は一見ムダがないですけど、意味的にはちょっと無理やりなのかもしれませんね・・・。(´・ω・`)
247 名前:デフォルトの名無しさん mailto:sage [2008/02/24(日) 19:26:50 ] F#がNTPに対応すれば問題なし。
248 名前:名無しさん♯ mailto:sage [2008/02/25(月) 14:49:13 ] Haskellにも移植してみますた。 import Data.Char import Data.List hiding (groupBy) -- MapReduce mapReduce :: (Ord k) => (a -> [(k, v)]) -> ((k, [v]) -> b) -> [a] -> [b] mapReduce m r = map r . orderBy fst . groupBy fst snd . concatMap m -- word count mapper :: (Int, String) -> [(String, Int)] mapper (_, v) = map (\s -> (map toLower s, 1)) . filter (not . null) $ split " ,.!?" v reducer :: (String, [Int]) -> (String, Int) reducer (k, v) = (k, sum v) -- test data_ = [ "What is this?", "This is a pen.", "Hello, World!", "All your base are belong to us" ] main = mapM_ p $ mapReduce mapper reducer $ zip (iterate (+1) 0) data_ where p (k, v) = putStrLn $ show k ++ "\t" ++ show v
249 名前:名無しさん♯ mailto:sage [2008/02/25(月) 14:50:11 ] -- utils orderBy :: (Ord k) => (a -> k) -> [a] -> [a] orderBy fk = sortBy (\x y -> fk x `compare` fk y) groupBy :: (Eq k) => (a -> k) -> (a -> v) -> [a] -> [(k, [v])] groupBy _ _ [] = [] groupBy fk fv l = let key = fk $ head l in let (g, rest) = partition (\x -> fk x == key) l in (key, map fv g) : groupBy fk fv rest split :: [Char] -> String -> [String] split sep s = case break (\c -> any (==c) sep) s of (v, []) -> [v] (v, h:t) -> v : split sep t
250 名前:名無しさん♯ mailto:sage [2008/02/25(月) 14:52:45 ] こうやって見ると、F#は.NETの資産を使える分、すごく楽だなあ・・・。(´・ω・`)
251 名前:名無しさん♯ mailto:sage [2008/02/25(月) 20:37:46 ] こだわる人はこだわる修正でつ。(´・ω・`) mapper :: (Int, String) -> [(String, Int)] mapper = map (\s -> (map toLower s, 1)) . filter (not . null) . split " ,.!?" . snd
252 名前:デフォルトの名無しさん mailto:age [2008/02/26(火) 20:27:17 ] やはは
253 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 07:36:31 ] >>247 NTP対応って何よ? これか >米国国家毒性プログラム(べいこくこっかどくせいプログラム、英: National Toxicology Program 、略称: NTP ) とはアメリカ保健社会福祉省が実施している化学物質の毒性研究をまとめ、発がん性物質の分類、試験を行う計画である。
254 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 08:01:10 ] 面白いと思って書き込んでるのがすごいよな
255 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 12:12:17 ] named template(?) parameter
256 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 14:34:54 ] むしろ名古屋トヨペット
257 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 09:58:07 ] 時間同期のプロトコルにきまっとるだろう
258 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 09:33:17 ] 自分のプログラムの中にF#のインタープリタを組み込みたいんですが可能ですか? 今のプログラムはC#で書いていて、その挙動の一部をカスタマイズできるように したいのですが、せっかく覚え始めたF#で書ければいいなぁと思っています。
259 名前:デフォルトの名無しさん mailto:sage [2008/03/20(木) 18:53:39 ] キーワードはCodeDOM。 あとは自分で調べろ>>258
260 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 15:38:29 ] Visual Studio持ってないとF#って使えないの? 一応インストールはできたんだけど、コマンド打ってくだけ。
261 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 17:43:18 ] VSShellがあれば使える。 あと、SharpDevelop 3.0で使えるようになる予定。Beta1で載った。
262 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 18:12:16 ] VSShellをDLしようと思って、Visual Studio 2008 SDK 1.0をDLしたんだけど Visual Studioがインストールされてないとだめみたいだ。VSShell単体って どこにあるの?てか、あるの?
263 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 18:13:53 ] あったわ。
264 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 19:12:55 ] ハローワールドできたわ。 で、いい本ないの?
265 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 19:15:17 ] www.amazon.com/Foundations-F-Experts-Voice-Net/dp/1590597575/ref=pd_bbs_sr_2?ie=UTF8&s=books&qid=1206698720&sr=1-2 Foundations of F# ネイティブが分かりにくいと酷評してるんだが、読んだ人どう?
266 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 19:40:56 ] 全部読んでないが、Expert F#のほうが分かりやすい。 内容も別にExpert向けというわけでもないし。高度な話題も載ってるが。
267 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 19:56:18 ] >>266 そうなんだ。 星の数のとおりか。 でも高いな。。
268 名前:デフォルトの名無しさん mailto:sage [2008/04/19(土) 10:36:13 ] すみません、WinAPI呼び出しわかる方いますか?やりたいこと→PeekMessage呼び出し [<DllImport("user32.dll", EntryPoint="PeekMessage" ,SetLastError=true,CallingConvention=CallingConvention.StdCall)>] let PeekMessage( (lpMsg : ref MSG),(hwnd : Int32),(wMsgFilterMin : Int32),(wMsgFilterMax : Int32),(wRemoveMsg : PeekMsgOption)):bool = failwith "extern";; エラーメッセージ The type 'MSG' is not defined. The type 'PeekMsgOption' is not defined. MSG構造体については 自分の環境(Win2k,VS2005,.Net framework 2.0.50727.42)ではwindowsbase.dllがないようなので これはXPかVistaを使えってことでしょうかね,.. msdn2.microsoft.com/ja-jp/library/system.windows.interop.msg.aspx また、PeekMsgOptionはオンラインのMSDNではほとんど情報がないようです そもそも、VS2005のF#プロジェクトでは「参照の追加」はできないのでしょうか?
269 名前:268 mailto:sage [2008/04/21(月) 00:39:32 ] ↓XPと.net framework3.0入れたらコンパイル通ったので、何かの参考までに。 open System.Runtime.InteropServices;; open System.Windows.Interop;; [<System.Flags>] type PeekMsgOption = | PM_NOREMOVE = 0 | PM_REMOVE = 1;; [<DllImport("user32.dll", EntryPoint="PeekMessage" ,SetLastError=true,CallingConvention=CallingConvention.StdCall)>] let PeekMessage( (lpMsg : (ref <System.Windows.Interop.MSG>)),(hwnd : Int32),(wMsgFilterMin : Int32),(wMsgFilterMax : Int32),(wRemoveMsg : PeekMsgOption)):bool = failwith "extern";;
270 名前:デフォルトの名無しさん mailto:sage [2008/04/21(月) 18:42:16 ] そりゃそうだ。 System.Windows以下(Forms除く)は.NET Framework 3.0からのWPF。 そこのURLの先にもはっきりとこうかいてあるはずだ。 バージョン情報 .NET Framework サポート対象 : 3.5、3.0 SP1、3.0 System.Windows.Forms.Messageなら2.0でも使える。 PeekMsgOptionについてさっぱり見つからないのは、 単にその2つの定数を宣言するためだけに即興で作ったからではないか? もともとはただの符号無整数型だし。 msdn2.microsoft.com/en-us/library/ms644943 (VS.85).aspx
271 名前:デフォルトの名無しさん mailto:sage [2008/04/22(火) 01:51:43 ] MSGとかの構造体を自力で実装しなくていいってことか? まじ.netとかそうなってるの? そもそも実行できたのかあやしいんだが
272 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 19:14:11 ] さらに追記 (lpMsg : (ref <System.Windows.Interop.MSG>)の箇所は (lpMsg :System.Windows.Interop.MSG)にしないと実行時にマーシャリング系のエラーが出る。 しかしどちらにせよ、デバッグモードで動かすと構造体のサイズ違うっていわれるから 自分でMSG構造体定義した。 ..けれど結局、やりたかったことは、Win32API使わなくてもできたよotz
273 名前:デフォルトの名無しさん mailto:sage [2008/05/02(金) 08:32:37 ] 1.9.4.15 リリース
274 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 23:26:43 ] >>171 OCaml, Haskell, Lispなどの関数型言語はラムダ計算という理論が骨組みにあって、 特別な構文を使わずに、柔軟なプログラミングをすることができる。 関数を抽象化するためのdelegateや、多相型を表現するためのgenericsなども、 特別な構文無しにプログラムできる。 しかも、キャストや、nullを使う言語よりも、実行時の安全性が高い。 関数型言語を知っている学生は、プログラミングの質に対する意識が非常に高いのが多い。 OCamlができる優秀な学生を雇って、F#のプロジェクトをやれば、いいんじゃね。
275 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 17:14:41 ] FizzBuzz 2.0 ですね。わかります。
276 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 17:35:07 ] >>274 学生 プッ
277 名前:デフォルトの名無しさん [2008/05/05(月) 01:32:22 ] こんにちは。 F#の開発環境って何があるんでしょうか? ・VS.NET拡張 ・エディタとコンパイラ 以外にはありませんか?
278 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 07:15:19 ] つ インタプリタ(fsi.exe)
279 名前:デフォルトの名無しさん [2008/05/05(月) 07:43:21 ] Expert F#のPDFを買ったお Expertというわりにぜんぜん入門から対応しているから、いいね。 しかし、600ページ以上あって読み応えありすぎだw
280 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 07:44:25 ] >>278 good! 補間や履歴も聞いていいですな。 しかしC-Aで行頭、C-Eで行末移動がほしかったな
281 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 08:06:22 ] ebook版ってあったのか。英語はわかりやすくてよいよね ただ、分厚いから俺は辞書的に使ってる >>280 つ fsi用のEmacsモード作ろうぜってスレッド。俺は試したことないけども参考までに ttp://cs.hubfs.net/forums/thread/4004.aspx
282 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 14:23:56 ] >>277 ttp://www.infoq.com/jp/news/2008/03/sharpdev-3-beta
283 名前:デフォルトの名無しさん [2008/05/11(日) 03:09:37 ] F#のライセンスについて、市販製品に使うときの注意事項を3行でplz
284 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 09:07:12 ] 知 ら ん
285 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 18:42:58 ] fslexってまだ日本語対応してないのな・・ ttp://www.strangelights.com/fsharp/wiki/default.aspx/FSharpWiki/fslex.html { open Microsoft.FSharp.Text.Printf;; } rule strtest = parse | _ { printf "%c" (Lexing.lexeme_char lexbuf 0); strtest lexbuf } | eof { raise End_of_file } { //こっから実行コード let test s = strtest (Lexing.from_string s);; try test "aiueo" with _ -> printf "\n--end--\n";; try test "あいうえお" with _ -> printf "\n--end--\n";; printf "あいうえお";; } 実行結果 aiueo --end-- ????? --end-- あいうえお
286 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 07:30:42 ] ふとおもったんだがLispの.NETなやつってある?
287 名前:デフォルトの名無しさん [2008/05/17(土) 09:49:01 ] >>286 List of CLI Languages - Wikipedia, the free encyclopedia en.wikipedia.org/wiki/List_of_CLI_Languages IronLisp, L#, DotLisp NemerleもLispを参考にしてるらしいな
288 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 10:33:20 ] 英語のwikiは凄いな P#とかA#とかあるw
289 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 11:03:43 ] これみてP#やってみたくなったw
290 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 11:54:21 ] ううむ,原理的には JVM でもいろいろできるんだろうけど, MSIL (っていうのか?)上での方がバリエーションが多いなぁ. これって一応MS的にはドッキリ大成功みたいな感じなのかね?
291 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 13:37:21 ] >>290 MSは.NET 1.0のSDKにLISPのコンパイラを付けてたくらいだから 最初から狙って取りに行ってたんだと思うよ。
292 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 20:56:32 ] MSはCOMでも多言語に凝っていたな。
293 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 22:29:12 ] >>245 そもそもこの例ではfold_leftを使って、 let sum = fold_left (+) 0 のようにできるのでは。(やぼですかそうですか) 末尾再帰のスタイルとしてはsum2の方がよい気がします。 >もともと引数は「入力、出力」の順で書いてたので。 関数型言語では、部分適用などができるから、この考え方はやめた方が。
294 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 02:19:35 ] 列挙型の扱いってよくわからないんですが誰か助けてください 今Visioのオートメーションのプログラム作ってて、以下の定数と msdn.microsoft.com/ja-jp/library/cc376719.aspx 以下のオブジェクトのTypeの値を比較する文が書きたいが msdn.microsoft.com/ja-jp/library/cc377211.aspx 型があわないと文句言われます 今の俺の認識 deprecated1:Idiomを使う deprecated2:Enum.combineを使う 今後:|||や&&&などのBitwise andやorを使う。最新版にコンパイラ変えたら、これつかえと警告でた 以下思いつく限り試してみたもの。全滅 if (obj.Type = Visio.VisShapeTypes.visTypeGuide) then ... if ((obj.Type &&& Visio.VisShapeTypes.visTypeGuide) <> 0) then ... if (obj.Type = (Visio.VisShapeTypes.visTypeGuide : int16)) then ... if (obj.Type = (Visio.VisShapeTypes.visTypeGuide :> int16)) then ... if (obj.Type = (Visio.VisShapeTypes.visTypeGuide :?> int16)) then ... if ((obj.Type:>int) = (Visio.VisShapeTypes.visTypeGuide :> int)) then ... msg (Microsoft.FSharp.Compatibility.OCaml.Obj.magic (s.Type.ToString())); (* これは数値5 *) msg (Microsoft.FSharp.Compatibility.OCaml.Obj.magic (Visio.VisShapeTypes.visTypeGuide.ToString())); (* これは文字列が出る *) (obj.magic ごにゃごにゃ).ToString()はエラーになります
295 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 08:25:16 ] OCamler な俺には 294 ってキモすぎてしょうがないんだが。 F# プログラムってこうなの?
296 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 09:33:50 ] パターンマッチングつかえってことかい?
297 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 10:31:35 ] いや、Obj.magic とか、キモい
298 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 13:13:10 ] 名前空間深すぎて読み辛すぎるな
299 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 01:17:34 ] Ocamlerってなんて読むの?おかむらー?
300 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 08:25:13 ] MinCamler? SML#ist?
301 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 10:44:49 ] >>299 オブジェクティブラクダ
302 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 14:26:15 ] OCaml 使いは 岡村 なのか・・・
303 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 17:59:55 ] だからOでオブジェクティブなんだよw Camlはフランス語でラクダ(キャメル)の意。 オブジェクティブキャメラー。
304 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 20:17:58 ] ラクダー
305 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 05:50:15 ] >Camlはフランス語でラクダ(キャメル)の意。 大嘘こいてんじゃねーよ
306 名前:デフォルトの名無しさん [2008/06/16(月) 08:30:41 ] C: Categorical A: Abstract M: Machine L: Language
307 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 14:44:39 ] >>305 低脳w
308 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 20:21:27 ] camlなんてフランス語ないよね 仮に camelのつもりだとしてもない
309 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 21:41:05 ] >>308 camlはフランス語にあるよw
310 名前:デフォルトの名無しさん mailto:sage [2008/06/16(月) 22:35:11 ] つまらん
311 名前:デフォルトの名無しさん [2008/06/16(月) 23:53:02 ] >>309 ない
312 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 01:28:22 ] >>311 学習用の辞書に載ってないからってw
313 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 01:46:38 ] CAML = Cargo Aircraft Minelayer
314 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 02:13:44 ] そいうや随分前にも全角wで書き込む阿呆がいたな 日本もそういう季節になったの?
315 名前:デフォルトの名無しさん [2008/06/17(火) 05:12:02 ] フォントをメイリオにしてから全角、半角の区別がつかない
316 名前:デフォルトの名無しさん mailto:sage [2008/06/17(火) 17:48:41 ] それだけMSゴシックが不メイリオだったってことか。
317 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 09:50:45 ] これってバグかな?マニュアルでは見つからない場合Not_found例外とあるが IndexOutOfBounds例外が出る 初心者なので判断がつかず・・ let msg s = System.Windows.Forms.MessageBox.Show s |> ignore in try let h = List.find ((<)100) [1..10] in printf "%A\r\n" h with e -> msg (e.ToString());;
318 名前:デフォルトの名無しさん mailto:sage [2008/06/27(金) 23:13:30 ] F#のことは知らんOCamlの人だけど、printfでこけてんじゃないの?
319 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 07:12:14 ] んー、以下のコードでも試してみたけど、やはりIndexOutOfBounds例外でます ライブラリよりは俺のコードがバグってると思うんで どっかしょぼい所でミスってるんじゃないかと思うが・・ let msg s = System.Windows.Forms.MessageBox.Show s |> ignore in try List.find ((<)100) [1..10] |> ignore with e -> msg (e.ToString());;
320 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 07:56:45 ] 手元のF# Version 1.9.4.17だと、>>317 で Not_found(System.Collections.Generic.KeyNotFoundException)例外が出るので コードに問題はないはず この例外は、.NET Framework version 2.0で追加されたものなので、 Microsoft .NET Framework Version 2.0 Redistributable Package を入れれば直るんじゃない?
321 名前:デフォルトの名無しさん mailto:sage [2008/06/28(土) 11:18:47 ] 検証ありがとうございます。 私の環境の問題のようですね F#のバージョンも1.9.3.14と少し古いので あわせてバージョンアップしてみますわ
322 名前:デフォルトの名無しさん [2008/06/29(日) 01:37:08 ] ちょwwまずはバージョン確認せいやw
323 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 21:03:36 ] >>317 Detailed Release Notes for F# 1.9.4 ttp://blogs.msdn.com/dsyme/archive/2008/05/02/full-release-notes-for-f-1-9-4.aspx > Not_found now maps to KeyNotFoundException not IndexOutOfRangeException.
324 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 20:09:07 ] F#はLinux上でも動きますか? コンパイルだけでもしたいのですが。。。
325 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 20:38:01 ] >>324 zipを展開すると install-mono.sh が入っているからこれで動くんじゃないのかね。
326 名前:デフォルトの名無しさん [2008/07/10(木) 01:28:11 ] InfoQ: F#の土台を越えて - 非同期ワークフロー www.infoq.com/jp/articles/pickering-fsharp-async
327 名前:デフォルトの名無しさん mailto:sage [2008/07/15(火) 12:14:54 ] ttp://blogs.msdn.com/dsyme/archive/2008/07/14/1-9-4-19-release.aspx 1.9.4.19 release
328 名前:デフォルトの名無しさん [2008/08/30(土) 07:27:00 ] Microsoft F#, September 2008 Community Technology Preview ttp://www.microsoft.com/downloads/details.aspx?FamilyID=61ad6924-93ad-48dc-8c67-60f7e7803d3c&DisplayLang=en 言語仕様からライブラリ構成まで、だいぶ変わったな
329 名前:デフォルトの名無しさん mailto:sage [2008/08/30(土) 11:05:27 ] 非同期ワークフローとか、ParallelExtention,Scopeとかがどうかぶってどう統合されるのかがよくわからん(´・ω・`)
330 名前:デフォルトの名無しさん mailto:sage [2008/08/30(土) 12:49:52 ] 知ってる言葉を並べてるだけだろ
331 名前:デフォルトの名無しさん [2008/08/30(土) 14:29:36 ] >>330 ぷっ 理解できないからって・・・w
332 名前:デフォルトの名無しさん mailto:sage [2008/08/30(土) 18:29:51 ] >>330 ぷっ 理解できないからって・・・w
333 名前:デフォルトの名無しさん mailto:sage [2008/08/30(土) 21:27:29 ] >>330 理解できないからぶってぶって・・・w
334 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 18:01:34 ] >>333 は?
335 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 18:06:01 ] >>333 は?
336 名前:デフォルトの名無しさん mailto:sage [2008/08/31(日) 18:14:01 ] >>333 は?
337 名前:デフォルトの名無しさん mailto:sage [2008/09/01(月) 00:19:39 ] 俺もぶってほしい(*´∀`*)
338 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 01:30:34 ] Detailed Release Notes for the F# September 2008 CTP release blogs.msdn.com/dsyme/archive/2008/08/29/detailed-release-notes-for-the-f-september-2008-ctp-release.aspx Microsoft F#, September 2008 Community Technology Preview www.microsoft.com/downloads/details.aspx?familyid=61ad6924-93ad-48dc-8c67-60f7e7803d3c&displaylang=en&tm F# 1.9.6.2
339 名前:デフォルトの名無しさん mailto:sage [2008/09/08(月) 13:19:45 ] ブログネタとかでもだんだん見るようになってきたけど、 OCaml派生として使ってるやつばっかりだな OCaml知らない俺から見るとなんかぜんぜんF#っぽくないし、 そっち系は面白くならないと思うが。 .NETライブラリ使ってるやつとかあんまいないのかね
340 名前:デフォルトの名無しさん mailto:sage [2008/09/08(月) 20:26:38 ] >>339 windows上の設置が簡単なocamlって扱いだからでないか? 人に渡すにしてもランタイムいらんし。
341 名前:デフォルトの名無しさん [2008/09/11(木) 11:17:55 ] CTPになって2008しかインストール出来なくなったのはいいけど、 前からあったサンプルプログラムがコンパイルできないよ。 CTP用のサンプルはDirectX関係がコンパイル出来ないし、 スレッド周りとか勉強したいんだけどなぁ。
342 名前:デフォルトの名無しさん mailto:sage [2008/09/19(金) 15:40:17 ] .netライブラリなんて他と同じように使えばいいだろ
343 名前:デフォルトの名無しさん mailto:sage [2008/09/22(月) 23:34:56 ] こうですか?わかりません をVB.NET風に書こうと思ったけどめんどくさかったのでやめた
344 名前:デフォルトの名無しさん mailto:sage [2008/09/24(水) 21:44:32 ] #useってデバッグ用途とかでかなり便利だったのにな。 #loadじゃ関数とかアクセスできないし、 再起動してfsi --useも起動の時間がかかりすぎて代わりにならない。 復活してくれんかな。
345 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 13:14:30 ] .Net使ってるとWin32APIが使いたい場面が多々出てくるが 細かいところでわからんことが多い C#⇔F#コード対応表みたいなのがほしいわ フック書きてぇ
346 名前:デフォルトの名無しさん [2008/10/13(月) 09:33:20 ] F#で学ぶ関数型プログラミング入門 「関数型プログラミングの主な概念とF#での利用例」 codezine.jp/article/detail/3041
347 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 15:13:21 ] >>345 P/Invoke宣言だけはC#で書いてしまえばいいんでない?
348 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 16:01:48 ] ↓こんなのがC#側で定義出来るってこと? [<DllImport("user32.dll",EntryPoint="SetWindowsHookEx",SetLastError=true)>] let ... (たぶんdelegateキーワード使う)HOOKPROCの型がわからないので 実際そこでも詰まってるんだが、それがわかったとしても SetHookの返り値をIntPtr.Zeroとどうやって比較するのかとか わからない箇所あって、若干諦めてる ところでF#にはいわゆるbreakやcontinueはないんですかね for文の中でreturnするケースは手続き型の既存資産には多いと思うが F#に移植しようと思ったら再帰等でロジックを考え直す必要があるとすると 作業コストが高い break,last,return,continueなんかで言語仕様検索しても それらしいのは見つからんね
349 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 16:12:45 ] 自己レス。残念だけどなさそうだわ ttp://cs.hubfs.net/forums/thread/7118.aspx
350 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 19:17:02 ] >>348 移植コストを下げることに意味はない カエレ
351 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 19:27:22 ] アローつくれば、順次処理、条件分岐、繰り返しができるお
352 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 19:43:07 ] >>350 なぜ
353 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 09:33:33 ] 逆に、何でソースコードレベルで移植しようとか思うんだ? 対象環境に言語処理系が無いとかなら分かるけど、.NETだぞ? 普通、DLL作ってFFI経由で呼び出しするだろ。 なんだか、同じ言語で書くことにこだわりすぎてる気がするけど。
354 名前:デフォルトの名無しさん [2008/10/14(火) 22:37:30 ] >>345 そんな単純な置き換えができるのはVB⇔C#とかだけだろ F#は関数型言語で全然違うから、考えを変える必要があるかもしれない むしろC#とF#のコードの一対一対応表がつくれるくらい似てる言語なら、F#いらねーだろ。
355 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 22:44:09 ] そんなたいそうな理由があるわけじゃなくて、 単に楽したいと思ったんだが、気に障ったならすまない
356 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 09:36:44 ] >>355 関数型言語によるプログラミングスタイルの一種に breakやcontinueを使わずに制御構造をくっつけていくという一派がある。 それを調べてみると面白いと思うよ。 listモナドとかmaybeモナドとか>>351 の言ってるarrowとか。 ttp://d.hatena.ne.jp/r-west/20070720/1184946510 慣れるとむしろbreakやcontinueイラネになる。
357 名前:デフォルトの名無しさん [2008/10/15(水) 14:47:07 ] もしかして、今の新しいバージョンのF#って2008製品版もってないと 入れられなくないですか・・・?('A`) >>356 ほー、参考になる
358 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 17:36:17 ] 前のバージョンなら Express でも入れられたの? プラグインとか機能追加系は製品版じゃなきゃ基本無理。
359 名前:デフォルトの名無しさん mailto:sage [2008/10/15(水) 22:56:25 ] よく調べもせず臆面なくそんなレスを…
360 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 20:30:58 ] そのための2ch
361 名前:デフォルトの名無しさん mailto:sage [2008/10/16(木) 22:05:54 ] 356見て、出来たらF#でarrowを表現してみたいと思ったがさっぱりだ 関数a->bを渡すとarr a bが出来て、 arr a bの型に対する操作が色々あるんだろうと思うんだが arr a bの型に当たる物はf#ではどう表現すれば良いのか 'a 'b tみたいに複数のジェネリックな型を持つことになる? もしかしてHaskellのほうが抽象度が高いことができる?
362 名前:デフォルトの名無しさん [2008/10/16(木) 22:07:12 ] >>358 2008はもってないんだよね・・・うpでとするいい機会だ
363 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 07:35:28 ] >>361 higher kind genericsというやつで、F#の型システムでは再現は無理ぽ。(´・ω・`) F#もどきで書くと、こんな感じのものが必要。 Arrow<'arr<'a, 'b>>
364 名前:デフォルトの名無しさん mailto:sage [2008/10/17(金) 19:13:35 ] なるほど、非常に参考になった。 Haskellは進んでるな
365 名前:デフォルトの名無しさん mailto:sage [2008/10/18(土) 10:44:02 ] >>357 , >>358 , >>362 Visual Studio 2008 Shell (integrated mode) Service Pack 1 www.microsoft.com/downloads/details.aspx?FamilyID=2e9a8c35-eb3d-43eb-9122-a5ec195cd7bb&DisplayLang=ja
366 名前:デフォルトの名無しさん [2008/10/18(土) 16:24:25 ] >>365 Thanx。shell runtime入れりゃよかったのね
367 名前:デフォルトの名無しさん mailto:sage [2008/11/01(土) 12:44:35 ] 手続き型べったりの人間には (|>) を多用すると評価順序がわからなくなって混乱するんだぜ >>123 とか let _ = List.iter ((|>) ()) (List.map ((delay >> flip) (printf "closure %d\n" )) [1..10]) とかけば (unit -> unit) unit が10回ってわかるんだが…
368 名前:デフォルトの名無しさん mailto:sage [2008/11/03(月) 11:54:03 ] これでいいんじゃね? Seq.iter (fun n -> printf "closure %d\n" n) [1..10]
369 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 22:41:18 ] 素人です。Expert F#読んでてわからないことがあったので質問 type Attempt<'a> = unit -> 'a option let runAttempt (a:Attempt<'a>) = () |> a type AttemptBuilder() = member b.Return(x) = fun () -> Some x member b.Bind(p, rest) = match runAttempt p with None -> (fun () -> None) | Some x -> rest x member b.Let(p, rest) = rest p let attempt = new AttemptBuilder() let failIfBig n = attempt { if n>1000 then return! (fun () -> None) else return n } とあったとき、これ↓を de-sugar しろって問題なんだけど、 let sumIfBothSmall (i1, i2) = attempt { let sum = ref 0 let! n1 = failIfBig i1 do sum := sum.Value+n1 let! n2 = failIfBig i2 do sum := sum.Value+n2 return sum.Value } これ↓であってるかな? let sumIfBothSmall2 (i1, i2) = attempt.Let(ref 0, (fun sum -> attempt.Bind(failIfBig i1, (fun n1 -> attempt.Bind(attempt.Return(sum := sum.Value+n1), (fun () -> attempt.Bind(failIfBig i2, (fun n2 -> attempt.Bind(attempt.Return(sum := sum.Value+n2), (fun () -> attempt.Return sum.Value)))))))))) 見づらくて申し訳ない…
370 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 23:15:20 ] こうじゃない? let sumIfBothSmall2 (i1, i2) = attempt.Let(ref 0, (fun sum -> attempt.Bind(failIfBig i1, (fun n1 -> attempt.Let(sum := sum.Value+n1, (fun () -> attempt.Bind(failIfBig i2, (fun n2 -> attempt.Let(sum := sum.Value+n2, (fun () -> attempt.Return(sum.Value))))))))))) ここ見る限り blogs.msdn.com/dsyme/archive/2007/09/22/some-details-on-f-computation-expressions-aka-monadic-or-workflow-syntax.aspx
371 名前:369 mailto:sage [2008/11/15(土) 21:52:50 ] あーunit -> 'a option のコンテナってことか ようやく理解できたような ありがとう
372 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 10:37:08 ] C++のvectorみたいなコンテナってある? Microsoft.FSharp.Collections.ResizeArrayがそうかと思ったら、 Note: an abbreviation for List<'a>て書いてあたよ
373 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 12:58:16 ] ResizeArray でいいんじゃないのん? Microsoft.FSharp.Collections.List<'a> と System.Collections.Generic.List<'a> は別物 ttp://research.microsoft.com/fsharp/manual/FSharp.Core/Microsoft.FSharp.Collections.html
374 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 09:16:40 ] ああ、Listって名前だから勘違いしたけどインデックスアクセスはO(1)なんだな
375 名前:デフォルトの名無しさん mailto:sage [2008/11/29(土) 21:53:44 ] System.Windows.Forms.dllを参照したいんですが、.NETのVersion3.5には見つかりませんでした。 フォームを表示するアプリケーションを作る場合、現状では.NET Version2のSystem.Windows.Forms.dll を参照するしかないんでしょうか?
376 名前:375 mailto:sage [2008/11/29(土) 22:24:55 ] 自己解決しました。 アセンブリ System.Windows.Forms .NET Framework 3.5, .NET Framework 3.0, .NET Framework 2.0 のメンバ C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Windows.Forms.dll と書いてあったので、今の設定で良さそうです。
377 名前:デフォルトの名無しさん [2008/12/05(金) 18:55:21 ] 今、日本がピンチです。 messages.yahoo.co.jp/bbs?.mm=GN&action=5&board=552022058&tid=cf9qa4nhbfffca5ga5b&sid=552022058&mid=83344 sora1975.blog88.fc2.com/blog-entry-144.html リンク先を見て危機を感じるなら、コピペを貼ってください。
378 名前:デフォルトの名無しさん [2008/12/11(木) 20:42:09 ] Foundation of F#の92ページのサンプルってビルド失敗しないか? IEnumerable.iterで怒られる。iterなんてねーよって。
379 名前:デフォルトの名無しさん [2008/12/11(木) 20:46:53 ] Seqにしたら動いた。。
380 名前:デフォルトの名無しさん [2008/12/12(金) 19:54:50 ] F#の時代がクル━━━━━━(゚∀゚)━━━━━━ !! 正式発表:Visual Studio 2010がF#でシップ予定 - InfoQ www.infoq.com/jp/news/2008/12/FSharp-Release
381 名前:デフォルトの名無しさん [2008/12/12(金) 20:01:17 ] WindowsではC++は消え行く運命か?
382 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 20:23:12 ] 何でそう思ったのか知らんけど、当面は残るから心配する必要は無い。 まぁでも、Windows向けに開発するなら.NETにも触れといた方がいいとは思う。
383 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 21:48:11 ] >>380 機能プログラミングって・・・w
384 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 22:14:33 ] F#はOCamlのコード書くために使うわ
385 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 10:57:24 ] >J#と全く同様の方法で、 ざわ… ざわ…
386 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 00:41:54 ] >>384 let 〜 andができないのこまらね?
387 名前:デフォルトの名無しさん [2008/12/27(土) 06:37:35 ] 今後MFC使う場面ってあるの?
388 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 12:34:30 ] 質問です。 ExpertF#に以下のクラス定義があります。 type Vector2D(dx: float, dy: float) = let len = sqrt(dx * dx + dy * dy) member v.DX = dx member v.DY = dy member v.Length = len member v.Scale(k) = Vector2D(k*dx, k*dy) member v.ShiftX(x) = Vector2D(dx=x+dx, dy=dy) (* @ *) member v.ShiftY(y) = Vector2D(dx=dx, dy=y+dy) (* A *) @とAのところで引数を指定するのにdx=x+dxのようにしてい ますが普通にx+dxではいけないのでしょうか?こちらでも 同じように動作しました。dx=x+dxの方法には他に意味が あるのでしょうか?
389 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 13:28:37 ] 名前指定してるから引数の順番入れ替えても許されるとかそういう利便性の話では
390 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 14:29:25 ] >>389 レスどうもです。 やってみました。確かにそういう利便性がありました。 ありがとうございました。
391 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 18:52:50 ] >>380 VSでは単独での使用が想定されてないとか アプリケーションのコアを構築するためとか どういう意味なのかね。想定場面がよくわからん だいたいC#VBからF#の関数呼ぶのも一苦労なんだけど。 VSなしじゃ使い物にならなくなるってことかな CLR上のLL的ポジションでいて欲しかったんだけどなあ
392 名前:デフォルトの名無しさん mailto:sage [2008/12/28(日) 22:58:56 ] >>391 F# にはデザイナ ツールが含まれない。 つまり、WinForm やら ASP.NET Page やらをポトペタで開発できない。 ついでにいえば型付きデータ セットも、やるならコードごりごり書くしかない。 やるならやればいいけど。やりたい?それ?やりたくないよね? じゃそういう部分は C#/VB.NET に任せて、他のコアな部分を F# で書くといいよ。 の意。 >>386 ふつうに書けるけど。なんか別の意味か? let rec even n = if n = 0 then true else odd (n - 1) and odd n = if n = 0 then false else even (n - 1)
393 名前:デフォルトの名無しさん mailto:sage [2008/12/29(月) 07:09:17 ] >>392 ペタペタできないのか じゃあ覚える意味あんまりないか
394 名前:392 mailto:sage [2008/12/29(月) 21:39:23 ] あー。 念のため言っとくと「F# にはデザイナ ツールが含まれない」てのは VS2010 での話ね。 その次の VS とか、あるいは SP とかで、いずれは提供されるようになるものと思われ。 まあ、だとしても何年後だよって話だが。
395 名前:デフォルトの名無しさん mailto:sage [2008/12/29(月) 21:48:45 ] その次の VS とか、あるいは SP とかで、F#がなくなる可能性・・・
396 名前:デフォルトの名無しさん mailto:sage [2008/12/30(火) 00:05:38 ] .net自体物凄い歴史浅いのに、普遍化しとるねぇ
397 名前:デフォルトの名無しさん mailto:sage [2008/12/30(火) 01:21:32 ] >>393 ごめんこれ釣りなのかどうかわからなくなってきたw
398 名前:デフォルトの名無しさん mailto:sage [2008/12/30(火) 01:39:42 ] F#って型推論のせいでVSのインテリセンスの恩恵とかほとんどなさそうだな
399 名前:デフォルトの名無しさん mailto:sage [2008/12/30(火) 01:40:25 ] >>392 ごめんこれ釣りなのかどうかわからなくなってきたw
400 名前:デフォルトの名無しさん mailto:sage [2008/12/30(火) 02:53:51 ] >>392 普通にかけないんだけどなにが普通なんだ? let x = 2 and y = 1;; どういう仕様なんだと思ったけどandの前に改行がいるんだな
401 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 21:03:52 ] 天才ども教えてくれ let f a b c = match a, b, c with | Some a, Some b, Some c -> Some (a, b, c) | _ -> None と定義して、以下を実行すると value restriction と言われて結果が None に ならない。 f (Some 3) None (Some 1.5) 分かる人いる? そもそもvalue restrictionとは何なのか。
402 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 22:53:07 ] >>401 天才じゃないが答えてみる 関数 f の型は val f : 'a option -> 'b option -> 'c option -> ('a * 'b * 'c) option になるわけだけど f (Some 3) None (Some 1.5) という式を評価しても 'b の型は最後まで確定しないわな それはよろしくない(→というのが超大雑把な value restriction の説明) つまり 'b の型を明らかにすれば error を消せる 簡単には適当な型注釈をつけてやれば OK で f (Some 3) (None : int) (Some 1.5) とか、あるいは (f (Some 3) None (Some 1.5) : (int * int * float) option) とかすればよい しかし通常は文脈から 'b が具体的な型に決まることが多い if true then f (Some 3) None (Some 1.5) else f None (Some 1) None だもんで型注釈に頼るような場面は少ないように思われる
403 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 03:16:50 ] >>402 なるほど。理解できた。 (None : int)は(None : int option)の誤記だと 思うけど後者でうまくいった。全体に型注釈 をつけても良いんだね。thx。
404 名前:デフォルトの名無しさん [2009/01/17(土) 14:45:28 ] age
405 名前:デフォルトの名無しさん [2009/01/23(金) 17:21:26 ] もうだめぽ
406 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 17:52:20 ] とりあえず、Ocamlの開発環境について教えてください。 ライブラリの管理などを含めてノウハウを教えてください。 エディタはこれを使えとか、コンパイルするときはこうしろとか、成果物を配布するときはこうしろとか、 そういう諸々のプログラミング周辺の雑務について知りたいです。
407 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 22:54:46 ] 関数型が難しいとかわからんとか言ってるヤツってなんなの? けっこう他の言語はバリバリ使いこなしてるヤツに限ってそういうこと言う なんかコードも書いてないのにわかんね言ってるように見えるんだけど Web でかるーく拾いあさった断片的な知識並べてわかんない言われてもねえ ほなたとえば OOP べんきょーするときもそんなやり方でやったんかと 『やさしい Java』読んだだけで Java できますゆー人間信用すんのかと 実践皆無の人間が OOP 知ってますゆーのを見てなんとも思わんのかと もうね、自分の知らん新しいテクノロジ排除したいだけのオッサンちゃうんかと プログラマ名乗るんならまずやってみろよと 知りたいのなら知る努力をしてみせろよと その上でどこがどーゆー風にわからんのか言えと
408 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 22:57:09 ] 難易度はともかく関数型は実用性が低いから困るんだよ
409 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 22:57:51 ] F# イラネ C# でイイじゃんゆうヤツには 精々逃げ切れるようにがんばれよと言っておきたい
410 名前:デフォルトの名無しさん mailto:sage [2009/01/31(土) 23:08:58 ] >>408 言いたいことはわからないでもない でも F# に限っていうなら使い分ければいいんでないの? 関数型と命令型と OOP と
411 名前:デフォルトの名無しさん mailto:sage [2009/02/01(日) 13:50:33 ] アルゴリズムらしいアルゴリズムを自分で考えて(選択して)実装することなく、 APIを順に呼んでエラーチェックだけするようなプログラムばっか 書いている(書かされている)人には、勉強しようというモチベーションなど 湧かんだろうなー。
412 名前:デフォルトの名無しさん mailto:sage [2009/02/01(日) 22:26:24 ] やぁ、関数型言語っぽいノリになってきましたね
413 名前:デフォルトの名無しさん mailto:sage [2009/02/01(日) 23:08:23 ] >>411 職業プログラマの多くがそれに該当するのではないかと想像するが それが仕事なんだから許してやってくれ 職業プログラマの世界では、そもそも「車輪の再生産」は悪とされている 自分でコードを書かなければ工数が減るしバグをつくりこむ機会もなくなるからな
414 名前:デフォルトの名無しさん mailto:sage [2009/02/01(日) 23:09:59 ] うちのところはよく使うものも全然共通化してくれないんだけど・・・
415 名前:デフォルトの名無しさん mailto:sage [2009/02/01(日) 23:28:05 ] 世の中の「プログラマ」と名乗る人の結構な割合は関数型言語はおろか、 自力でtreeのトラバース程度もやる必要に迫られたことも無く、 2分探査のコードを書けと言われてバグ無く書けないこと位、みんな判ってるさ。 そして、F#を勉強する俺出世確実、とか思ってるやつもきっといない。
416 名前:デフォルトの名無しさん mailto:sage [2009/02/02(月) 00:08:16 ] 自分でアルゴリズムを考えるのが楽しいんだよ。それはもちろん。 でも他人がもう作っちゃったプログラムを同じように作ったってしょうがないだろ。 その労力を新しいものを作る事に傾けたほうが効率的だし、 自分が作るということは作ったものに責任を取るということなんだから、 そんな余計な事まで首突っ込んで余計な責任を取ることも無いだろ。
417 名前:デフォルトの名無しさん mailto:sage [2009/02/02(月) 00:27:17 ] コレクションになんか突っ込んダリするだけですめばいいが、そこに永続化とか色んなフィーチャーを盛り込もうとすれば何処かの段階で全てを自分で作った方がきれいにまとまる段階が来ると思うがどうよ。 もちろん既存のオープンソースなどを使った方がいいのもわかるが、その仕様を自分の要望に合わせる時に無理があることも多いから。 自分で作るのも追っついてるうちはいいが本当に全てを作るわけにもいかずどこまで突き詰め、どこで妥協するのか考える毎日だが。
418 名前:デフォルトの名無しさん mailto:sage [2009/02/02(月) 22:11:53 ] そうなんだよなー 出来合いの API とかじゃ "想定された使い方" しかできん罠 なんかインジェクションしたいってなったらもう自分で組むっきゃないわけで そんなときにクラスじゃ粒度がデカすぎるって場合も多いんだよね はばからずに高階のノリでイケるってホント楽(柔軟)でいい
419 名前:デフォルトの名無しさん mailto:sage [2009/02/03(火) 00:09:39 ] >>413 > 職業プログラマの世界では、そもそも「車輪の再生産」は悪とされている むしろどんどん再生産して儲けてくださいそれが職業プログラマの本分です
420 名前:デフォルトの名無しさん mailto:sage [2009/02/03(火) 01:16:29 ] 再生産で儲けるのは三流 俺 一流だから そんなこと しない
421 名前:デフォルトの名無しさん mailto:sage [2009/02/03(火) 03:02:26 ] >>420 「再生産」で儲けることのなにが三流なのか、答えてもらおうじゃないかw
422 名前:デフォルトの名無しさん mailto:sage [2009/02/03(火) 12:02:30 ] 儲けて旨い飯が食えりゃどっちでもいいじゃないか。
423 名前:デフォルトの名無しさん mailto:sage [2009/02/03(火) 12:13:33 ] 一流は金に困ってなんかいないから、儲けることなんか二の次に考えて新しいことを追い続けられる。
424 名前:デフォルトの名無しさん mailto:sage [2009/02/03(火) 12:34:51 ] 何で一流の奴がこんなとこで一流だの三流だのしょうもない議論やってんだよw 俺にできないような、新しい事を追い続けてくれよww 続きはマ板で
425 名前:デフォルトの名無しさん mailto:sage [2009/02/03(火) 21:09:42 ] >>419 は皮肉 ×車輪の再生産 ○車輪の再発明
426 名前:デフォルトの名無しさん mailto:sage [2009/02/07(土) 11:05:47 ] 糞スレ
427 名前:デフォルトの名無しさん mailto:sage [2009/02/07(土) 23:47:23 ] 関数を表す型を定義して、定数関数を定義しようとしたのですが 型からは関数とわかっていても、関数のようには呼び出せませんでした。 以下のようなことを実現するのは難しいのでしょうか? type FUNC<'arg1,'result> = F of ('arg1 -> 'result);; F ((+)1);; //使用例1 F (+);; //使用例2 //ここでエラー let apply1 (f:FUNC<int,int>) = f 1;; //apply1 ((+)1)、などとしたい 欲を言えば、FUNC型からarg1やresultの型を取り出すような プログラムも書きたい・・
428 名前:デフォルトの名無しさん mailto:sage [2009/02/08(日) 00:47:21 ] 型と関数を混同してるような というか、なんかいろいろ勘違いしてそうに見える > apply1 ((+)1)、などとしたい で、一体なにをしたいの?その式を評価して得るものはなに? まずはその式の「型」を教えてくれないとなんともアドバイスできない いちおーエスパーしとくとこんなんか? let apply1 f x = f x let f = apply1 ((+) 1) f 2 // val it : int = 3 もしなにか Union Types を使わにゃならんような 理由があるんだったなら教えてほしい
429 名前:デフォルトの名無しさん mailto:sage [2009/02/08(日) 02:00:06 ] ご回答ありがとうございます。 おっしゃるとおり、自分でもたぶん型と関数の違いがあまりわかってないと思います^^; 上の質問をした経緯です 最終的にやりたいことは、let recを用いずにYコンビネータを書きたい しかし、F#では、次のような呼び出しは型情報が∞ループして決定できない let fact self n = if n=1 then 1 else n * ((self self) (n-1)) in fact fact 10;; そこで、まずは、再帰的なデータ型を定義して用い、上記のような呼び出しを通るようにしたい (再帰的に'aを'a->'bに置き換えるような型) しかし、再帰的なデータ型とか、あまりプログラミング経験がないので 型情報を扱うプログラムからまず取り組むことにしたが、つまづいた、とう状況です 上のプログラムですが、次のようにするとコンパイルは通ります。 let apply1 f:FUNC<int,int> = f 1;; val apply1 : (int -> FUNC<int,int>) -> FUNC<int,int> しかし、自分が求めた型は val apply1 : FUNC<int,int> -> int なのですが、なぜこうなるのかはさっぱりわかってません
430 名前:デフォルトの名無しさん mailto:sage [2009/02/08(日) 08:51:24 ] MLでYコンビネータを書く話なら、↓の最後にコードが載ってる 私には内容がさっぱり理解できないので、参考になるかどうかは分からんが ttp://www.kurims.kyoto-u.ac.jp/~hassei/selfref2006.pdf
431 名前:デフォルトの名無しさん mailto:sage [2009/02/08(日) 09:55:54 ] >>427 は、↓にすればコンパイルが通るぞ let apply1 = function (F f) -> f 1;;
432 名前:デフォルトの名無しさん mailto:sage [2009/02/08(日) 11:15:40 ] あっと、別にfunction使う必要はなかった let apply1 (F f) = f 1;;
433 名前:デフォルトの名無しさん mailto:sage [2009/02/08(日) 13:03:49 ] >>430 ,431 ありがとう。とても参考になりました。 let recは言語組み込みのYコンビネータみたいなもんらしいですね 無事できあがったYコンビネータ type X = Psi_inv of (X -> (int -> int));; let psi (Psi_inv f) = f;; let Y g = let h y = g(fun x -> (((psi y) y) x)) in h(Psi_inv(h));; (Y (fun f x -> if x=0 then 1 else x * f(x - 1))) 10;; しかし、単純にF#に翻訳しただけなので 理解したとは言い難い・・
434 名前:デフォルトの名無しさん mailto:sage [2009/02/08(日) 18:21:09 ] この流れなら書ける type fix<'a, 'b> = Fix of (fix<'a, 'b> -> ('a -> 'b)) let y f = (fun (Fix g as h) x -> f (g h) x) (Fix (fun (Fix g as h) x -> f (g h) x)) y (fun f x -> if x = 1 then 1 else x * f (x-1)) 5 // val it : int = 120 [1..10] |> List.map (y (fun f x -> if x <= 2 then 1 else f (x-1) + f (x-2))) // val it : int list = [1; 1; 2; 3; 5; 8; 13; 21; 34; 55]
435 名前:デフォルトの名無しさん mailto:sage [2009/02/08(日) 20:43:02 ] 同じ結論にたどり着いた type Rec<'a,'b> = R of (Rec<'a,'b> -> ('a -> 'b));; //version1 let y f = let ymaker (R proc) = f(fun arg -> (proc (R proc)) arg) in ymaker (R ymaker);; //version1 extract let y f = (fun (R proc) -> f(fun arg -> (proc (R proc)) arg)) (R (fun (R proc) -> f(fun arg -> (proc (R proc)) arg)) );; //version 2 let R_inv (R f) = f;; let y f = let ymaker proc = f(fun arg -> (((R_inv proc) proc) arg)) in ymaker (R ymaker);; //version 2 extract let y f = (fun proc -> f(fun arg -> (((R_inv proc) proc) arg))) (R (fun proc -> f(fun arg -> (((R_inv proc) proc) arg))) );;
436 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 07:30:35 ] Programming F#: Rough Cuts Version By Chris Smith Rough Cuts Release: February 2009 Print Book Release: October 2009 Pages: 504 俺、この本が出たらF#はじめるんだ・・・
437 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 02:31:18 ] のーみそが関数型に染まってくると 「左辺値」「右辺値」という言葉に 妙な違和感を覚えだす そもそもそんな観念がないというか あえて言うなら左辺に値などない てなことを妄想してみたけどどうよ?
438 名前:デフォルトの名無しさん [2009/02/11(水) 04:31:13 ] >>437 概念じゃねーの?
439 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 08:56:56 ] >>434-435 lazyに考えれば、もっとシンプルに書けるんじゃね(´・ω・`)? let rec fix (f : Lazy<_>) = f.Force() (lazy fix f) let fact = fix <| lazy fun f x -> if x = 0 then 1 else x * f.Force() (x - 1) do fact 5 |> printfn "%d"
440 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 09:01:08 ] >>437 「let x = 1」 これは等式とは思わない方が自然じゃないだろうか。 もともとは数学の論文とかでよく出てくる 「Let x := 1.(xを1と置く。)」とかいう表記を構文にしただけなんじゃないかと想像する。 等式じゃないなら、左辺、右辺とかいう観念はない。
441 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 09:18:39 ] おまえら頭いい サイコーだ
442 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 12:21:03 ] >>439 >>429 をよく見ろ > 最終的にやりたいことは、let recを用いずにYコンビネータを書きたい
443 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 12:55:37 ] ついでに、let rec 使用可なら lazy を使う必要すらない let rec fix f x = f (fix f) x let fact = fix <| fun f x -> if x = 0 then 1 else x * f (x - 1)
444 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 13:39:14 ] >>443 > let rec fix f x = f (fix f) x あー、そっか。x つければ落ちないんだ。(´・ω・`) let rec fix f = f (fix f) と書いて、StackOverflowになってたのでlazyにしてた。
445 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 13:47:41 ] x はラムダ的に冗長に見えるけど、型推論の重要な手がかりになってるということか。 > let rec fix f = f (fix f);; val fix : ('a -> 'a) -> 'a > let rec fix f x = f (fix f) x;; val fix : (('a -> 'b) -> 'a -> 'b) -> 'a -> 'b
446 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 14:01:31 ] そのあたりのことってProgramming in OCamlに書いてある 正格評価がどうのこうので。 試してないが、確かこれでもいけたはず let rec y f = f (fun x -> y f x);; fun arg -> (proc (R proc)) argの箇所を (proc (R proc))としないのも同じ理由だと思う とりあえずfunで包めばOK,みたいな
447 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 14:31:19 ] 結局、再帰型を使うようにしたら、結論はほとんど同じだった。(´・ω・`) type Fix<'a, 'b> = Fix of (Fix<'a, 'b> -> 'a -> 'b) let run_fix (Fix f) = f let ycomb f = let g proc = f (fun arg -> run_fix proc proc arg) in g (Fix g) let fact = ycomb <| fun f n -> if n = 0 then 1 else n * f (n - 1)
448 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 14:42:02 ] >>438 正直、「観念」と「概念」の違いがわからんで調べてきた どちらも「モノコトに対する意識・考え」だが… * 観念 英語でいう idea の意味に近い オレオレ解釈的(主観的) 故に観念は多様である * 概念 英語でいう concept の意味に近い ふつうはみんなそう解釈するよねー的(客観的) 故に概念は一様である という違いがあるようだ。 左辺値、右辺値という考え方は、一般に共通の理解を得ている もの(通念)であり、それらは「概念」と呼ぶのが相応しい ということかな?
449 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 14:45:18 ] >>448 まあニュアンスが伝わればいいんじゃね?
450 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 07:21:21 ] >>445 冗長なんじゃなくて、正格評価の世界では意味が全く別のものになる。 let rec fix = fun f -> f (fix f) let rec fix = fun f -> fun x -> f (fix f) x 後者では x が遅延の役割をしてくれる。 Haskellのような遅延評価の世界では、確かに冗長なだけ。
451 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 07:31:11 ] f そのものを遅延化してしまう(>>439 )のと、 引数 x を追加して遅延の役割をしてもらう(>>443 )のと、 どちらがコードの見た目的にやさしいかは明らか。w
452 名前:デフォルトの名無しさん mailto:sage [2009/02/13(金) 07:47:47 ] f (fix f) と fun x -> f (fix f) x って同義じゃないの? んー、マジで分からん
453 名前:デフォルトの名無しさん mailto:sage [2009/02/13(金) 19:50:03 ] let rec fix f = f (fix f) だと、f が渡された途端、 f (fix f) ↓ f (f (fix f)) ↓ f (f (f (fix f))) ↓ f (f (f (f (fix f)))) ↓ f (f (f (f (f (fix f))))) ↓ あぼーん 関数を返そうとはするが、fix を展開しようとして無限ループ。 let rec fix f = fun x -> f (fix f) x だと、f が渡されても、 fun x -> f (fix f) x x が渡されるまで fix は展開されない。
454 名前:デフォルトの名無しさん mailto:sage [2009/02/13(金) 19:54:11 ] ちょっと言葉足らずなので修正。 × 関数を返そうとはするが、fix を展開しようとして無限ループ。 ○ 関数を返そうとはするが、先に fix を展開してしまい無限ループ。 × x が渡されるまで fix は展開されない。 ○ 先に関数を返し、x が渡されるまで fix は展開されない。
455 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 17:13:10 ] 関数は first-class object ではあっても 関数 = 値 ではない、と ――ここで正格評価において let rec fix f = f (fix f) なる定義で fix g を評価しようとしたら? 必死こいて値を算出しようとしてしまうんだな で、その結果、>>453 が示すように無限ループに陥る let rec fix f x = f (fix f) x なる定義で fix g を評価しようとしたら? これは部分適用だから関数オブジェクトの生成を行うのだな で、後々、(fix g) y とされたときに値の算出が始まる
456 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 23:01:31 ] 高尚な議論の最中で流れぶった切ってゴメン 入れ子になった型宣言(ネストされた type)って無理? type a () = type b = {x : int; y : int;} ... とかすると、2つ目の type で Unexpected keyword 'type' in type definition と怒られる
457 名前:デフォルトの名無しさん mailto:sage [2009/02/17(火) 20:14:16 ] >>456 できなさげ 確かに C# ではインナー クラスできるけど Java と違ってそんなに多用されるもんでもないような てか例示のコードならタプルでいいんじゃ?
458 名前:デフォルトの名無しさん mailto:sage [2009/02/17(火) 22:01:21 ] ありがと、やっぱ出来なさそうですね。 まぁ、確かにタプルでも機能するんですが、 各要素へのアクセスが面倒なんで レコードの方が扱いやすいなぁと。
459 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 01:02:15 ] .NET 言語なんで C# 基準で考えてしまいがちだが F# は OCaml ベースなんだぜ? internal すらぬるい、どうしても外部から隠蔽したいというなら シグネチャ(.fsi)ファイルを書けばいいじゃないか と、眠たいので調べもせずにいってみるテスト
460 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 12:53:16 ] >>259 公開するものだけをシグネチャ ファイルにしたら上手くいった。 なるほど、fsi はこうやって使うのか。 改めて読み直してみたら本には書かれていたけど、 いままで自分には無関係だと思って無視してた。 もうちょっと調べてみる。 じつは OCaml は見たことも触ったこともないんだけど、 やっぱ一通り触れてみた方がいいのかな・・・
461 名前:デフォルトの名無しさん mailto:sage [2009/02/18(水) 20:18:22 ] >>259 言い忘れてた ありがと
462 名前:デフォルトの名無しさん mailto:age [2009/03/04(水) 22:31:36 ] seq<int> 型に拡張メソッドを加えたいです。 パラメータを int 型に制約しなければ例えば次のように出来ました。 type System.Collections.Generic.IEnumerable with member this.H = Seq.hd this これを seq<int> 型の時のみ拡張することは出来ないのでしょうか。
463 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 03:49:18 ] これってVisual Studioから使えるの?
464 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 04:09:35 ] つかえるよ。 男は度胸。ものは試し。 まずはインストールしてミソ。
465 名前:デフォルトの名無しさん [2009/03/07(土) 09:32:33 ] 2008のProでしか駄目でした的な感じなのだが・・・orz 2008 Pro安く売ってないのかね
466 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 13:05:24 ] エディション比較ちゃんと見れと www.microsoft.com/japan/msdn/vstudio/products/vs08/compare.aspx 相変わらず Visual Studio 2008 Shell は知られてないなと msdn.microsoft.com/ja-jp/vsx2008/products/bb933751.aspx アドインなんだから devenv.exe のあるなしで判断できるだろうと
467 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 17:19:53 ] 使ってる人もっとなんか書いてくれ Scala がどうとか言ってる同僚を黙らせたい …俺? 日本語の本が出てからやるわw
468 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 23:49:03 ] F# のことを勉強しようかと思ったが、至るところ null があるって聞いた時点で、萎えた。
469 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 23:56:45 ] 何を言ってるんだ?おまえは?
470 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 00:07:37 ] >>467 どうとか言ってる内容にもよるわけだが、黙らせる方法ってのは。 関数型サイコーとでも言っているのかい?その同僚は。
471 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 02:04:51 ] nullがあるって変な表現だよね。
472 名前:デフォルトの名無しさん mailto:sage [2009/03/08(日) 15:24:28 ] >>466 kwsk 2008 StdあればF#の拡張機能は組み込めるってこと? あと、VS2008 の Shell 版なら本体買う必要なすってことなのかな?
473 名前:472 mailto:sage [2009/03/08(日) 15:31:46 ] ごめん、検索したら一杯情報出てきた。 大体あってた。 いげ太のブログ: Microsoft Visual Studio 2008 Shell (integrated mode) で F# 無償開発環境 igeta.cocolog-nifty.com/blog/2008/04/vsshell.html > Microsoft Visual Studio 2008 Shell (integrated mode) を導入すれば、 > 無償の F# 開発環境が手に入る。噛み砕いて言えば、C# も VB.NET も C++/CLI も、 > 何の言語もバンドルされていない Visual Studio 2008 が、タダで手に入るってことだ。 > そして、VSShell がインストールされた状態で、F# をインストールすればよい。 > そうすれば VSShell に F# が組み込まれるのだ。 Visual Studio で F#の開発を行う - ピコピコの日記 d.hatena.ne.jp/net-k/20080911/1221099444 > F#はVisual Studio 2008 もしくは、Visual Studio 2008 Shellから利用することができる。 > Visual Studio 2008 を持っていないので、無償で公開されているVisual Studio 2008 Shellをダウンロードした。 > ちなみに、Visual Studio 2008 Shell とは、C++やC#などの開発環境が何も入っていない状態のVisual Studio 2008で、 > Visual Studio向けの開発環境をSDKを使って組み込むことができる。 Visual Studio Shellダウンロードしてくるわ。 ありがとう。
474 名前:デフォルトの名無しさん mailto:sage [2009/03/09(月) 22:36:42 ] >>468 はこれか。 d.hatena.ne.jp/camlspotter/ いろいろ挑発的なことが書いてあるな
475 名前:デフォルトの名無しさん [2009/03/22(日) 17:40:50 ] 下がりすぎだろ
476 名前:デフォルトの名無しさん [2009/03/24(火) 16:39:37 ] FParsecの話なんかやってくれないかなあ
477 名前:デフォルトの名無しさん mailto:sage [2009/03/24(火) 20:11:44 ] こやつめw