1 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 14:49:54 ] 関数型言語MLについて語るスレッドです。 MLは、確固とした理論的背景を持つ言語でありながら、 現実的なソフトの開発にも使用できる実用性を備えた言語です。 また、プログラミングの初心者が最初に学習する言語としても優れています。 総本山 Standard ML www.smlnj.org/ Objective Caml caml.inria.fr/ocaml/ 前スレ 関数型言語ML(SML, OCaml, etc.), Part 4 pc11.2ch.net/test/read.cgi/tech/1133003340/
75 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 14:39:12 ] ハードウェアに特化しすぎた奴は全部死滅しただろ。 トランスピュータ+オッカムとか、コネクションマシン2+C*/*Lispあたり。 求められているのはハードウェアにベッタリしすぎない抽象化されたモデル。
76 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 14:59:15 ] >>75 抽象化自体は良いよ。ただ、ハードの資源を使い切れない様な抽象化では 意味が薄い。ハードの制約を無視した抽象化は単なる机上の空論だよね。 何年も前からトランジスタ数の増大に比較して CPU の性能が伸びない事、 CPU の速度向上に Memory が付いて来れない事が問題になっている。 現状としては業界を上げてマルチコア、メニーコア、ハードウェアマルチ スレッディングに移行している。途中で VLIW みたいな寄り道もしたけど、 現在製造されているプロセッサの多くが既にマルチコアに意向済み。 そんな中で、いかにスレッドを簡単に扱えるか、スケーリングする GC を 実装出来るかは言語の設計と処理系の実装には結構重要なポイントで、 テーマとしては新規性はあまり無いかもしれないけど、逆に言えば本来 あって当たり前の機能なんだよね。自動並列化とか CAS とかも。 まあ最低限、ネイティブスレッドくらいは扱える様な処理系があると良いね。
77 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 15:05:21 ] ネイティブ・スレッドって結論が馬鹿すぎる。 それから関数型言語と並列化の文献は山のようになるので、 英語でもちゃんと読んでやってください。
78 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 15:08:03 ] >>77 それを馬鹿だという奴は現実が見えてないだけだよ。 並列化の研究が沢山あるのは知ってるよ。じゃあどれだけの 実装が残ったのかという話。
79 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 15:10:04 ] 今後のハード技術は スレッドが使いづらい方向に行くと思うぞ
80 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 15:10:48 ] 有益でないから残らない。 関数型言語はErlangなど残っている方。
81 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 15:14:30 ] >>79 どちらかというとスレッドが無いとやってられない方向へ向かってる
82 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 15:18:45 ] 有益でない言語は残らない。
83 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 15:24:09 ] つまりMSにとって有益な言語が残るってことだな
84 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 15:33:41 ] Haskell は STM とか頑張っているんだがのう SML はダメッポス
85 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 16:14:00 ] STM?
86 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 16:18:31 ] >>84 haskell.g.hatena.ne.jp/jmk/20061219/1166519293 元の処理系に並列化の基盤が無いと、 こういう実験にも使えないのよね
87 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 16:46:40 ] 間違えた。>>86 は >>85 向け。
88 名前:85 mailto:sage [2007/11/23(金) 16:59:39 ] さんきゅう
89 名前:79 mailto:sage [2007/11/23(金) 18:29:22 ] スレッドが使いづらい方向に行くっていう意見は、たぶん俺がハード屋で 性能/消費電力/発熱に苦しんでるからかも。 SMPコアには既に限界を感じてる。 ASMPコアで無駄な回路を減らせば、まだまだ上を狙える。 遅延評価・非同期実行(イベント同期)をナチュラルに行なえる言語だと ハード・ソフトの両面からグッと最適化が効く。 スレッドはSMPと相性がいいかもしれんが、 でもASMPにはマッチしないと思う。
90 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 18:32:00 ] スレッド←→遅延評価・非同期実行(イベント同期) って反対概念でもないよね?
91 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 18:39:20 ] >>89 ASMP でも汎用コアが複数あったり、SMP と言っても特殊用途の コプロ積んでたりするもんじゃないの? どう転んでもスレッドの重要性は当分は覆らないと思うけどなあ。
92 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 22:38:05 ] >>90 確かに。お互いに実現可能なものを持ってるしね。 スレッドはハード層にCPUとしての機能と性能を要求してくるけど、 本当にそんなに大げさな物が必要なのかなーって思ってる。 OS層にはマルチタスク要求があるからスレッドは有益だけどさ。 アプリ層でスレッドを使うときって、 ・CPU複数使って速く処理する ・ブロッキング処理を非ブロッキング処理にする こういうのを言語がサポートしてないからじゃない? (ライブラリじゃなくて言語仕様ね) それにスレッドっていうキーワードを使って作られたものって、 DSP,SIMD,コプロ等々の存在を無視する気がする。 ┌─────────────┐ │ 関数 | ├───┐ | | スレッド | | ├───┴─┬───────┤ | CPU |DSP,SIMD,コプロ| └─────┴───────┘ 言語にはネイティブスレッドを要求するより こんなものの→(Scatter/Gather、Map/Reduce、遅延評価、イベント同期) シームレスでポータビリティな仕様と、実装の最適化を要求して欲しい。
93 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:05:28 ] >>92 結局 CPU 複数使って速く処理するにはスレッドが必要なんだぜ。 何でそんなにスレッドを嫌がるのかは知らんけど、現実には コプロや SIMD があってもスレッドは必須だよ。
94 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:27:35 ] 話がかみ合ってないな
95 名前:デフォルトの名無しさん mailto:sage [2007/11/23(金) 23:38:17 ] はぐらかしてるだけに見えるけど
96 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:04:53 ] >CPU 複数使って速く処理するにはスレッドが必要 違う。 手続き言語andスレッド によって速い処理を行おうとするから 複数のCPUを要求されている。 でもスレッドじゃ DSP,SIMD,コプロ この辺をうまく使っていけない。 極論だけど、関数言語がソフトウェアの主流なら クロックを使わない論理回路で作ったチップにも需要が出るから そういうのも作るもん。
97 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:15:20 ] >>96 違うっていうけどさ、元々違う話をしてるんだから当たり前だよ。 俺は現実世界にある CPU をどう有効に使えるかにしか興味無いよ。 そしてその為にはスレッドを使うのが一番の近道。 それにスレッドと SIMD やコプロは排他的な存在じゃないから。
98 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:35:01 ] >>96 >手続き言語andスレッドによって速い処理を行おうとするから >複数のCPUを要求されている。 これは違うよな。プログラマはスレッドなんて別に使いたくない。 シングルコアで高性能の CPU が作れないっていうから、仕方なく ソフトウェアを並列化してるだけ。DSP も一緒。
99 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 00:47:23 ] 各CPUにコードをロードさせておいてから、 データばらまいて、関数に突っ込んで、出力を集計すればいいじゃん。 ってこれはMap/Reduceだよな。
100 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 01:04:45 ] 何だよ、素人か。
101 名前:デフォルトの名無しさん mailto:sage [2007/11/24(土) 23:28:42 ] 言語はマルチスレッドをサポートすべき? │ ├CPUシングルスレッド性能は打ち止めだからこれからはマルチスレッドスレッドだよ │├マルチスレッドをどうにかするのは言語の仕事だよ ││├とりあえずスレッドとロックサポートすればいいよね (古典派) ││├ロックしないよ (モダン派) ││├プロセスは言語の基本だよ (並列言語派) │││└おっぱい おっぱい (ぱい計算ってうまいの?) ││└マルチスレッドは実装屋の仕事だよ ││ │├マルチスレッドをどうにかするのはOSの仕事だよ ││├1つのプロセス中では並列度上がらないよ ││└小さいプロセスいっぱい作るよ (forkできればそれでいい派) ││ │├CPUごとに仮想マシン割り当てるから問題無いよ ││ │└コプロの命令もメインプロセッサの命令に見せかけるからやっぱスレッドだよ (Intel) │ ├マルチスレッドよりも大切なものがあるよ │├SMPは限界。処理ごとに回路作るよ │├高性能処理はベクタマシンだろ。常考 (ベクタ派) ││└GPUを計算に利用しようぜ (新ベクタ派) │├他マシンとの通信こそ重要だよ (クラスタ派) │└機械語レベルでなんとかなるよ (スーパースカラ派・コードモーフィング派) │ └並列こそ計算の本質だよ。データフローマシン最高 (逐次処理は諸悪の根源だよ派)
102 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 00:13:28 ] っあらゆるテクニックを使って速く動くように裏で最適化してよ(何も考えたくない派)
103 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 14:48:34 ] クラスタ以外は、下へ行けば行くほど現実解から遠ざかっているなw
104 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 20:21:12 ] ていうかアプリによってどれがいい違ってくるよね
105 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 20:24:02 ] アプリレベルじゃない話も混ざっているみたいだけど 例えば fork を使うと良いアプリってどんなの?
106 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 20:28:36 ] ネットワークサービス系はforkがいいと思う。 セキュリティを考えると、 同じプロセスで走らせたくない処理が多い。
107 名前:デフォルトの名無しさん mailto:sage [2007/11/25(日) 20:45:54 ] ネットワークサービス系って一般的にはスレッドプールを作るイメージだけど、 具体的にはどんなアプリを想定してるの?
108 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 11:28:12 ] >>84 manticoreがあるでしょ > SML >>101 > 言語はマルチスレッドをサポートすべき? 関数型言語の場合は、semanticsをどうするかが一番の論点で、 (関数型言語でなくていいことは、他の言語でやればいいし、実際行なわれている) 言語に並列処理能力を持たせるべきかどうかってのは、設問としておかしい。 持たせるとしたらどういう風なものがいいか、研究が行なわれ続けている。
109 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 12:02:18 ] >>108 >関数型言語の場合は、semanticsをどうするかが一番の論点 そーそー、それそれ。 関数型言語にはそういう力があるんだから。 >>92 の一番最後に書いたここの部分ね。 >シームレスでポータビリティな仕様 CがUNIXの力になって LLがWebアプリの力になったように 関数型言語が並列処理分野の力になると思うんだけど。 今のスレの流れって なんだかWebアプリの話をしてるときに C実装レイヤーのことを話してるみたいな気がする。
110 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 12:04:09 ] >>108 >関数型言語でなくていいことは、他の言語でやればいい それはおかしいだろ。 例えばすごく関数型向きなアプリケーションを作ろうとしていて、 たまたま一ヶ所並列計算が必要だと分かったら、それだけで 関数型言語が選択肢から外れるってのは問題だと思わないか? 同じ論法で、汎用言語なら、良く使われる機構は一通りカバーしておくべき。
111 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 15:39:16 ] あなたが知らないだけです。
112 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 20:41:03 ] >>111 そういうのは例え 2ch でもどうかと思うよ。 manticore ってこれか。まだ実装は公開されてないのね。 manticore.cs.uchicago.edu/
113 名前:デフォルトの名無しさん mailto:sage [2007/11/26(月) 22:17:20 ] >>86 それ、最初の方でoperaionalにSTMの意味を説明しているけど、 それはSTMの実装の一つを紹介している(ことになっている)だけで、 STMは必ずしもそういう実装になる必要はないので読む時には気をつけて。 TMはdatabaseやdistributed computingでよく使われるモデル。 並列処理抽象化のために、実装がいくつも考えられて、 モナド親和性の高いモデルを採用している。
114 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 14:11:41 ] CML(cml.cs.uchicago.edu/ )とOCamlのThreadsライブラリの事もたまには思い出してあげてください。
115 名前:デフォルトの名無しさん mailto:sage [2007/11/27(火) 20:54:51 ] CML って所謂 Green Thread だと思ってた ちゃんと "Concurrent" に動くの?
116 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 08:03:00 ] スケジューラがユーザ空間に(も)ないと、 関数型言語っぽい面白いことができない。 CML→manticoreって人がいるね。
117 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 23:15:14 ] せっかく新生した JoCaml のことも思い出してあげてください
118 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 23:20:30 ] OCaml はもう良いじゃん...
119 名前:デフォルトの名無しさん mailto:sage [2007/11/28(水) 23:29:28 ] >>114 coThreadライブラリ(cothreads.sourceforge.net/ )は無視ですか、そうですか。
120 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 01:25:15 ] プログラミング in OCaml ~関数型プログラミングの基礎からGUI構築まで~ と 入門OCaml ~プログラミング基礎と実践理解~ どっちがいい?
121 名前:デフォルトの名無しさん mailto:sage [2007/11/30(金) 11:09:15 ] 立ち読みして決めろ
122 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 00:27:53 ] お前らの感想を言え
123 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 13:42:43 ] >>122 昨日発売される本の即日レビューなんて 無茶いうな。 入門OCaml 必要なことは大体書いてあるので、基礎的なことは十分できるようになった。 短所としては、よくあることだけど、ちょっと複雑な機能を説明するときに 複雑な例で解説してる場所がある、とか。そのぶん実用例の確認にはいいんかな。 そういう部分は自分で簡単なもの作ってみて理解するしかない。 まだ勉強中だけどスレッドやらパーサやらCGIやらの使用例とかあるし 本格的に使うつもりなら買っといていいんじゃないっかな。 あとこの本が無ければSML#とか知らなかった。
124 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 16:26:55 ] SML#の本、欲しい
125 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 17:36:49 ] >>116 >CML→manticoreって人がいるね。 manticoreってもう使えるの?
126 名前:デフォルトの名無しさん mailto:sage [2007/12/01(土) 20:45:42 ] >>120 どちらかといえば、前者。
127 名前:デフォルトの名無しさん mailto:sage [2007/12/02(日) 00:09:43 ] >>125 >>116 は研究者/開発者
128 名前:デフォルトの名無しさん [2007/12/02(日) 01:04:45 ] >>119 正直無駄にHaskell-STM風にモナド前提なのを何とかして欲しい。
129 名前:デフォルトの名無しさん mailto:sage [2007/12/02(日) 08:05:45 ] 無駄に?
130 名前:デフォルトの名無しさん mailto:sage [2007/12/02(日) 12:32:54 ] Poly/ML が 5.1 でネイティブスレッドを使える様になっているね polyml.5.1/libpolyml/processes.cpp 内で pthread 関連の関数を 呼び出しているみたい Poly/ML を使っている人はこのスレには居ないかな...
131 名前:デフォルトの名無しさん mailto:sage [2007/12/02(日) 21:46:29 ] 使ってるよ。 自作のコードはStandard ML系の処理系のほとんどでひととおり動作チェックする。
132 名前:130 mailto:sage [2007/12/02(日) 22:23:23 ] 今日久々に Poly/ML 見てみたんだけど、結構進化してるよね。 イメージベースの環境から、オブジェクトファイルを吐いて 実行ファイルを生成出来る様に変わっているし、スレッドは カーネルスレッドをサポートしているし、FFI は C の構造体 を扱えるし、Intel Mac も Solaris もサポートしているし、 あと欲しいのは UNICODE のサポートくらい。 Standard ML 処理系では最強なんじゃないかな。
133 名前:デフォルトの名無しさん mailto:sage [2007/12/03(月) 09:37:00 ] 誰かocaml-ssl ってのビルドできた人いますか(0.4.2) ttp://sourceforge.net/project/showfiles.php?group_id=89802&package_id=106341
134 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 00:06:44 ] SML のソースコードを沢山読んでみたいのですが、 Perl でいう CPAN みたいなのはありませんか?
135 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 08:34:33 ] つ www.cs.princeton.edu/~appel/smlnj/projects.html
136 名前:デフォルトの名無しさん mailto:sage [2007/12/06(木) 09:02:46 ] ありがとうございます!
137 名前:デフォルトの名無しさん mailto:sage [2007/12/07(金) 12:11:14 ] >>2 >yk.i.hosei.ac.jp/smlbook/smlbook.pdf だいぶ今更かもしれないけど、これ無くなってしまっているね。 欲しい人は今のうちに Web Archive から頂いておいた方が良いかも。
138 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 02:59:37 ] >133 Cygwin 上で特に patch なしでビルドできてるけど。何ぞ問題が?
139 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 16:52:38 ] 過疎っているので、Python スレにあったお題でコードを書いてみました。 "行頭の空白文字列を nbsp に変更するプログラム" fun replaceWhite file = let fun repLn lst = case hd lst of #" " => [#"&", #"n", #"b", #"s", #"p", #";"] @ repLn(tl lst) | #"¥t" => [#"&", #"n", #"b", #"s", #"p", #";", #"&", #"n", #"b", #"s", #"p", #";", #"&", #"n", #"b", #"s", #"p", #";", #"&", #"n", #"b", #"s", #"p", #";"] @ repLn(tl lst) | _ => lst fun replace out = case TextIO.inputLine out of NONE => () | SOME ln => ((print o String.implode o repLn o String.explode) ln; replace out) in (replace o TextIO.openIn) file end;
140 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 16:56:47 ] もういっちょ。 "フィボナッチ数を 0 から 35 まで表示するプログラム" fun fibloop () = let fun fib n = if n < 2 then n else fib(n-1) + fib(n-2) fun loop 36 = () | loop cnt = (print(Int.toString(fib(cnt)) ^ "¥n"); loop (cnt + 1)) in loop 0 end;
141 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 21:30:26 ] 次スレを立てる時は >>2 の SML の所にこれを追加して欲しいな SML を勉強していて一番参考になった www.geocities.jp/m_hiroi/func/index.html sml.sourceforge.net/Basis/
142 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 23:42:59 ] >>137 旧研究室サーバにあった。 133.25.16.150/smlbook/smlbook.pdf
143 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 00:42:45 ] >>139 ...正規表現のライブラリって無いのですか? いくら静的型付けとはいえ、スクリプト系の言語に比べてかなり冗長で、 いまいちSMLを勉強する気にならないのですが...。
144 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 03:21:09 ] 取り敢えず Moscow ML には正規表現ライブラリがバンドルされている みたいだけど、他もあるんじゃないかな。正規表現を使わなくとも Vector で書いたらコード量は大分少なくなると思う。 まあそんな事は誰でも簡単に調べられる事だし、勉強する気にならない のであれば他の事をした方が良いと思うよ。自由ってそういう事でしょ。 面白いと思ってすぐに手を動かせる人間が自分で色々探求して行く一方で、 そうじゃない人がいても別に誰も強制したりなんかしない。 そもそも >>139 は SML を勉強し始めて一日目の人間が書いたコード だから参考にしない方が良いでしょう…
145 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 09:43:10 ] >>144 3行でおk
146 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 18:12:49 ] >>145 俺の コードに 文句言うな
147 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 21:34:29 ] >>144 一日目でそれだけ書ければすごいよ。
148 名前:デフォルトの名無しさん mailto:sage [2007/12/10(月) 22:13:04 ] >>145 3 行 x 80 桁ではこれが限界ですた… fun r () = let open TextIO String Char val c = (valOf o input1) stdIn; in case c of #" " => print "&nbsp;" | #"¥t" => print "&nbsp;&nbsp;&nbsp;&nbsp;" | #"¥n" => print "¥n" | _ =>((print o toString)c;(print o valOf o inputLine)stdIn);r() end;
149 名前:デフォルトの名無しさん [2007/12/12(水) 20:07:08 ] OCamlで ('a -> 'a) -> 'a という型のY-combinatorを定義することは出来るのでしょうか。 let fix = fun f -> (fun x -> f (fun y -> x x y)) (fun x -> f (fun y -> x x y)) や let rec fix f = f(fun x -> fix f x) はどうしても、 (('a -> 'b) -> 'a -> 'b) -> 'a -> 'b という型になってしまいます。(遅延評価をするHaskellでは問題なく書けるのですが) これだと,TAPLのP144にある,以下の相互再帰が型エラーで書けません。 let ff ieio = {iseven = (fun x -> if x=0 then true else ieio.isodd (x-1)); isodd = (fun x -> if x=0 then false else ieio.iseven (x-1))} let r = fix ff
150 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 02:27:16 ] パターンマッチのある言語で正規表現って必要なんだろうか。 メタランゲージなんだから、そのまま書き下した方がスッキリする。
151 名前:デフォルトの名無しさん [2007/12/13(木) 08:08:58 ] 関数型言語のパターンマッチでまだ A.*B 相当とか書けないよね。
152 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 08:45:20 ] >>150 正規表現並にconciseな表現ができればね
153 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 08:58:43 ] 正規表現そのものだと、バックトラックが必要になるからまずいです。
154 名前:デフォルトの名無しさん mailto:sage [2007/12/13(木) 17:18:34 ] 中置文字について何かまとめた。トリビア的なものだけど。(OCaml 3.09.2) 頭文字 =<>@^&+-*/$% どこでも大丈夫 | 二文字以上なら頭文字可 後続文字 ~ 二文字以上なら頭文字にできるが、頭に使うと前置しかできなくなる。 ! 頭文字にすると前置のみに。 .:? 後続文字のみ使用可
155 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 00:37:16 ] (* ^ o ^ *)
156 名前:デフォルトの名無しさん mailto:sage [2007/12/15(土) 00:39:32 ] 神経を逆撫でするコメントだな
157 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 12:32:42 ] with-open-file (fun ch -> fprintf ch "aaa") みたいなのって標準ライブラリにある?
158 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 21:14:55 ] 俺も欲しいけど、エラーの扱いとかどうなるんだろ
159 名前:デフォルトの名無しさん [2007/12/18(火) 20:20:46 ] 中でfinallyつかえばいいんじゃないかな。
160 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 10:35:14 ] ocamlにfinallyなんてないだろ
161 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 16:22:00 ] Javaプログラマは夢見るSuccubus finally かなり 例外に依存して生きているの
162 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 17:32:45 ] 何だ OCaml には finally があるのかと思った また OCaml 限定の話かよとスルーしてたのに
163 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 23:00:37 ] >>149 OCamlでは ('a -> 'a) -> 'a という型のY-combinatorは定義出来ません。 HaskeiiはLazy evaluationなので、例で書いているように出来るのですが、 OCamlはEager evaluationなので、argumentをすぐに評価しようとするので、それをお書きになったような形で避けるとにコンビネータではなくなってしまいます。 これを避けるにはLazy モジュールを使用してナンチャッテ遅延評価で解決します。そうすればコンビネータとして扱うことが出来ます。 同様のことはモナドにも言えて、ナンチャッテ・モジュールを使用すると解決することがあります。 MLのYコンビネータの書き方はLittle MLerの巻末に書いてあるのでご覧下さい。
164 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 17:21:19 ] >>149 >>163 factの実装方法を2通り紹介しておく。 チューリングの賢人鳥 let rec turing's_sage f x = f (turing f) x;; turing's_sage (fun f x -> if x = 0 then 1 else x * (f (x-1))) 5;; カリーの雲雀 let lark x (`M y) = x (fun z -> y (`M y) z);; let curry's_sage f x = lark f (`M (lark f)) x;; curry's_sage (fun f n -> if n = 0 then 1 else n * (f (n-1))) 5;; どっちの方法も - : int = 120 と返ってくる。
165 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 19:10:27 ] >>164 スマリヤンの「ものまね鳥」だね。SKIコンビネータ入門にいいよね。 ほかにもJAYとかOWLとか出てきた希ガス。
166 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 21:22:48 ] 論理学の問題ならCoqを使ってコードを作ればいいんじゃねえか? coq.inria.fr/
167 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 21:39:17 ] (つд⊂)ゴシゴシ(;゚д゚) 論理学の問題
168 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 00:08:29 ] Coq is the specification language. Interactive Theorem Proving And Program Development by Coq'art: The Calculus Of Inductive Constructions これ系統の参考文献にこれもいいかも。 TAPL : Types and Programming Languages
169 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 00:24:27 ] >>167 数理論理学とコンピュータ・プログラムの間には深い関連性がある。 A.近代論理学の開祖であるフレーゲの概念記法を出発点とするゲンツェンの自然演繹 B.チャーチの型付きラムダ計算 2つのモデルはカリー・ハワード対応によって同型として対応付けられる。 つまり、論理学の問題と言っているのは、実はコンピュータ・プログラムの問題と言っているのと同じなのだ。 QED.
170 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 00:51:12 ] Coq見てみたけどワカランw OCaml-Nagoyaの次の本はCoqだな。決定。
171 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 19:25:22 ] WindowsのCoqIDEが動かないな。固まったよw
172 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:47:12 ] >>171 うごくよ。 てかProofGeneralが亡くなってる。
173 名前:デフォルトの名無しさん [2008/01/01(火) 02:06:59 ] >>169 その同型になるのは、1階の述語論理のこと?
174 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 13:37:59 ] カテゴリカル・コンビネータ理論
175 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 13:45:05 ] 一階述語論理にカリー・ハワード同型対応で対応するのは、一般の関数型言語で使われている型理論とはだいぶ異なる型理論です。