1 :
デフォルトの名無しさん :
03/07/20 01:05
2 :
デフォルトの名無しさん :03/07/20 01:05
3 :
デフォルトの名無しさん :03/07/20 04:32
乙って言ってほしい?
let ってなんか いんぽぺろぺろだな
Caml とかもスレタイに入れておくと検索しやすかったのに、と言ってみるテスト。
いや、なにはともあれ乙。
>>1
6 :
デフォルトの名無しさん :03/07/21 05:37
スレタイトルが(笑 haskell新スレの「再帰事件」の教訓を生かしたか(笑
JIS BASICみたいだね < let
>>7 BASIC の let って、破壊的代入だよね
9 :
デフォルトの名無しさん :03/07/22 22:35
3.07 のβ版が出たみたいですね。
10 :
デフォルトの名無しさん :03/07/23 02:50
>>9 3.06 の時はリリース後発覚したバグが結構あったので
今回は一応慎重を期しておるのです。
SWIG でフンジャラムンジャラしてる OCaml ユーザはいるのかな。GUI とか。
12 :
デフォルトの名無しさん :03/08/01 02:16
今は LablGTK で間に合ってるなぁ。 SWIG で QT binding for OCaml 誰か作ってよ。
13 :
デフォルトの名無しさん :03/08/01 21:50
To run programs that use the LablTK GUI, the directory where the DLLs tk83.dll and tcl83.dll were installed (by the Tcl/Tk installer) must be added to the PATH environment variable. To compile programs that use the LablTK GUI, the directory where the libraries tk83.lib and tcl83.lib were installed (by the Tcl/Tk installer) must be added to the library search path in the LIB environment variable. E.g. if Tcl/Tk was installed in C:\tcl, add "C:\tcl\lib" to the LIB environment variable. 以上を呼んだのですがpathの追加方法がよくわからないので どなたか、わかりやすく説明していただけないでしょうか。
15 :
デフォルトの名無しさん :03/08/02 00:57
>>14 激しく板違い。というか、まず google
(^^)
17 :
デフォルトの名無しさん :03/08/03 16:36
20 :
デフォルトの名無しさん :03/08/06 17:27
21 :
デフォルトの名無しさん :03/08/11 13:15
WindowsでML系使ってる人いる?
Ocaml使っとります
このスレ最低だな。誰も書き込まん。
24 :
デフォルトの名無しさん :03/08/11 20:19
おお! 実務ですか? ゲーム作ってる人、いないかなあ
マイナーは百も承知だと思うがなあ・・・
マイナーだけど使える匂いがプンプンする。
フランスじゃあメジャーさ!
アメリカじゃないのか・・・
31 :
デフォルトの名無しさん :03/08/13 17:52
MLって教育用言語なの?
教育用はPascal
おフランスでは教育にも使いますのよ おほほほほほ
貴族英才教育:ML 一般教育:Pascal 貧民:C
使うリソースの量に比例してるのか。 〆(.. )メモメモ
(⌒V⌒) │ ^ ^ │<これからも僕を応援して下さいね(^^)。 ⊂| |つ (_)(_) 山崎パン
フランスじゃあメジャーさ!
caml と ocaml はどのくらい違うの?
お!って言うぐらい違う
40 :
デフォルトの名無しさん :03/08/20 21:58
caml は ocaml に吸収されましたと言っても過言では無い様な
43 :
デフォルトの名無しさん :03/08/22 23:52
もっと広めていく努力をすべきでは?
おそらくこのプログラム板の中でさえも
過半数はメーリングリストの略だと思っているだろう。
どんどんageてOcamlの凄さを伝えていこうぜ。
>>42 よっしゃ。早速俺のサイトで使うぞ。
PukiWiki(PHP)にしようかと思っていたけどやめだ。
45 :
デフォルトの名無しさん :03/08/23 00:15
OCamlWiki は作りたいんだけど時間がなぁ。何か面白いアイデアがあったら希望。 世間でいうところの plugin は適当なインタフェースを定義しておけば Dynlink module でなんとかなると思うし。 ocamlopt でコンパイルできなくなるけど。 それとも dlopen とか使った方がよい?
dlopen系は今のOSならほとんど使えるから、そっちの方が良いかと。
以前SML/NJやったことあったのでちょっとOCamlにも手を出してみた。 MLをオブジェクト指向にした意味ってあるの?
GUIが書きやすい
OCamlは別にオブジェクト指向にしか書けないわけでもないし, モジュールがあれば十分だという人にはオブジェクト指向な部分は無用。 だから,何がうれしいのかと聞かれたら オブジェクト指向なコード"も"書けるっちゅうとこではなかろうか。 使いたければ使え,使いたくなければ使うな,と。 要するにオブジェクト指向の部分はオプションだ。
50 :
デフォルトの名無しさん :03/08/26 16:01
51 :
デフォルトの名無しさん :03/08/26 19:42
OCaml の beta2 出ましたね。 object は、状態を持ってしまうものを隠蔽するのに利用すると 結構使いやすい様な気がします。object は確かにいらないことは いらないけど、状態を持たせた方が自然なものを functional に するよりも、object にして隠蔽してしまうことはよくやります。
Caml/OCaml って何て読むんでつか?
53 :
デフォルトの名無しさん :03/08/26 21:43
(おー)きゃむる
らくだ同じのキャメルらしいぞ。
キャムルだけど、実際の(日本語の)会話では「ム」の母音は消えて「キャmル」 になってるかな。もともとそういうものだという意識もあるのだろうけど、 「ム」の母音を出すようにすると意外とめんどくさい。
56 :
デフォルトの名無しさん :03/08/27 13:13
ラクダの発音がキャメルに聞こえるやつは英語の発音勉強しなおせ。
57 :
デフォルトの名無しさん :03/08/27 13:33
キャモーだろ。
58 :
デフォルトの名無しさん :03/08/27 13:38
あなたは子音のlが聞こえないんですね;)
キィヤァムェエルゥ
あぽー りろー きゃもー
りろーは little? Caml の発音の話題は、以前 ML でも出てたな。
(脳内読み) OCaml → 岡村
Ocaml広めたいならスレタイ変えなきゃだめだ。 このスレ見切って「関数型言語Ocaml」で新スレたてれ。
関数型言語岡村 オブジェクト指向言語志村
科学技術計算用言語 焔(火村)変形
67 :
デフォルトの名無しさん :03/09/02 21:50
F# に限定されてもなぁ。
>>63 言いだしっぺが立ててよ
68 :
向こうがdat落ちしたので再度カキコ :03/09/07 15:48
69 :
デフォルトの名無しさん :03/09/07 15:58
70 :
デフォルトの名無しさん :03/09/07 16:21
let _ = cygwin でビルドした OCaml でプログラムを書こうとする Uncaught Exception ocamlbrowserがない
>>52 あるフランス人は
かめる
って読んでいたような記憶が。
>>51 状態を持ってるものはADTで書きゃいーじゃん
dynamic dispatch とか使わねーならADTでじゅーぶん
74 :
デフォルトの名無しさん :03/09/07 22:38
ADT を使うか object を使うかは宗教論争になりがちだー。 もちろん object の方が色々出来るんだけど ADT で十分なものは ADT で良さそう。
75 :
デフォルトの名無しさん :03/09/07 22:39
>>68 scheme を真似して、quote の代わりに lazy evaluation を使えば?
(なんのこっちゃ)
>76 ありがとうございます それは最初に考えてみたのですが、lazy にした関数の部分評価 (Schemeでの"quasiquote", "unquote"に相当)する方法が解りません 多分 Lazy module の使い方がまだピンと来ていないのだと思います やっぱり勉強が足りませんでしょうか
うーん。これってMLの型理論では型がつかないんだっけ?
>>77 参考までに`(is-unprovable (value-of (',x ',x)))
このS式のquasiquoteを展開するとこうなる。
(mac`(is-unprovable (value-of (',x ',x))))
=>
(cons
'is-unprovable
(cons
(cons
'value-of
(cons
(cons
(cons 'quote (cons x '()))
(cons (cons 'quote (cons x '())) '()))
'()))
'()))
schemeはこの展開形からリストを新規作成してるだけなので、
部分評価とはちょっと違う気がする。(結果としてそう見えるんだけど)
>>78 let g x = is_unprovable (x x)
g g
ではいかんのかな?
あ、-rectypes オプションつけて。
>78 こういうメタな構造の値をMLの型理論で扱うのはやっぱり難しいのでしょうか? >79 「部分評価」とは言いますが、どっちかというと「部分未評価」という感じなんですね(違う?) 勉強になりました おやすみなさいです
lazy でやるなら is_unprovable の中にも Lazy.force を書く必要があるよな その場合は let g x = is_unprovable (lazy (x x)) とかやればいいのかな
>>75 cygwin に入ってるtcl/tk(tcltk 20030901)は入ってんだけど・・・。
それじゃダメ?
すれ違いならすんません。
確認したいことは g g が g の不動点になってるってことなんだよね? ・・・あってる? (g g) = is_unprovable (g g)
って、MLで不動点になってるかどうか調べる方法ってあるのかなぁ、と。
>80 "-rectypes" はまだよく分かっていませんが興味深く感じます 時間がありましたらいろいろ試してみようと思います(済みません、今日は遊べません) >82 困った事に、そこからさらに部分評価させる方法が解らないのです >84 ちょっと違うと思います (g g) を評価すると isUnprovable( valueOf( X( Hold( X ) ) ) ) の形で評価されます この X を評価すると (g g) を評価したものと同じになる、ということです しいて言えば X = (g g) とすると X = isUnprovable( valueOf( X( Hold( X ) ) ) ) となるという感じでしょうか?高階関数の未評価引数を省略しているので判り難いのですが >85 それも解らない事の一つです
ちょっと実験してみた。 # let f = fun x -> x;; val f : 'a -> 'a = <fun> # let g = fun x -> x;; val g : 'a -> 'a = <fun> としとくと、 # f = f;; - : bool = true # (f,g) = (f,g);; - : bool = true ってなったから、うまいこと自前で遅延評価を作ってやれば比較はできるんじゃない? ただし、 # (f = g);; Exception: Invalid_argument "equal: functional value". だし、 # (lazy (f 0)) = (lazy (f 0));; Exception: Invalid_argument "equal: functional value". だし。
>87 なるほど、評価前の関数でも比較可能なのですね # (f g)=(g f);; Exception: Invalid_argument "equal: functional value". うむむ しかし、遅延評価は自前で用意する必要がありそうなのですね 大変参考になります
あまりにも反応がなくさみしいのでアゲてみる。 同じ環境でlablglをうまく使えている人がいるならば、 lablglをコンパイルするときのMakefile.configを拝見しとうございます。
91 :
デフォルトの名無しさん :03/09/15 19:19
っつ〜かさ・・・ ocaml インタープリタ syntax error 出しただけでこけちゃうんですけど・・・ (3.06 cygwin) どなたか簡単な対処法ご存知でない? opt にしてないんだけどな・・・
>>91 そんなことないんだけど。recompile してみたら?
93 :
デフォルトの名無しさん :03/09/18 22:09
(* はじめて書いたOCamlプログラム、ありがちなマンデルブロート描画。*) #load "stdlib.cma";; #load "graphics.cma";; open Complex;; open Graphics;; let rec mandel z c n = if n > 63 then 64 else if (norm z) > 2.0 then n else mandel (add (mul z z) c) c (n + 1);; let col n b = if (n land (1 lsl b)) = 0 then 0 else 15 lsl (b * 4) let color n = (col n 0)+(col n 1)+(col n 2)+(col n 3)+(col n 4)+(col n 5);; let dx, dy={re=(0.5/.200.);im=0.}, {re=0.;im=(0.5/.200.)} let rec draw_x x y z = set_color (color (mandel {re=0.;im=0.} z 0)); plot x y; if x<200 then draw_x (x+1) y (add z dx) let rec draw y z = draw_x 0 y z ; if y<200 then draw (y+1) (add z dy);; open_graph " 201x201";; draw 0 {re=(-1.6);im=(-0.1)};; wait_next_event [Button_down];; close_graph();;
>>93 "graphics.cma"がないと言われる。windowsだから?
95 :
デフォルトの名無しさん :03/09/20 16:56
cygwin だからじゃない?
>>94 レスありがとう。反応があって嬉しい。
こちらもwindowsです。(WIN98SE + Ocaml3.06 Native MS)
以下を確認してくださいです。
(1)インストールディレクトリ\LIB に"graphics.cma"があるか。
(2)上のディレクトリを環境変数 OCAMLLIB にセットする。(95,98,MEの時)
(3)93>>のレスの内容を丸ごと"mandel.ml"という名前で、適当なディレクトリに保存して、
MS-DOS(CMD)プロンプトから "ocaml mandel.ml"で実行する。(必要ならパス付きで)
それから終了はウインドウ上をクリックです。そのまま窓を閉じると悲しい
状態になることがあります。
>>95 ほんとだ。 Readme.win に、
Native_MS Native_MinGW Cygwin
The_Graphics_library yes yes no
とありますね。
なるほど。確かにこちらの環境はcygwinです。 README.win32をみるとNative MS, Native MinGW, cygwinは どれも一長一短ですね。 unix libraryがpartialでなければ迷わず再コンパイルするところですが…。
99 :
デフォルトの名無しさん :03/09/21 00:32
便乗質問。 ocamloptで、Graphicsを使うと (環境変数INCLUDEを見てくれてないのか)gdi32.lib等が見つからないと言われますが、なんででしょうね? Win32 Native版です。
100 :
デフォルトの名無しさん :03/09/21 01:12
>>99 自分の環境では言われないんだけど。
本当に path あってる? あるいは、どうやって追加している?
>>100 PATHはC:\Program Files\Objective Caml\bin、
gdi32.lib等はC:\Program Files\Microsoft SDK\libにありますが、
INCLUDEに追加しても-Iや-cclibに渡しても見てくれません、という状態です。
仕方ないから使う*.libだけコンパイルするディレクトリにコピー…
すみません。 どなたかご存知でしたら教えてください。 代入文の集合を解析して変数の依存関係を表すグラフを求めたいと思っています。 例: 代入文の集合が{a = b, c = z, b = y}ならば a --> b --> y c --> z のようなグラフです。 ノード数は巨大ですがエッジの数は少ないので、できれば各ノードごとに サクセッサリストを持たせてグラフを表したいのですが、Cのように、 ノードのアドレスを求めてそのリストを作ることは可能でしょうか? また、こういうグラフの実装についての文献などありましたら 教えていただければ幸いです。
自己レス。環境変数に追加すべきはINCLUDEじゃなくLIBでした。なにやってんだ私
104 :
デフォルトの名無しさん :03/09/22 16:25
>>102 コンパイラの教科書の、フローグラフとかいうところを読みましょう。
>>104 ええと、データフロー解析のアルゴリズムが知りたいのではなく、
ノードへの参照リスト(もしくはそれに類するもの)を用いたMLでの
グラフの実装方法についてお聞きしたかったのですが。
アドレスを求めてリストにするという考えがすでにFunctionalじゃないような。 破壊的代入が無いことを良しとするFPでは、 オブジェクトの要素が「後から変わる(破壊的代入)事」を心配しないので、 オブジェクトの内部表現はすべてpointer(のはず)ですよ。 Succ listにSuccなオブジェクトをaddすりゃいいんでないの?
>>106 複数のノードのsuccessorとなるノードはどうする?
別にそれぞれのnodeのsucc listにaddされるだけじゃない? 名前が実体じゃなくて102の言い方でいえばpointerなんだよ?
>>106 お答えいただきありがとうございます。
破壊的代入をしないというのは、グラフを更新するたびに新しくグラフを
作り直すということでしょうか。
その方針で少し書いてみたのですが、サクセッサリストにノードを
直接追加すると、それはすべてコピーされた別の実体になります。
そのため、ノード情報が必要になるたびに、ノード名をキーにオリジナルノード
を検索する悲惨なプログラムになってしまいました。
これならサクセッサリストは単なるキーの集合にした方がましな気がします。
もっといい方法はないものでしょうか…。
以下がそのプログラムです。
type node = Node of string * node list type graph = node list (* 名前nameのノードか? *) let is_node name n = let Node(id, _) = n in id = name (* グラフgから名前nameのノードを探す。なければ追加する *) let get_node g name = try (List.find (is_node name) g, g) with Not_found -> let n = Node(name, []) in (n, n::g) (* グラフgの名前idのノードをnに更新する *) let update_graph g id n = List.fold_left (fun g' x -> if is_node id x then n::g' else x::g') [] g (* n1のサクセッサにn2を追加する *) let add_succ n1 n2 g = let Node(id1, succ_list) = n1 in let Node(id2, _) = n2 in try let _ = List.find (is_node id2) succ_list in g with Not_found -> update_graph g id1 (Node(id1, n2::succ_list)) (* 代入文 e1 = e2を処理し依存グラフを更新する *) let process_assign stmt g = let (left, right) = stmt in let (n1, g') = get_node g left in let (n2, g'') = get_node g' right in add_succ n1 n2 g''
最終的なグラフから依存情報を求める関数は以下のようになりました。 (* 名前idのノードの依存元ノード集合を求める *) let get_depend id g = let visited_list = ref [] in let rec get_depend2 id' = if List.mem id' !visited_list then [] else (visited_list := id'::!visited_list; let n' = fst (get_node g id') in let Node(_, succ_list) = n' in if succ_list = [] then [n'] else let succ_list' = List.map (fun (Node(x,_)) -> x) succ_list in List.concat (List.map get_depend2 succ_list')) in get_depend2 id うーん…。
え?コピーされちゃう?Ocamlだよね?そのリストみた感じだと。 # let a = "abc";; # let b = "abc";; # a = b;; - : bool = true (* aとbの内容比較なら真 *) # a == b;; - : bool = false (* aとbのポインタ比較なら偽 *) # let x = [];; # let y = a :: x;; (* List xにaをadd *) val y : string list = ["abc"] # List.hd y;; - : string = "abc";; (* yの先頭要素は"abc" *) # (List.hd y) = a;; - : bool = true (* yの先頭要素とaの中身は同じ *) # (List.hd y) = b;; - : bool = true (* yとbも中身は同じ *) # (List.hd y) == a;; - : bool = true (* yとaのアドレスは同じ *) # (List.hd y) == b;; - : bool = false (* yとbのアドレスは別 *) 結果List x(空だけど)にaをaddした結果できた要素"abc"は aが指している"abc"と同じで、bが指している"abc"とは別。 ==演算子使って実体の場所(ようはアドレス)が同じか見てみた? つか単一名前空間なら(List.findで探すようなものなら)、 Hashとかつかったほうが良くないですか? OcamlにはHashtblモジュールがあったはず。
追加: 破壊的〜という下りの話は、ある束縛された値が後から変更されるという事を 言語として美しいとしていない(推奨していない)ので、考えていない故に、 後から束縛された値が使われる場合、ポインタを渡してしまうという 関数型言語の実装に見られる話です(個人的見解なので嘘かもしれませんが)。 すなわち、Ocaml的に書けば # let x = "a";; # let y = x;; 上のx, yならxの値が永遠に"a"であるなら、yが同じ場所さしてても問題ないでしょ? xの値が変わってしまう場合に、単にポインタを複製する場合は「 xの値を変えるとyの値も変わる」という不思議な現象が発生しますが。 Cなどの場合は、意味論の面で実体コピーかポインタ複製かの問題が ついて回りますが、関数型言語は「ないことにしている!」のです。 # で、mutable fieldを持つ構造体とかの複製つくるときにはまるのです…
リストならともかく配列や構造体の更新は関数型言語の大きな課題。 組替えを末尾的に行う事でそれの参照を限定すれば、 複製による更新が破壊的更新になったとしても問題は発生しない。 という理論による最適化はMLで行ってるんだっけ? なんていう名前だか忘れたけど。
order of evaluation analysisとかだっけ? ML系言語はまともに実装した事(設計すらも)ないからよくわかんないや。
>>112 > え?コピーされちゃう?Ocamlだよね?そのリストみた感じだと。
すみません。
「コピーされてしまう」というのは誤解を招く表現でした。
正確には「ノードの情報を更新するためには、もとのノードをコピー
して情報を更新した、新しいノードを作らざるを得ない」ということです。
>>110 ではノードを(ノードID, サクセッサリスト)のペア、グラフを全ノードのリスト
で表現しているため、たとえばノードaのサクセッサリストにノードbを追加しようと
思ったら、新しくノードaを作り直し、古いaを新しいaに置き換えたグラフを作り直す
必要があります。
> with Not_found -> update_graph g id1 (Node(id1, n2::succ_list))
このとき、aが他のノード(たとえばc)のサクセッサリストに入っていても、
それは古いaのままなので、cのサクセッサを再帰的にたどる処理では、
グラフのノードリストから最新のaを検索してそのサクセッサリスト
をたどらざるを得ません。だったらノードIDでサクセッサリストを管理
するのと変わらないなあ、ということです。
続き。 Hashを使ったほうがいいというのは、ご指摘の通りです。 まだocamlを使い始めたところなので、ライブラリをよくみてませんでした。 それと、 > # で、mutable fieldを持つ構造体とかの複製つくるときにはまるのです… ひょっとしてmutable fieldを使うと破壊代入ができるのでしょうか。 ちょっと調べてみます。
118 :
デフォルトの名無しさん :03/09/23 13:12
パターンマッチで質問です。 let test n m = match m with n -> 0 | _ -> 1;; こんな感じにすると3行目のnというのが1行目で引数に与えるnと 違うnとしてマッチしてしまう(どんなmでも3行目でマッチしてしまう) ようなのですが、これを何とか同じnとして認識させる方法はないでしょうか?
>>118 matchを使う理由がよく分かりませんが、以下のように書けます。
let test n m = match m with
n' when n' = n -> 0
| _ -> 1
120 :
デフォルトの名無しさん :03/09/23 16:27
>>119 whenなんてはじめて知りました。
ありがとうございます。
マニュアルのmutable関係をみました。私の望んでいた動作は これで実現できそうです。 type node = { id : string; mutable succs : node list } type graph = { mutable nodes : node list } let add_succ n1 n2 = n1.succs <- n2 :: n1.succs let add_node g n = g.nodes <- n :: g.nodes これなら実体の間でリンクが張られているので、サクセッサも 直接たどれます。 どうもお騒がせしました。
122 :
デフォルトの名無しさん :03/09/23 21:13
もしかして ref とか知りません?
124 :
デフォルトの名無しさん :03/09/24 17:15
俺は最近、関数型言語ってのに少し興味が湧いてるんだが、APLが関数型だという嘘に騙されていたぜ。 MLを少し使ってみたいのだが、どんな処理系がいいか誰か教えてくれないか? OSとしては、XPとLinuxを使いたい。 それと、MLの有償の処理系はあるのかな? ついでに聞くが、Lispみたいな古い意味での関数型?言語と、MLとの使い勝手の違いや、MLの将来性についても誰か 詳しい人いたら教えてくれないかな。
125 :
デフォルトの名無しさん :03/09/24 17:18
126 :
デフォルトの名無しさん :03/09/24 18:28
>>124 OCaml を使いましょう。SML よりは書きやすいはず。
有償の処理系は聞いたことがありません。無償の処理系で十分なレベルなので
それを使いましょう。
ML は十年未来の言語です。言語の研究の成果が実際に使われている言語に
利用されるにはかなりかかります。 ML は研究者レベルでは現在常識レベル。
従って、実用レベルで常識になるには後十年ぐらいかかるでしょう。
ML とか Haskell とかやると世界が変わります。その体験を是非。
>>123 ご紹介ありがとうございます。
まだintroをちょっと見ただけですが、functionalに書きにくい例として
行列の積があがっていました。
グラフのデータ型や操作の定義を試行錯誤していて思ったのですが、
帰納的でない操作がある場合、functionalなスタイルできれいに書く
のは難しくなるのかもと思いました。
そもそもグラフの場合はデータ構造すら帰納的に書けませんが…。
>>121 ああ、なるほど。そういうことか。
問題提起部分およびコードをほとんど読まずに返事してたので
的外れですまんかった。
ただ、そのグラフはそれでいいのか?
巡回してしまう依存グラフは後の解析時に問題にならない?
# (a=b, c=z, b=y, y=a)等、巡回パターンになるよね
なんの解析をするかによるんだろうけど、普通変数依存なんかの解析は
Static Single Assignmentを使って解析を行うと思うよ。
Semanticsな話になるんだけど、たとえばC的な文法で
void foo(void) {
a = b;
c = z;
b = y;
}
の場合、変数依存を書き出せば{a = b, c = z, b = y}となるけど、
a->b->yとしちゃうと、aがあたかもyであるかのようになってしまうので
都合が悪い(たとえば定数の畳み込みをしようと思ったりした場合とか)
SSA形式なら、102が直面している問題そのものが起こらないんじゃないかな。
またもや的外れならごめん。
MLとまったく関係ないのでsage...
>>128 > 巡回してしまう依存グラフは後の解析時に問題にならない?
そうですね。
111ではvisited_setを使ってすでに訪れたノードをチェックしてましたが、
ほんとはサイクルを検出した時点でunifyすべきですね。
ちなみに解析の目的はポインタの指示先の計算です。
SSAは使ってみたいと思っているのですが、まだ配列やポインタ間接参照式の扱いが
よく分かってなくて…。ocamlコンパイラでも使ってるなら、勉強がてらソースを
読んでみようかな。
SSAに対しての軽い知識はあるみたいなんで詳細は解説しない(MLと関係ないし)けど、 SSAにすると、サイクル自体が存在しなくなるので、Nodeを作成した段階での succ listが決定的になるからsucc listをmutableにする必要がなくなる(はず)。 個人的見解だけど、状態変数以外でmutable(ref)を使うのはお勧めしないな。 今回のmutable変更はソースすっきりで素敵に見えるけど、大抵、状態変数以外で mutableにした方がきれいにまとまる〜ってときはアルゴリズム側に問題があったり するし、後々いらぬバグに悩まされる事がおおい。 # 余計なお世話かな… ocamlコンパイラはソースを斜め読みした感じだとSSAは使っていなくて、 それゆえかどうか分からないけど、mutableをclassを通して使ってるね。 ocamlopt --helpすると分かるけど、マニュアルにないオプションがいっぱいあるんで、 コンパイラ系の勉強をしているなら、-drawlamda、-dlambda、-dcmm等、 path途中の情報を見てみると良いかも。 ところで、この中間表現等をまとめてるページとかないのかな。
131 :
デフォルトの名無しさん :03/10/04 00:30
OCaml 3.07リリース揚げ。
132 :
デフォルトの名無しさん :03/10/11 00:16
mod_ocaml ってどうっすか?
133 :
デフォルトの名無しさん :03/10/11 20:25
私はOCamlのプログラムを書くとき、Emacs(正確にはMeadow)でtuareg-modeを使っているのですが、 OCamlにはこの他にもソースに付属するcaml-mode.elというのがあります。 みなさんはどちらをどういう理由で使っておられるのでしょうか? ちなみに私の場合はWindowsバイナリ版にcaml-mode.elが付いておらず、 先に見つけたのがtuareg-modeだったというだけかも。 ところで、caml-mode(とOCamlの最新版のみ?)にある、 -dtypesオプションをつけてコンパイルしたソースを開いて C-c C-tとやるとカーソル位置の式の型を表示してくれるという 機能が小粋に思える今日この頃です。 ソースを編集したらコンパイルしなおさないといけないのが不便で tuareg-modeから乗り換えるには至ってないのですが。
134 :
デフォルトの名無しさん :03/10/11 20:53
-dtypes は 3.07 からですな。 自分は tuareg-mode を使っております。 mod_ocaml はものすごいセキュリティーホール (任意の OCaml の式が実行可能) があったんですが、直ってるんでしょうか。follow してないけど。
'a option って何だっけ? int option とか。 どうやって作り、何に使うんだっけ?
136 :
デフォルトの名無しさん :03/10/21 11:22
こんな感じ。 type 'a option = | None | Some of 'a let f ?x () = match x with Some y -> y | None -> 0 let f ?(x = 0) () = x
即レスサンクス。 自分はSMLNJ使ってるのでちょっと戸惑ったけど、後半のは fun f (NONE) = 0 | f (SOME x) = x; って意味でいいんですよね。 しかしこれってどういう使い道があるんだろう。 空列と空集合を明確に区別したい時とかかな‥
>>137 コマンドライン文字列をパーズしたときに、
-p password ってあったら SOME("password") にして
-p だけだったら SOME("") にして、
そもそも -p がなかったら NONE
とか。
勿論、optionを使うところは全部例外を使った実装に
置き換えられないことはないんだけど、optionの方が
素直な場面は結構ある気がする。
139 :
inaian :03/10/23 23:37
自然数 n,m を入力して、n に一番近い m の倍数を求める関数 nb(n,m) こういった課題があるんですがわからないでしょうか?? rubyでなんです。 これができないと単位取れません。 適当でもいいんでお願いします。
全くスレ違い。宿題スレ行け。 人に聞く前に、 どうやったらnに一番近いmの倍数を求めることができるか ruby使わなくていいから、自分で考えて日本語で説明してみろ。
>>139 let nb n m =
let r = n mod m in let q = n / m in
if r > m - r then (q + 1) * m else q * m
失礼。キャッシュが残ってました。
144 :
デフォルトの名無しさん :03/11/05 00:39
ocaml-3.06 で cygwin で使ってるんですが、 syntax error しただけでインタプリタとかコンパイラがこけてしまいます。 インストール時にも ocamldoc がうまく入らなかったり、 (same file とか言って怒られて make が止まります) tkをどこから持ってきたらいいのかわからず、ocamlbrowser もコンパイルできません。 もう何がなにやら・・・。 どなたか解決の糸口だけでも教えてもらえませんでしょうか。
145 :
デフォルトの名無しさん :03/11/05 01:14
linux使え
146 :
デフォルトの名無しさん :03/11/05 03:08
>>145 そうおっしゃらずに・・・
自分もできれば FreeBSD で済ませたいところを我慢しているのです・・・
ocamlbrowser は ActiveTcl を使えば何とかなりました。
それでもコンパイルエラーが出ますが、軽微な修正で何とかなりました。
ocamldoc も無事入りました。
が、肝心のインタープリタがこける問題はどうしても直りません。
しばらくは minGW 版のバイナリで我慢します・・・。
>>141 let nb n m =
let distance a b = if a > b then a - b else b - a in
let rec nb_rec n m i min_dist =
if i / m = 0 then
if (distance i n) < min_dist then nb_rec n m (i+1) (distance i n)
else nb_rec n m (i+1) min_dist
else
if i > n + min_dist then min_dist else nb_rec n m (i+1) min_dist
in
nb_rec n m 0 m
ぐらいがちょうどいい解じゃないでしょうか。
Mingw版とかじゃだめなのですか?
>>148 Unix モジュールをフルに使いたくて・・・。
どのあたりまでサポートされているのかよくわかってはいないのですが・・・。
関数型言語で書かれたOSってある?
良く知らないけどGeneraって違うのかな?
あ、Lispっていう段階で微妙だった…
154 :
デフォルトの名無しさん :03/11/08 23:16
皆さん 今晩は。はじめまして。 Objective Camlの最新版をWin98にVC++コンパイル ヴァージョンー>InstallExeにてインストールしました。 残念ながら日本語の文字列が文字化けします??? ひとつ教えて頂きたいのですが、 EUCやSJIS変換コードをCamlのライブラリーに入れたら 日本語が使えるようになるのでしょうか? どなたかどのパッケージを、どうしたら 日本語が使用できるようになるのか ご教示願います。
>>152 Lispで書かれたOSみたいですね。しかもVM上でしか動かない…
各言語を比較してるサイトでOCamlがCをいろんな面で越えてたんで
OCamlでOSを書いてみようかと思うんだけど。
156 :
デフォルトの名無しさん :03/11/09 22:33
最後の結論が驚くほど陳腐なのだが。
OSを書ける程のフレキシブルな処理系はまだないだろう。
ML では書けない様な一番 core な部分だけアセンブリで書いて その上を ML で書くようにすればまあなんとかなるだろう(多分)
161 :
デフォルトの名無しさん :03/11/10 15:30
>>156 〜158
>プログラム板のあちこちで話題になっていた、ここの関数型言語論も
>一応完結したようですね。
>
http://homepage3.nifty.com/Aransk/ 外側のNILと内側のNIL間の関数構造という着眼点はまあまあ。
しかし、JavaWorkShopではコードを書き過ぎて、哲学派の顰蹙を買い
FunctionalLanguageではコードが少な過ぎて、プログラム派に
とっては抽象論過ぎる。これまで水と油であったものを融合しよう
という心意気だけは理解できるが。
163 :
デフォルトの名無しさん :03/11/10 21:03
164 :
デフォルトの名無しさん :03/11/10 21:08
ICFP2003に米研は参加しなかったのだろうか?ぼそっ
165 :
デフォルトの名無しさん :03/11/10 21:17
誰か154に応えてやればぁ? 前回の板かなんかで「OCamlはもちろん日本語も 通ります!」って調子の良い発言していたのが いたはずだが?
>>150 ありがとうございます。
マニュアル読めよクソ、ってとこですね。
168 :
デフォルトの名無しさん :03/11/11 16:05
>>167 悪い。関数型言語で何もせずに日本語が通るのは
ACLとSCMしかワシャア知らんですたい。MLではF#
とMLJぐらい?使ったこと無いけど・・。
169 :
デフォルトの名無しさん :03/11/11 16:19
>>167 貴方ひょっとして、この86番さん?
>86 名前: 83 投稿日: 02/02/05 06:44
>> 84
>もちろん日本語は通ります。
>EUCならば変数名にすらできます。
>(そんな面倒なプログラミングはしないけど)
結構こだわるタイプか??(藁)
日本語が通るってどういうことか知らんけど EUCのstringは使えるよね?
graphics モジュールで日本語フォントは使えますか? みんな LablGtk 使っているのかな。
あ、それかマルチバイト関係もサポートしている X11 ライブラリがあると嬉しい。
X11なんてつかわねーよ
174 :
デフォルトの名無しさん :03/11/12 14:54
>>170 154番です。
例えば:
# print_string "Hi";;
と英文でToplevelに文字列を入力する。
と、
Hi- : unit = ()
まともにHiが返ってきますよね?
ところが、
# print_string "今日は";;
と日本語の文字列を入力すると:
今日は- : unit = ()
ギョエー!!!まともに返って来た!
信じてください。Ocalmをインストールした直後は
確か、\142F\236G・・・とか完全に文字化け
していたんです。ホントなんですぅ。
でもってすっかり日本語はダメだって
信じてしまった。(168番さんの発言もあったし
・・とか早速、人に転嫁する。良い性格?)
でもお騒がせしました。
穴があったら入りたい。汗汗汗。
今後決してこのような無様で頓珍漢な質問を
この板で発言するようなことは、絶対に
「またやります!」ので。
これにめげずにOcalm頑張ります。(WWW)
175 :
デフォルトの名無しさん :03/11/12 16:32
初めてこのOCaml本を見ました。
http://pauillac.inria.fr/caml/oreilly-book/html/index.html 全ページ公開しています。
(スゴイボリューム!誰か日本語訳してくれないかなぁ。)
それにしてもLispやSchemeの本でも全ページ
WEB公開しているのがあります。(グレアムやディビック)
Rubyも最初のRUBY本ぐらいやったらどうかねぇ?(Matsz)
例えば、欧米の大学にマイクロソフトなんかで開発の
最先端に従事しているエンジニアなんかが招聘され、
講師でバリバリKnowHowを学生や研究スタッフに
教えたりする。C#を作ったヒジェルバーグとか。
(給料が違い過ぎるので現実的ではないが、特に
日本では、藁)
そこの研究室が画期的なソフトや開発手法を発表
したりするとか、ヴェンチャーを立ち上げたり
すると企業の研究所と大学の研究室の存在意義
とか有償、無償区分とかよう分からんような
気がする。
先に述べたOCaml本なんか普通の有償ソフトに
ついているマニュアルなんかを完全に凌駕している。
>>175 Matsz ではなく Matz。
あと、Ruby 界隈では PragmaticProgrammers の本が全文公開されてます。
178 :
デフォルトの名無しさん :03/11/12 21:33
>>175 ,170
肴にされた168番です。(笑い)
# "Hi";;
- : string = "Hi"
# "今日は";;
- : string = "\141。\147\250\130ヘ"
コリャ?どうしてこうなるの?(大笑い)
>176 >この文体には見覚えが・・・ >本人? MatzがMatszなんてわざと間違えるわけないでょう?(笑い) >177 >Matsz ではなく Matz。 失礼しました。ご指摘深謝。 >あと、Ruby 界隈では PragmaticProgrammers の本が全文公開されてます。 英語はどうも・・・やはり日本語で読みたいと思いませんか?
スキャンしてnyで垂れ流せよ
>>175 文句があったら自分で書いて公開しろよボケ。
日本でもSRAの石井さんが書いたPostgreSQLやPHPの本はPDFが公開されていたと思うぞ。
後者は共著だったような。
情報狭いくせに日本語としてつながりがおかしい愚痴を垂れ流すだけなら独り言板にでも行け。
このスレ的に意味があるのは最初の3行だけだしそれすら禿しく既出。
182 :
デフォルトの名無しさん :03/11/13 10:34
>>178 エスケープされてるだけですが
# let s = "なにか文句でも?";;
val s : string =
"\164\202\164\203\164\171\202\184\182\231\164\199\164\226\161\169"
# print_endline s;;
なにか文句でも?
- : unit = ()
irb(main):001:0> s = "なにか文句でも?" => "\244\312\244\313\244\253\312\270\266\347\244\307\244\342\241\251" irb(main):002:0> puts(s) なにか文句でも? => nil irb(main):003:0>
184 :
デフォルトの名無しさん :03/11/13 15:31
>>182 、183
>エスケープされてるだけですが
エスケープされてるって、・・・絶句。(笑い)MLでは日本語が通るってことは
エスケープ文字も含むのでしょうか?(^^; 例えば:
# print_string "baka";;=> baka- : unit = ()
# print_string "馬鹿";;=> 馬鹿- : unit = ()
これはOK! でも、
# let baka = "baka";;=> val baka : string = "baka"
# baka;;=> - : string = "baka"
# let baka = "馬鹿";;=> val baka : string = "\148n\142ュ"
# baka;;=> - : string = "\148n\142ュ"
Charなら分かるが、同じstringでこれはちと面白過ぎると思いませんかね?
さらに細かいことを言えば、FontがDefaultでCourierになっており、立ち
上げる度に元に戻るところなんか、いかにもフランス的な感じがしませんか?
OCamlやSMLに文句言ったりケチをつけたりする気は全く「あります。!」(笑い)
可愛さ、あまってですよぉ。一応これでもOCamlマンセイ派のつもりです。
185 :
デフォルトの名無しさん :03/11/13 15:33
>>180 >スキャンしてnyで垂れ流せよ
NewYorkではなく、Parisの間違い?(^^;
>>181 >文句があったら自分で書いて公開しろよボケ。
文句はありません。でも既に書かれているものを公開した方が早いんで無いかい?
>日本でもSRAの石井さんが書いたPostgreSQLやPHPの本はPDFが公開されていた
>と思うぞ。後者は共著だったような。情報狭いくせに日本語としてつながりが
>おかしい愚痴を垂れ流すだけなら独り言板にでも行け。
日本語のつながりがおかしいのは最近OCamlを始めたのが原因か?(笑い)また
単なる愚痴じゃなく、今売り出し中のRubyのMatzに要望しておるだけです。
(但し日経バイトに載ったMatzのコンピュータ言語論にはガッカリした、前田さんの
卒論の方がはるかに良かったと思いませんか?ー>情報の広い181番さん!)
ところで貴方には何の期待もしておりませんのでご安心下さい。ただこのいかにも
2チャンネルらしいオモロイレスには笑えたが。(大藁)
>このスレ的に意味があるのは最初の3行だけだしそれすら禿しく既出。
禿るほど老けとらんのですが。ただこの文章の意味が理解できるほど幼稚では
ないだけ。(^^;
186 :
デフォルトの名無しさん :03/11/13 15:42
>>175 こら、こらぁ!いつも他所サマでは調子に乗るな!って
言っとろうがぁ。(^^;
ここはAwayじゃけん、観客をカッカさせちゃ悪かろう。
・・・とか、ますます煽ったりしてね。(大藁藁)
>>185 あなたが日本語下手なのは昔からでしょ。(笑い)
Matzに対する要望ならこんなところに書かずに、
本人にメールでも送ればいいのではないですか?(そんな
勇気ないのかな。大笑い)
日本の大学でも哲学的、論理的な文章を教えないようで、(東大、京大
でさえもしても他大学においてや、)
ソシュールとレヴィストロースのポストモダン区別もわからないようで。(笑い)
人間関係と言うものは代数的構造に置きかえらるもので、今回のことも
さもありなん。(笑い)アーベル群の単位元である空=零=逆写像との原点にあたるのです。
ゾロアスター教のアフラマツダ=ツァラトゥストラ=大日如来。ゾロアスター教の2元論。
つまり、アフラマズダとその逆関数としてのアーリマンの対立の特異点なのです。
車メーカーのマツダがMazudaなのはアフラマズダからにちなんでです。マツダと言う苗字は、
ともても、暗喩的でしょ。(笑い)
ツァラトゥストラはかく語りきをかいた。ゲーテはフリーメイソンでIQ200だったそうです。
そんなわけで馬鹿の壁にはばまれた抽象的思考の苦手な日本のプログラマーには難しいのであります。
話しは戻って荒らしいるつもりなのでしょうか?(笑い)
なんだこいつ。分裂病か? どうせ書くならごるごるもあみたいに面白いこと書けよ。
>>190 なるほど納得。そいつは Lisp Scheme スレで電波認定済みだよ。以後放置。
なんか変わった人が来たなあ。 言語理論に詳しそうなので期待しよう。
>>192 とっくに自作自演がばれているとなぜ気がつかないのだ? このスレで「(笑い)」
なんて書いてるのおまえ(とおまえをネタにしてるやつ)だけだぞ。
ありきたりだが「馬鹿は放置」
>>194 >「馬鹿は放置」
というより基地外だけどね
>>195 > >「馬鹿は放置」
> というより基地外だけどね
というよりキテガイだけどね
>>196 新興宗教とかに簡単に引っ掛かりそうな壊れっぷりだよな
とにかくモノを知らんのには唖然
お願いです。客観的に自分を見てください。 書き込む前に、1時間ほどおいてみてください。
ここ、こんなに人がいたんだ…。 ついででいいから、MLの話もしていきませんか〜。 コンパイラのソース解読とか。
理由は簡単、 print_stringとインタプリタの文字列表示の実装が違うから。 インタプリタでは、制御コードとかを直接出力しないようになっている。 文字列を1文字ずつ見ていって、標準文字 or 記号 or フランス語に含まれる一部の文字(アクサン等を含む) でなければエスケープして出力。 print_stringは一切の変換を行わずに直接出力。 これを変えたければ#install_printerとかソースコード/toplevel/で調べてみてくれ。
一応補足だが、半角カナが表示されるのはアクサンのコードに当たるから。
>>200 ,201
みんながんばって沈黙してたのに、我慢できなかったんだね
よしよし
203 :
デフォルトの名無しさん :03/11/14 15:23
>>187 >あなたが日本語下手なのは昔からでしょ。(笑い)
ギョエー!過去を知る貴方はひょっとして?茶々様か?(謎)
>Matzに対する要望ならこんなところに書かずに、
>本人にメールでも送ればいいのではないですか?(そんな
>勇気ないのかな。大笑い)
セレブな方に弱くて…Cマガのフィンローダさんでも緊張したぐらいです。汗
>日本の大学でも哲学的、論理的な文章を教えないようで、(東大、京大
>でさえもしても他大学においてや、)
特に米研はひどいって噂ですよねぇ?(藁藁)
>ソシュールと(中略)日本のプログラマーには難しいのであります。
相変わらず頭脳の回転に言葉が追い付かないクセは直りませんねえ?
アボートしているの?(大笑い)
>話しは戻って荒らしいるつもりなのでしょうか?(笑い)
いえ最近「真摯に」コンピューター言語に嵌っております。キッパリ
204 :
デフォルトの名無しさん :03/11/14 15:24
>>188 >なんだこいつ。分裂病か?
>どうせ書くならごるごるもあみたいに面白いこと書けよ。
真面目に書いて支離滅裂なところを評価して上げなさいよ。(藁)
205 :
デフォルトの名無しさん :03/11/14 15:26
206 :
デフォルトの名無しさん :03/11/14 15:27
>>191 >>190 なるほど納得。そいつは Lisp Scheme スレで電波認定済みだよ。以後放置。
191番さんは電波無し?スゴイね手書きかぁ。
207 :
デフォルトの名無しさん :03/11/14 15:28
208 :
デフォルトの名無しさん :03/11/14 15:30
>>193 >とっくに自作自演がばれているとなぜ気がつかないのだ? このスレで「(笑い)」
>なんて書いてるのおまえ(とおまえをネタにしてるやつ)だけだぞ。
自作自演がミエミエなんだよぉ!
209 :
デフォルトの名無しさん :03/11/14 15:31
>194 〜197 でも優越感に浸りながら皆さん結構楽しんでいるでしょう? (笑い) >198 >お願いです。客観的に自分を見てください。 >書き込む前に、1時間ほどおいてみてください。 その一時間でさらに分量が増えたらどうするの? >199 >ついででいいから、MLの話もしていきませんか〜。 あのぉ。MLの話しをしているつもりなんですがぁ。
210 :
デフォルトの名無しさん :03/11/14 15:39
>200 、201 >理由は簡単、 有り難う御座いました。了解です。 それにしても、たったこれだけのことを聞くのに スゴイ手間食うんだね。国立大学の研究予算取り並か? (大笑い)
211 :
デフォルトの名無しさん :03/11/14 16:15
l ̄i\. / ̄\ .| ̄さいたま新都心 / \ |三|ミl─( ゚ ∀ ゚ )─ | 田田 |п_ /" _ . \ .|三|ミl三三三三|\ | 田田 |幵л / 時の鐘 岩槻 \ |三|ミl三三三三| | 田田 |幵幵| / /\ 人形 \三|ミl三三三三| | 田田 |幵幵| / /---.\ \ │ /\|ミl三三三三| | 田田 |幵幵| /  ̄"''\/|| ■ |||\ / ̄\ \l三三三三| | 田田 |幵幵|_/川越祭 i||゚ ∀ ゚||i ̄"'' .( ゚ ∀ ゚ )─ \..三三三| ∧∧ ∧∧.|幵幵/Λ Λ/ ̄"''\ / ̄"''\ (∩∩) \ 三三|(.゚∀゚,≡,゚∀゚) -''"/ ( ゚∀゚_)|| ̄ |_ _|.|| ̄ ̄|__|| ∧∧ ∧∧ \==.|. ∧∧∧∧∧/. /〔 祭 〕〕⊃~~~~~~~~~~~~~~ ( ゚ ∀ ゚ ) ( ゚ ∀ ゚ ) \..|< さ > /二二ヽ/ ̄"'' (∩∩) (∩∩) < . の い >/ /\」;; 古都川越 ――――――――――― < 予 た .>―――――――――――― / ̄\ < 感 ま > 花の秩父 | 十 :::| < !!!! の > +++++++ ウマイ、ウマスギル!| 万 :::| < > *******++++++++ 秩父夜祭 | 石 :::| /∨∨∨∨∨ \ ******゚∀゚*+*** Λ Λ \_/ /甲武信岳2475m \ ********+**** ( ゚∀゚_) ┏━━━━━━━━━┓ / ,-ー-、_ \*+***++**** /〔 祭 〕〕⊃ ┃さ い た ま 銘 菓 .┃./ /::`v-、' ::':::::.\、 \ 秩父芝桜 /二二ヽ ┃_|_ ┬─ ┬─ ┃/ /::' ::丶 ,-へヘヘ、 \ ..、、。_.._.. ┃ | .ノフ ノ口 . /-´::'' :::`/ ::':::\ \、/..●..●●●●\ ┃ 食曼 豆頁 __/ 雲取山2017m 両神山1723m\ \●●●゚∀゚●●‘ ┗━━━━━━━━/. いずれも日本百名山 ::'::\. \●●吉見百穴
>203-210 何一人で錯乱してんの?スレ違いですよ.
213 :
デフォルトの名無しさん :03/11/14 22:29
まあこの板も細々とやっとるから、あまり大きなことは言えん。
もう、なんか必死だなw そこまでして宣伝したいか?
(笑い)
(´・ω・`)
217 :
デフォルトの名無しさん :03/11/15 05:03
Obj.magic
let ret hojikuru_content content = hojikuru_content content.detail こんなことしてても値は返ってこねぇ
219 :
デフォルトの名無しさん :03/11/15 16:36
220 :
デフォルトの名無しさん :03/11/15 22:39
蒸し返すみたいで悪いんだけどさ。彼はむしろ「日本語も、もちろん通ります。」 って言う、ユーザーに誤解を与えかねない言語に対する「安易な耽溺」に意義 申立てをしたかったんじゃないだろうか? 確かに五十嵐先生の OCaml入門にもはっきり「コメント,文字列定数として 日本語を用いることができる.しかし,文字列に関しては,文字数などが正しく 認識されないのでできれば使わない方が無難である.」と書かれている。 またいくら贔屓目に見ても、「print_stringとインタプリタの文字列表示の実装 が違うから。インタプリタでは、制御コードとかを直接出力しないようになって いる。文字列を1文字ずつ見ていって、標準文字 or 記号 or フランス語に含ま れる一部の文字(アクサン等を含む)でなければエスケープして出力。 print_stringは一切の変換を行わずに直接出力。」 これで「勿論日本語は通ります。」とは普通言わないよね?単に言語に対する 贔屓の引き倒しが気になるタイプじゃないの。
>蒸し返すみたいで悪いんだけどさ。彼はむしろ 「彼」、って君本人じゃないのか
>219 〜222 (大笑い)
225 :
デフォルトの名無しさん :03/11/16 11:31
>220〜224 これほど笑えるのは久し振り。
226 :
デフォルトの名無しさん :03/11/16 12:14
ギョエー!!!
なんか意味不明なレスがいぱーいあるなと思ったら 日本語が通らない方がいらっしゃったのですね
229 :
デフォルトの名無しさん :03/11/17 13:54
>220〜228 これ全部一人で書いてる!なんて不気味なことはないよね? 常連はひたすら沈黙を守るのみ。って発言しちゃマズイか(藁藁)
230 :
デフォルトの名無しさん :03/11/17 14:40
変な人々は取り敢えず置いといて、マッタリとOCamlモードに 戻りましょう。(藁) 五十嵐先生の入門書に、以下Quote: # let one = 1;; val one : int = 1 # let two = one + one;; val two : int = 2 # let one = "One";; val one : string = "One" # let three = one ^ one ^ one;; val three : string = "OneOneOne" この場合,one の値は 1 から "One" に更新されたわけではなく, 同じ名前の変数宣言により前の宣言が隠されて見えなくなっただけ なのである.そもそも前の宣言と型が一致していないことに注意. 以上Unquote: ここでint = 1は新たに束縛されたstring = "One"によって 隠蔽されている「だけ」とある。そこで質問です。 int =1を再度呼び出すにはどうしたら、良いのでしょう? (もう一度 # let one = 1;;は無しで、(W) まさか?super oneとか?それとも?cadr one!とか?(藁藁) 密かにガーベージコレクションにかかって実は抹殺されている! とか???(大藁藁)
>>230 ギョエー!!! まだコイツいるよ。みんなスルーしる。
232 :
デフォルトの名無しさん :03/11/17 16:05
うぜええええええええええええええええええええ。 もう見えない。見えない。そいつなんか見えない。 俺の視界には入らない。
さふいふあなたに、専用ブラウザ。
(笑い)(藁) などを閉じ括弧も入れてNGワード登録しる
235 :
デフォルトの名無しさん :03/11/17 18:38
OCaml から C のライブラリを使いたいのですが、結構面倒くさそうですね。 こんなもんなのかな。
こんなもんでつよ。 ほかの言語でも。
238 :
デフォルトの名無しさん :03/11/18 15:22
>231〜235 230の疑問はOCaml初心者には当然と思うが? 皆さん、実はこの板における、お囃子社中? 本当はOCaml分かっている人間はこの板には一人しか居らず その人は論文の締め切りに追われてカキコする暇が 無いとか?案外これ当たってないかい?(藁、藁)
241 :
デフォルトの名無しさん :03/11/18 21:52
インタプリタとコンパイラの文法をあわせるとこんな感じだろうか。 # let x = 3 in;; val x : int = 3 # let x = 4 in;; val x : int = 4 # x;; - : int = 4 # end;; # x;; - : int = 3 きっと余り嬉しくないだろうが。
243 :
デフォルトの名無しさん :03/11/18 22:30
>>242 自分がどこまで書いたかすぐに分からなくなりそうだ。
インタプリタとコンパイラの文法って違うの?
245 :
デフォルトの名無しさん :03/11/19 14:30
>239,240 早速作者にメールしました! 論文の締め切りに追われておられるとの ことです。やっぱり誰か?と一緒で要領が 悪いのか?それとも、頭自体が悪いのか?(藁藁)
246 :
デフォルトの名無しさん :03/11/19 14:32
>242 ご教示,誠に有り難く、このように嬉ばしい 結果がお蔭様で…?? # let x = 3 in;; Characters 12-14: let x = 3 in;; Syntax error # let x = 4 in ;; Characters 13-15: let x = 4 in ;; Syntax error # x ;; Characters 0-1: x ;; ^ Unbound value x # end ;; Characters 0-3: end ;; ^^^ Syntax error # x ;; Characters 0-1: x ;; ^ Unbound value x ひょっとしてOCamlじゃなくてSML/NJかHaskellと 誤解されておられませんでしょうか?(藁)
あのー、キチガイは確かにウザいんですけど、キチガイが表れると 馬鹿の一つ覚えで成り済ましに走る人はもっとウザいです。 つーか成り済ましが出るとスレの流れが停滞するからやめて
(藁、藁)
(藁 . 藁)
>>247 つうかさ、キチガイいじるくらいしかネタがないのがこのスレの悲しいところだな。
で、ネタがないので
>>200 とか
>>242 が我慢しきれなくなって答えちゃう。
で、またキチガイ出現。このループ。
251 :
デフォルトの名無しさん :03/11/19 21:30
>>247 〜250
皆さんをいじるつもりはありません。(藁)
が、皆さんのTopLevelではエラー無しで動いているのでしょうか?
比較的?マトモに見える、244さん!どう?
よく分かりませんが、誰かが異常な勘違いをしていることだけは確かなようです。
253 :
デフォルトの名無しさん :03/11/20 08:06
なんだか質が落ちましたね。
質をあげるために(多分まともな)質問。 #trace f;; で f を追跡できますけど、 let f () = let g () = ... in ... g() などのような、関数内で定義された関数を追いかけるにはどうすれば良いのでしょうか
255 :
デフォルトの名無しさん :03/11/20 13:56
letの後ろにrecは要らないのでしょうか?(藁)
256 :
デフォルトの名無しさん :03/11/20 14:42
>>252 ,253
この板の冒頭:
>ML をこれから学ぶ人もどうぞ。
こう書かれております。
最近の新人は実に可愛げのないのが多い。
それは良〜く分かる。(藁藁)
「極度に!」可愛げのない彼の質問だが、
初心者に良くありがちな勘違いだと思う。
お二方には常識かも知れんが、ここは一つ
ビギナーでもTopLevelで動かせるプログラムを
示してやって下さらんか?
257 :
デフォルトの名無しさん :03/11/20 15:07
ocamlexc って使ってる人いませんか? 附属の stdlib なら動くんですが、これを ocaml-3.07 のものに入れ替えると Syntax horror って怒られるんですよ. 文法が変っちゃったからですかね? test@local:/tmp/ocamlexc[177]> gmake install ./bin/makelibcme Analysing: stdlib/pervasives.ml ... Characters 1036-1038: Syntax horror DONE Analysing: stdlib/list.ml ... Unbound (while scoping) module Pervasives DONE
>>254 多分無理です……。あきらめてください。
>>255 なんで要るの? この場合別に書く必要ないでしょ (書いてもいいけど)。
let g () = ... g() じゃなくて let g () = ... *in* ... g() なんだから。
笑ったつもりが笑われる罠。突っ込むならもっと勉強してくれ。藁ダメゼッタイ。
rec つけると最適化に抑制がかかるので不要なら rec をはずそう。
>>256 let rec foldr f v = function
[] -> v
| x :: xs -> f x (foldr f v xs);;
foldr (+) 0 [1;2;3;4;5;6;7;8;9];;
とかやって遊んでください。
というか、冒頭のリンクの中にいっぱいいっぱいいーっぱい例があると思うんだけど。
まあ最初は print_endline "Hello, World!";; とかやってください。
>初心者に良くありがちな勘違いだと思う。
いや、ゼッタイないから。普通に勉強したぶんにはその発言はゼッタイないから。
>>257 ごめんなさい。使ったことないです。
(藁) のせいでスレ荒れまくり。あーあ。
259 :
デフォルトの名無しさん :03/11/20 18:10
>>258 > rec つけると最適化に抑制がかかるので不要なら rec をはずそう。
あ、そーなんだ。byte でも opt でも?どれくらい違う物なんだろ。
rec を使って定義した関数はinline 展開されなくなったような気がする。 覚えてないけど。
261 :
デフォルトの名無しさん :03/11/21 03:50
>>257 ざっと ocamlexc 見てみた。
external 関数 (C 言語等の関数を呼出すための物で ML での定義が無いもの)
の exception raising 情報は、ML のソースが無いんだから分析しようが無い。
型情報のなかに明示する必要がある。ocamlexc の stdlib/pervasives.ml を
見てもらえばわかるけど、ocamlexc では external な値の型宣言の文法が
変更されていてこの情報を書き込む事になってる。この文法は正式な ocaml
にはもちろん入っていないので syntax error になる。
と言うわけで 3.07 の stdlib/*.ml の external 宣言の部分を書き直せば
動くんでないかい? let module 構文がサポートされてないから
その辺りも拡張しないといけないが、まあ、いい演習だと思って
自分でやるか、 Francois Pessaux にメールを書いてちょーだい。
このスレ見てると東大生でも程度低い人が多いことがよくわかるな。
そんなの、このスレ見なくてもわかるだろ。
東大叩きはうざいのでどっか逝って下さい。
265 :
デフォルトの名無しさん :03/11/21 15:27
>>258 >(藁) のせいでスレ荒れまくり。あーあ。
貴方は今、巧みに論点をずらそうとしましたね?
(藁藁)
266 :
デフォルトの名無しさん :03/11/21 15:29
>>262 ,263,264
いや他の研究室の方々は優秀です。キッパリ
落研と並んで泣く子も、「笑う」あそこだけです。(藁)
267 :
デフォルトの名無しさん :03/11/21 15:30
OCamlネタばかりでSML派が拗ねるといけないので、真摯な SML初心者の質問を一つ: 何故?マイナスを表わすのにチルダ「~」記号なんでしょうか? まさか!プロンプトがマイナス記号だったからとか ふざけた理由じゃないでしょうね?(藁)
268 :
デフォルトの名無しさん :03/11/21 19:12
>>267 二項演算子が ~ でなくて - であることに
質問者がどういう考えを持っているのか、逆に訊きたい。
269 :
デフォルトの名無しさん :03/11/21 20:56
>>268 ワタクシ、質問は好きだが、されるのは好まない。
が、…
まさか!中置演算子だからプロンプトと間違えようがない。
なんて応えを期待してはいないでしょうね?(藁藁)
270 :
デフォルトの名無しさん :03/11/21 21:30
>>268 の問題をよく考えれば、なぜ SML では単項マイナスを
二項マイナスと区別する事にした理由と、なぜ Caml では二つの
区別がないが、時々 (-1) のように括弧が必要かわかるんだけど。
思考停止して質問だけ、そう言うのは「真摯な質問」とは言えんな。
271 :
デフォルトの名無しさん :03/11/21 21:34
>>270 符号と演算子を区別できたら字句解析やりやすいからね
273 :
デフォルトの名無しさん :03/11/22 00:49
>>271 いよいよOcamlの時代到来ってことですかね!
f 2 -3 と f 2 (-3) は違うんだぞ、みたいな。 でも実は OCaml では単項マイナスは (~-) として定義されていて、 syntax sugar として -3 の様な表記も認めている。 だから f 2 ~-3 等が通る。 (+) 2 -3 と (+) 2 ~-3 で確認してみよう。 Pervasives.ml では external (~-) : int -> int = "%negint" と書かれている。
275 :
デフォルトの名無しさん :03/11/22 14:48
>>270 ,272,274
ご丁寧なるご解説有難う御座います。
お陰様で単項演算子、符号等の仕組みも分からぬ
初心者にとりましては、何よりのご教示で御座いました。
で、…
再帰的?に小生質問の趣旨を明確に致します。
>符号と演算子を区別できたら字句解析やりやすいからね
こ、これは、あまりにも、人間の言語的感覚に反しておりません
でしょうか?と小一時間問い詰めたい訳であります。
つまりあの高踏的でもって鳴るSchemeで「さえ」、単項マイナスは
「-」であります。あの前置演算子でも(+ 1 2 3)人間の理解の
範囲です。後置演算子(Forth?)でも( 1 2 3 +)分かる!、いや
日本的と称しても良いでしょう。つまり語尾に拠って大逆転
が有り得る。(藁藁)
しかるに「~3」これを誰が理解し得ようか?と問いたい訳です。
MLやった奴は誰でも知ってる!って?そりゃ。まあ…。(藁)
数ある他の言語に対して、パーサーを一寸いじれば済む問題を
なぜ敢えて異を唱えて「~」こんな想像を絶する符号しか
使用を認めないのか?OCamlスタイルも簡単に可能な訳でしょう?
確かにこれはSML言語仕様コミッティーの問題であります。
単なる初心者が容喙する話しではないかも知れません。しかし
SMLの更なる発展を祈念致しまして、敢えて一言申し上げた次第
であります。(大藁藁)
カリー化って知ってる?
>こ、これは、あまりにも、人間の言語的感覚に反しておりません >でしょうか?と小一時間問い詰めたい訳であります。 お逝きなさい! 関数適用が f x y という形であるので単項と二項の区別がどうしても 必要なのだ。区別しなければ次の式はどのように解釈するのだ。 f 1 - 1 f 1-1 f 1 -1 数字だけならともかく、変数が入ったら? f x - y f x-y f x -y パーザをちょっといじれば済むって? どこをちょっとだけいじれば済むのかな? 勘違いしているかもしれないから言うけど OCaml で (+) 2 -3 は型エラーですよ。(+) 2 ~-3 は通るけど。
278 :
デフォルトの名無しさん :03/11/22 17:31
>>275 貴方は今、ネット・テクニック「だけ」で論点を
ずらしましたね?サーバー容量だけ食って不可価値は
極端に低い発言と思う。自分でさあ、この板の質を
落としているのに気付かないのかねぇ、この人?
で、質問されるの嫌いなあなたに質問するが、 あなたは f x-y がどのように関数適用されるべきとお考えで? 1. f x (-y) 2. f (x-y) 3. (f x) - y 今の実装は 3 ですがね。 f の型を見て決定、っていうのはなしですよ。というか、無理ですよ。 構文解析が決まらないと型が決まらないんだから。
280 :
デフォルトの名無しさん :03/11/22 17:34
>>275 無駄な部分を除くと 1/10 以下に圧縮可能な発言はやめなさい。
屑だから。
>>278 >不可価値は極端に低い
それは間違いだ。「不可」価値は異常に高い。
おまいらキチガイにレスするのやめてくれないか
283 :
デフォルトの名無しさん :03/11/22 18:38
皆さん!(実は一人かもね?) カリー化って本家は、Haskell Curryでしょう? で、Haskell98Reportを以下Referします。 The special form -e denotes prefix negation, the only prefix operator in Haskell , and is syntax for negate (e). The binary - operator does not necessarily refer to the definition of - in the Prelude; it may be rebound by the module system. However, unary - will always refer to the negate function defined in the Prelude. There is no link between the local meaning of the - operator and unary negation. Prefix negation has the same precedence as the infix operator - defined in the Prelude (see Table 4.1). Because e1-e2 parses as an infix application of the binary operator -, one must write e1(-e2) for the alternative parsing. Similarly, (-) is syntax for (\ x y -> x-y), as with any infix operator, and does not denote (\ x -> -x)---one must use negate for that. 小生は単にチルダ「~」これが気に入らんと言う実に不可価値の 「ある」主張をしておるのです。negateなら誰でも理解出来るで しょう?しかしチルダって、べき乗か?ひょっとすると虚数か? ひどいのはゴミか?とかさぁ(藁藁)言語学的に無理があると 申しておるのです。あまりゴチャゴチャ言うようならこのML板に 居座るからね。(大藁藁)
284 :
デフォルトの名無しさん :03/11/22 18:42
>>283 ナッゲーヨ!
英語を引用すれば誤魔化せるって考えてんじゃない?
内容理解してんだろうねぇ、この人!
>!(実は一人かもね?) こんな勘繰りするぐらいなら、2ちゃんに来なきゃ良いのに・・・。
ゴチャゴチャ言ってるのはおまえだろ というレスがいけないんだよな……。
sage
正直、haskellの\はキモチワルイと思うぜ。 というレスもいけなんでしょうね……。
SML や OCaml では lambda は何なん?
名前かえりゃいいじゃん
For C language...
小生は単にチルダ「~」これが気に入らんと言う実に不可価値の
「ある」主張をしておるのです。invert なら誰でも理解出来るで
しょう?しかしチルダって、べき乗か?ひょっとすると虚数か?
ひどいのはゴミか?とかさぁ(藁藁)言語学的に無理があると
申しておるのです。
という主張を
>>283 は批判してください。
殆どの言語はこういう変なものがあると思うんだけどな。
(define-macro (これがλだ! . body) (cons 'lambda body)) ((これがλだ!(x y) (+ x y)) 1 2) => 3
^ で XOR とかな
>>292 define-macro だって?
贅肉だらけの糞言語使ってるのな(プ
でも名前変えると、今まで\で慣れてきた万人(もいないか)のユーザーが困惑する。 ASCIIコード表に適当な記号が無いのだから、仕方のない事なんだよ。 それでも、というならパーサー弄るなりして適当に変えれば良いこと。
先に cpp 通すとかいう手もあるな。
>>294 こんな議論で盛りあがれないのが残念ですわ。
>>294 2ちゃん名物、根拠の無い優越感って奴だな…。実に痛々しい。
キチガイが暴れだすと、
>>294 みたいに影響される人が必ず出てくるな
しかし、この
>>291 の粘着っぷりは何なの?本人が空気読めない香具師で
ある事は痛いほど伝わってくるが。
いや、便乗して煽るのはやめようということっす。 それにしてもキチガイさんは一体何がしたいのやら…
煽りだけで
>>289 の答えをまだもらってないのだが…
ML系のlambdaはfnですよ。 LISPでいうdefunがfun。
やべ、コテハンにするつもりは無いのでこれで消えます。
OCamlでは LISPでいうlambdaがfun LISPでいうdefunはlet変数名の後に引数を続けるだけ(高階)。
あ、そうか。
>>304 あ,なるほど
そう言えば使った覚えがある
310 :
デフォルトの名無しさん :03/11/23 15:04
>>284 ホントは283の影じゃないか?
自分でばらしたりしてね。(藁藁)
>>285 〜288
君達も正直になろうね。(藁)
311 :
デフォルトの名無しさん :03/11/23 15:06
>>290 ,291,295
>パーサー弄るなりして適当に変えれば良いこと。
ほらぁ。出たでしょ。
チルダが嫌いとか、言ってた「彼」は結局この言葉を聞くのを
執念深く待っていたんじゃないかな?
ここにタムロしておられる方々は「ファインマン計算機科学」
を読んだこともないようだ!畏れ多くも「元号」を大学名した
ような大学の関係者じゃないのかな?(藁藁)
リストを順次処理するような場合、 例えばList.mapの様な処理をする場合、 先頭を処理して、末尾を再帰的に処理する let rec map f = function [] -> [] | a::l -> let r = f a in r :: map f l (* list.ml from ocaml 3.07 *) やり方と、無理矢理末尾再帰にする let map f ls = let rec this_iter xs result = match xs with [] -> result | hd :: tl -> this_iter tl (f hd :: result) in List.rev (this_iter ls []) やり方の2通り考えられますが、 (注:副作用がfにあった場合後者は直感的でない動作をする) コスト的にはどうなんでしょうか。 末尾再帰でスタックにアドレスを積まない分、List.revのオーバーヘッドが加わり メモリも余分に食う、となりますが、メモリ使用量の点からはどうなんでしょう。 メモリ使用量をプロファイリングする方法はocamlにありましたっけ?
(* いつもの *) let rec map1 f = function [] -> [] | x :: xs -> (f x) :: (map1 f xs) ;; (* CPS 変換 *) let map2 f lst = let rec map2_sub k f = function [] -> k [] | x :: xs -> let t = f x in map2_sub (fun y -> t :: y) f xs in map2_sub (fun x -> x) f lst ;; (* adhoc tail-call *) let map3 f lst = let rec map3_sub f result = function [] -> result | x :: xs -> map3_sub f ((f x) :: result) xs in map3_sub f [] (List.rev lst) ;; どれが早いでしょう。
let make_list n = let rec iter i l = if i < n then iter (succ i) (0 :: l) else l in iter 0 [] ;; let test f lst = let begin_time = Unix.gettimeofday () in for i = 0 to 1000 - 1 do f (fun x -> x + 1) lst done; let end_time = Unix.gettimeofday () in end_time -. begin_time ;; let _ = let lst = make_list 1000 in Printf.printf "map1 : %f\n" (test map1 lst); Printf.printf "map2 : %f\n" (test map2 lst); Printf.printf "map3 : %f\n" (test map3 lst); ;; 自分の環境 x86 Pen4 2.4CGHz での結果。 map1 : 0.194000 map2 : 0.209000 map3 : 0.298000 でも map1 は make_list 10000 にすると stackover flow で落ちる。
あ、
>>315 は ocamlc ね。
ocamlopt だと
map1 : 0.034000
map2 : 0.010000
map3 : 0.034000
となった。CPS 変換ばんざい。
と思ったけど map2 ってプログラムあってないぞ。
~が言語学的に無理があるという理屈が分からんのだが。 だったら英語の慣習から"!"は?"."も";"も可笑しっていう話になるだろ。 そもそもどの分野の言語学なんだ?意味論?記号論?比較言語学? どの分野の言語学でどう可笑しいかバックボーンとなる理論を元に説明してくれないと。
319 :
デフォルトの名無しさん :03/11/23 21:04
283 の言う「言語学」というのは、彼でも参加できる、恣意的な主張が 可能な議論としか思えないのでどうも参加する興味を覚えない。 別にそういう方向性でマッタリ雑談するのが悪くはないが、 プログラミング言語相手の議論であまりに形而上的な話をしてもねー。
283 って曖昧さの許されないプログラミング言語を触っている割には 曖昧な発言ばかりだな
…おまえら、283 はプライドだけは高そうだから、そういうことを 思っても言わないほうが良かったんじゃないか?恥を知ってるなら とっくに消えてるだろうしさ…。
322 :
デフォルトの名無しさん :03/11/24 03:43
なんとか面白そうな話題になるようにしようとはしてんだけど、、、 言語デザインに関わってると、新しい lexical symbol とか予訳語を入れる時、 製作チーム間で意見の違いが結構ある。まあ、議論の結果、最終的には 大体コードを書く奴の意見が通るみたいだ。 一般ユーザーはまあブチブチと後で文句を言うしかないわけだが。 SML で何故 ~ が採用されたか、逸話かなんかあれば聞きたい。 他の候補とかはなかったのかな? _ とか、、、 Caml なんかもう使われてない文字ってほとんどないんじゃない? 拡張して何か新しい事しようと思ったら大変だ。あと、 $%\_ 位かな? 後はもう組合せしかないよね。括弧類も既に ( { [ [| < [< とか、もう大変。
>>322 誰も演算子の記号なんかに興味ないのって、まだわかんないの?
個人で調べてくれよ。
どうしても知りたきゃSMLの開発側に直接問い合わせるとか、
サポートMLで聞いてみるとか。その方が早いし確実だろ?
だから、キチガイはスルーしろよ。どうせ建設的な話にはならないんだから。
そして結果を簡潔にスレに報告して還元しろ。 それが素直な話題提供ってもんだろうが。 おまえのやってることはただの粘着荒らし。
326 :
デフォルトの名無しさん :03/11/24 05:38
>> 323 んなこと言ったらこのスレの内容ってほとんど 本家 ML でやりゃいい事ばっかじゃない? (もしかしてこれは禁句なの?) まー演算子の話はもう終りでしょう。
328 :
デフォルトの名無しさん :03/11/25 14:35
>>313 ,318〜327
>お逝きなさい!関数適用が f x y という形であるので単項と二項の区別が
>どうしても必要なのだ。
逝かないのね?どうしてもこのレベルから先に逝かない。
せめて、
ttp://www.r.dl.itc.u-tokyo.ac.jp/~nakagawa/infoDB/dvildic.html この程度の陳腐なユーモアも無いのね?(藁藁)
OCamlにおいて何故チルダ~がマイナス単項演算子として
使用されているのか?チルダである必然性は何か?と
問われれば、当然「必然性は無い。」が正解でしょう。(藁)
何故必然性が無いのか?第一に考慮すべきはチルダ以外でも
マイナス符号でも言語実装としては可能である。これでしょう?
>単項と二項の区別がどうしても必要なのだ。
こんなものは言語実装にとって何の障害にもならない。
ファインマン計算機科学でプログラミング言語レベルから
ハードまで13層の階層があることを勉強されたでしょう?
つまり、プログラミング言語レベルはHumanInterfaceなんです。
例え関数がカリー化されようが、何されようが、実装に不可能は
無いのです。まずそれがピンと来るべきであります。
言語実装に不可能が無いにも関わらず、何故このような多様性が
生じるのか?これは日常言語の語彙とは違います。例えば「文化」、
中国語でも同じ「文化」です。しかし意味は歴史や風土から当然
違っております。日本は文化祭のイメージ、中国では文化大革命の
イメージ?かどうかは分かりませんが少なくとも、裸踊りが中国では
顰蹙を買うのであります。
しかしコンピュータ言語の意味は一意であります。ハード(物質)レベルで
同等であります。それにも関わらず何故語彙を敢えて変化させるのか?
このような疑問がどうして問われないのか?
>問うことは、それを問いうる、問うべき、とみなした
>ということにおいてすでに、問いの存在を認めない者たちとは
>違う認識水準を示してしまうことになる。
とまあ、本日はこれまでに致しましょう。(藁藁)
curry化を考えると演算子のとる引数の数は曖昧さがない方が良い。
↓
そこで値の負数をとる単項演算子と引き算の2項演算子のシンボルは別にしたい。
↓
〜というシンボルをnegateの機能にあてる事自体には必然性はない。
だが引き算演算子と違うシンボルである必然性は「言語の方針として」存在する。
あと
>>328 、君はソーカルが批判するような自然科学をでたらめに引用する人文系
学者のような匂いがする。なんとなく。
>>329 >あと
>>328 、君はソーカルが批判するような自然科学をでたらめに引用する人文系
>学者のような匂いがする。なんとなく。
しかもその素養足るべき人文系ですら!
サイエンス・ウォーズ... なつかすぃ。でもこのキチガイの場合は、自分の単 なる思いつきを必死になって権威づけようとしてるだけ。いずれにしろ、不毛。
332 :
デフォルトの名無しさん :03/11/25 18:01
彼の良く言う「ファインマン計算機科学」っていい本なの? こないだ日本に久々に帰った時に書店の本棚にあったのを見掛けたけど、、、 そもそも、教科書読んで勉強した事ないので、、、
333 :
デフォルトの名無しさん :03/11/25 18:07
彼が reference とか array access とか、object とか、 Caml の floating point operator とかを使い始めたら このスレがどうなるのか、とっても心配。 と書いて彼にもうちょっと勉強させてみるテスト。
334 :
デフォルトの名無しさん :03/11/25 18:56
コンピュータの語彙と人間の語彙をごちゃまぜにしている時点で(以下略
彼の理論だと割り算記号に : を使っている国では、どうして割り算が / なんだ、
とか文句を言い始めますね。
>>329 の言うとおり記号に必然性はないのです。
たまたま、コンピュータの言語と人間の言語が一致するだけで。
ML の - のように都合が一致させると都合が悪いときは (f x -y を f x (-y)
の意味で書いてしまうなど、明らかな間違いを誘発する。) 別にしたほうが
よい、という設計方針であるわけ。
> しかしコンピュータ言語の意味は一意であります。
いくら一意でも、自然な意味で一意になるかどうかは疑問。
f x-y をどの意味にとるかは、(f x)-y も f (x-y) も自然に見える(かもしれない)。
意味が一意だからと言って自然に一意になると思っているのかしら。
328 は異論をぶつける前に自らに与えられた批判に答えてみなさい。
328 には無理だと思いますが。
ところで、「お逝きなさい!」はスカイハイのパロディだと思うのですがいかが。
>>328 必然,必然ってマトリックスを思い出したよ
> 何故必然性が無いのか?第一に考慮すべきはチルダ以外でも
> マイナス符号でも言語実装としては可能である。これでしょう?
「可能である」ことと「すべき」ことは違うんだよ
符号の - と二項演算子の - が字句的に区別できれば字句解析の「効率」が上がる
字句的な区別がなくても字句解析は「可能」であるがね
> つまり、プログラミング言語レベルはHumanInterfaceなんです。
で,符号が ~ だからって人間側に不都合はあるの?
屁理屈なしで,あなたは不都合に感じてるの?
sageろよ キチガイに言っても通じないか!
>>328 ファインマン計算機科学ってそんなに有名なの?
ファインマン物理学なら聞いたことがあるけど
計算機科学ではノイマンとかチューリングとかシャノンしか知らないや
この界隈に入ったせいでカリーの名前は知ったけど
>>337 ご冗談でしょう。
大して有名じゃないよ、物理の世界では有名だけど。さらに彼のエッセイのほ
うがもっと有名かも。
339 :
デフォルトの名無しさん :03/11/25 19:52
有名かどうかはともかく、いい本なの? 関数型やってる人の評価を知りたいです。
sage
>>328 壊れてきたな…。人間だれしもハズすときはある。素直に誤るか、
黙って去ればいいだけじゃないか?なんでそこまで必死なんだ?
ご冗談でしょう、みたいなエッセイが好きな奴は プログラマーの壷とか読んでるのかな。
343 :
デフォルトの名無しさん :03/11/25 23:00
>>261 遅レスごめんなさい。そして助言ありがとうございます。
> external 関数 (C 言語等の関数を呼出すための物で ML での定義が無いもの)
> の exception raising 情報は、ML のソースが無いんだから分析しようが無い。
なるほど。external 関数に例外の型情報を付けてやる必要があるんだ...。中
身も見ずに質問して失礼しました。
> と言うわけで 3.07 の stdlib/*.ml の external 宣言の部分を書き直せば
> 動くんでないかい? let module 構文がサポートされてないから
> その辺りも拡張しないといけないが、まあ、いい演習だと思って
> 自分でやるか、 Francois Pessaux にメールを書いてちょーだい。
再帰 module のサポートにも挑戦してみたいとは思いますが、初心者の私には
ちと厳しい。
3.07 の標準ライブラリでは件の構文は使われてませんよね? 現状自作の拙い
プログラムの例外漏れをチェックできれば十分なので、とりあえず external
に対処してみます。*もしうまくいけば* share できるようにします。
どもでした。
ご冗談でしょう、 の鍵あけの話を読んで、「総当たりって結構大切だな」と、オモタ。
>>339 読んだことないな、結構最近の本だし(1999)。
google で「ファインマン計算機科学 site:ac.jp」で検索してみたけど
49 件、うーん。
>>335 > 符号の - と二項演算子の - が字句的に区別できれば字句解析の「効率」が上がる
> 字句的な区別がなくても字句解析は「可能」であるがね
字句解析の効率っつーか、MLの当初の目的である「処理系開発言語」としては
自然言語との一致よりも構文の見通しの良さを取ったってことだと思う。
328は言語設計者が取ったトレードオフを理解しないまま吠えてるアフォということで。
「ファインマン計算機科学」をいくら連呼したところで キチガイの考え無し文章を何ら補強するものではないです。 しかし数学板以外で屑哲を観察できるとは思わなかったよ。
>>328 > しかしコンピュータ言語の意味は一意であります。ハード(物質)レベルで
> 同等であります。それにも関わらず何故語彙を敢えて変化させるのか?
はあ?アフォですか??
プログラミング言語ごとにsymbolの持つsemanticsは異なっているぞ。
それこそ「-」がいい例じゃないか。
これでわからなければ、prologの「!」とCの「!」の意味の違いを調べろ。
自分がどんなにマヌケな事を言っているか、よくわかるから。
ちなみにプログラミング言語がturing machine compatibleであることと
semanticsの同一性は、全く異なる問題だ。
もちろんsyntaxの同一性も、lexical definitionの同一性も、
上記2つのどちらとも異なる問題だ。ちゃんと区別して使え。
その上で、プログラミング言語の計算モデルと言語設計について考えろ。
> このような疑問がどうして問われないのか?
君ほどバカじゃないから。
もうやめないか
350 :
デフォルトの名無しさん :03/11/26 14:44
>>329 ,346
>「言語の方針として」存在する。
「構文解析の効率性として」人間の言語感覚に反して
存在するでしょう?(藁)
>匂いがする。
って?香水やオーデコロンなんて一切つけてませんが。(藁)
>>330 ,331,336,341,342
ワルイ!内容が無さ過ぎて反論しようがない。(藁)
>>332 ,337,338,339,345,347
おいおい、冗談はやめてよぉ。それともホントに湘南か??
関数型言語の原典はファインマン計算機科学に書いてある
不可逆計算エントロピーの理論でしょう?
SICPにもちゃんと引用してあったはずだが…。
>>333 > reference とか array access とか、object とか、
>Caml の floating point operator とか
MLならFunctor,HaskellはMonad,SchemeはCall.CCでしょう?
(いくらなんでも「reference とか array access とか、
object とか」はヤメテ欲しかったなぁ。人文系でも
知っていると思うよ。藁藁)
>>334 >意味が一意だからと言って自然に一意になると思っているのかしら。
誰かが意味するものと意味されるものの関係性を決定しない
限り「自然に」どんな言語も形成されない。(ワラワラ)
351 :
デフォルトの名無しさん :03/11/26 14:45
>>335 良くご自分の発言を再度読んで見て下さい。マトリックスまで
引用した努力は認める。切ないほど、気持ちは伝わってくる。
(泣ける)
が、論理的反論を形成しているとは、とても思えないが・・
それとも賛意を表明しておられるのでしょうか?(藁)
>>348 どうも、レベルが揃ってないなぁ。
少なくとも、
ファインマン計算機科学、コンピュータの構成と設計(上,下)
アルゴリズムとデータ構造、プログラミング言語の概念と構造、
SICP、コンパイラの構成と最適化、程度はイロハのイ!
関数型言語なんだから、それにプラスしてエージェントアプローチ、
とかベクトル量子化と情報圧縮なんかは既に「卒業した」レベルで
話してくれないと、こちらがつまってしまう。
これは皆さんに言えるが視野があまりにも基礎レベルで
狭窄してないかい?
無茶苦茶、常識的な話しをさも偉そうに吼えておられるが、
それが一般ROMに受けると考えておられるのか?
ひねろう、工夫しよう、と言うサービスセンスが全く
感じられない。それではマクドナルドのバイトにも
なれないよ。(藁藁)
352 :
デフォルトの名無しさん :03/11/26 14:49
>>349 支持!
レベルが違うもの同士がやっても話が
合う訳がない。
どちらがどうのとは言わないが…(藁藁)
353 :
デフォルトの名無しさん :03/11/26 14:51
異常に盛り上がっているようだが、ここはホントに閑古鳥が 鳴いていたあのML板か?
>>351 釣りでした、と白状してるレスにしか見えん。
> 関数型言語なんだから、それにプラスしてエージェントアプローチ、
> とかベクトル量子化と情報圧縮なんかは既に「卒業した」レベルで
意味不明。それらと関数型言語との関連を述べよ。
前半も知っている本の名前をずらずら並べただけにしか見えないし。
>>351 さて、またもやスレの話題と関係無いネタを持ち出して煙に巻こうとしてますが
一体何がしたいんですか?意味もなく「俺はお前らより頭がいいんだい!」と必死で
主張するのは勝手ですが、勝手にいろいろな用語について言及しながら
論点をずらし続けていくだけなら、どこかよそでやってもらえませんか?
で、ただの日本人のあなた様の言語感覚に、CとPrologの"!"はマッチしてるの?
>350 >「構文解析の効率性として」人間の言語感覚に反して存在するでしょう?(藁) 言語の方針です。単項と二項演算子に同じシンボルが割り当てられると、人間に とっても見通しの悪い場合があります。例はこれまでに出てきていると思いますが。
>>350 > MLならFunctor,HaskellはMonad,SchemeはCall.CCでしょう?
まるで違う3つのものを並べて何が楽しいのだろうか・・・
>>328 > しかしコンピュータ言語の意味は一意であります。ハード(物質)レベルで
> 同等であります。それにも関わらず何故語彙を敢えて変化させるのか?
この人はプログラミング言語によっては意味が実装依存な部分があることを
知った上でこんな戯事を言っているのだろうか?
>>350 > MLならFunctor,HaskellはMonad,SchemeはCall.CCでしょう?
全くわかってないな
こいつ、このスレで潰れるな(w もう死んだら?>藁厨
>>328 同じ操作に対してなぜ異なる言語表現(-,~)がなされるのか、という問いかけ?
一般性レベルの答えでは、プログラム言語自体が言語設計者の認識の表現
だから、ということになると思うよ。
> コンパイラ・スクリプトエンジン』 相談室 2 これの新スレをだれか立てませんか。
>>364 無事dat落ちしたみたいね。
でも何故ここで云う……?
>>362 > 不可逆計算エントロピーの理論でしょう?
それは量子コンピュータの話だろ?
>>366 関数型はλ計算やコンビネータなどの計算論が基礎だと思うが。
>>365 lisp スレにしようかどっちか迷ったんだけど。
なんで放置できないのかな・・・
371 :
デフォルトの名無しさん :03/11/27 00:29
なぜMLを使うのですか>All
そのうち「今までのは全部釣りでした」と突然言ってくるに1200ペリカ
>>367 型理論なんかももう基礎ですよね。
>>370 みんな馬鹿をたたきたくてしかたないんですよ。みんな楽しいんです(多分)
彼はきっとMLで書かれた人工無能(Eliza/Doctorの類)なんだよ。 どっかの大学のプログラミング課題で作られたんじゃないかな。 いろんな専門用語や書名が文脈自由にでてくるのもこれで説明がつく。 チューリングテストは失敗でしたね>作者
山口人生と同じ匂いを感じる。 また匂いを曲解(本人はユーモアと信じて疑わない)されるかもしれないが。
>>374 > チューリングテストは失敗でしたね>作者
すまん
俺には人間らしく見える
ML を使って彼をコーディングする企画ですか?
> ひねろう、工夫しよう、と言うサービスセンスが全く感じられない。 ねじくれているあなたに言われてもなあ……
>>374 同じことを繰り返すあたり、stateless な実装で ML で再現しやすそうだ。
……私にも人間に見えるけれども。
ここは人工無能を弄って遊ぶスレになりました
このキチガイ人工無能いじりには飽きた。
うずらが、うにっくすから出張してきたとか?
>> reference とか array access とか、object とか、 >>Caml の floating point operator とか >MLならFunctor,HaskellはMonad,SchemeはCall.CCでしょう? もともとは ML で記述がちょっと変なもの(他の言語と違うもの)を集めただけでしょ。 演算子の話をしてたんじゃないの? 完全に文脈が無視されているようで如何にも人工無能らしい。
あらら。藁厨消えちゃったじゃん。
ここまで意見を論破されたら余程の厨でなければ恥ずかしくて出てこられない ……ハズなんだけどなあ。 またこれで閑古鳥の ML 板に逆戻り。
さすがに、出て来ないだろう。彼のプライドはカナーリ深く傷ついたと思われ。 …名無しにもどって荒らすくらいはやるかもしれんな。
おまいらいいかげん釣られ過ぎだ
389 :
デフォルトの名無しさん :03/11/28 18:03
笑ったよ。ホントか? エージェントアプローチも知らん?? >関数型言語との関連を述べよ。 ってか?この本15,000円もするの知ってた?(藁) 関数言語やってる人でこの有名な「人工知能」の本 知らんってか? 「人工無能」の集まりじゃないのか?(藁藁) >論点をずらし続けていくだけなら、どこかよそでやってもらえ >ませんか? 論点をずらしたのは、「カリー化って知ってる?」のオッサン でしょう? 「お逝きなさい! 関数適用が f x y という形であるので単項と二項の区別がどうしても 必要なのだ。区別しなければ次の式はどのように解釈するのだ。 f 1 - 1 f 1-1 f 1 -1 数字だけならともかく、変数が入ったら? f x - y f x-y f x -y」 こんな単項だ二項だとかの低レベルの話に延々と付き合った こちらも確かに責任はある。しかし普通、新人は先輩が 「たとえ」低レベルでも「義理」で付き合わざるを得ない。 この辺りは是非理解してもらいたい。キッパリ
390 :
デフォルトの名無しさん :03/11/28 18:03
>> reference とか array access とか、object とか、 先輩がこんな基礎的なことを再度勉強して出なおせ!と仰る。 しかも、MLや関数型言語に特有な機能でも概念でもなんでもない? そこで已む無く「純真な」新人としては、 「せめて」 >MLならFunctor,HaskellはMonad,SchemeはCall.CCでしょう? このように各言語特有で難度はそう高くはないが、一般的な 手続き型の言語からは差異性の高いものを列挙したまで のことです。その程度のレベル差も皆さん方は理解出来ない のでしょうか?まさに園児並の幼稚さか。(藁) マイケルジャクソンみたいに、幼児虐待に問われたり してね?(大藁藁)いや猿児だから大丈夫か? 今度は動物虐待って!!!(ア、アゴが外れそう…藁藁) >> SICPにもちゃんと引用してあったはずだが…。 >引用されてないようだが? って、まず貴方自身がちゃんと読んでから中味を…藁。 >この人はプログラミング言語によっては意味が実装依存な部分がある>ことを知った上でこんな戯事を言っているのだろうか? この人は.NetのCLRやJAVAのVM環境を知った上で…(藁藁) 以上、新人故の「歯に衣を着せた」迂遠な表現ではありますが、 その意のあるところを是非お汲み取り頂きたく。 決して皆さんを馬鹿にしてはおりません。キッパリ あまりの聳え立つ絶壁を見「下ろして」呆然と…(藁藁)
391 :
デフォルトの名無しさん :03/11/28 18:04
あ、さて、本論に復帰致します。そもそも 「何故?SMLにおいてはチルダを単項マイナスに使用したのか?」 これが、原点であります。その後、中川先生のHPも紹介し、 密かにメッセージを送ったにも関わらずどなたも、誰一人として、 コーパスの「コ」の字も出なかった。クラス設計を間違えて メソッドを全てPrivateにしてあるんじゃないの? それを自己中、独クラスと言います。(藁藁) コーパスって?新興宗教じゃないよ!隠れマルコフモデルは 知らなくても、確率的言語モデルぐらいはご存知でしょう? つまり日常言語の分析に使用するモデルをSMLとOCALMの言語仕様 に適用し、その差異と機能を解析してみたらどうでしょうか? との提案が本来の趣旨であります。 そして「真の」狙いは、OCALMにおけるオブジェクト指向的仕様が 如何に関数型言語の理念からかけ離れた不整合なものであるか、 またモジュールFunctor機能こそ、その正統を継ぐべきもので あることを証明することにあります。 まさに、ここML板においてなされるに相応しい議題では ないでしょうか? (単項演算子とかカリー化も関数型言語においては 実に良いポイントとは思いますが、…今さら遅いって?藁藁) 付随的に、あくまで付随的な意図として、先輩諸兄姉の無知蒙昧 ぶりがチラッと、いやドヴァっと?…It's Joke,Eliza! Of course?(laugh,laugh,laugh)
> >MLならFunctor,HaskellはMonad,SchemeはCall.CCでしょう? > このように各言語特有で難度はそう高くはないが、一般的な > 手続き型の言語からは差異性の高いものを列挙したまで > > >> SICPにもちゃんと引用してあったはずだが…。 > >引用されてないようだが? > って、まず貴方自身がちゃんと読んでから中味を…。 > > >この人はプログラミング言語によっては意味が実装依存な部分がある > >ことを知った上でこんな戯事を言っているのだろうか? > この人は.NetのCLRやJAVAのVM環境を知った上で…
> 「何故?SMLにおいてはチルダを単項マイナスに使用したのか?」 > これが、原点であります。その後、中川先生のHPも紹介し、 > 密かにメッセージを送ったにも関わらずどなたも、誰一人として、 > コーパスの「コ」の字も出なかった。コーパスって? > 隠れマルコフモデルは知らなくても、確率的言語モデルぐらいはご存知でしょう? > つまり日常言語の分析に使用するモデルをSMLとOCALMの言語仕様 > に適用し、その差異と機能を解析してみたらどうでしょうか? > との提案が本来の趣旨であります。 > そして「真の」狙いは、OCALMにおけるオブジェクト指向的仕様が > 如何に関数型言語の理念からかけ離れた不整合なものであるか、 > またモジュールFunctor機能こそ、その正統を継ぐべきもので > あることを証明することにあります。 > まさに、ここML板においてなされるに相応しい議題では > ないでしょうか? > (単項演算子とかカリー化も関数型言語においては > 実に良いポイントとは思いますが、) 余計なものを簡単に取り除いたらこんなものか
> って、まず貴方自身がちゃんと読んでから中味を…。 SICP はまともな文書なんだから reference だけで引用されてるかどうか分かる > >この人はプログラミング言語によっては意味が実装依存な部分がある > >ことを知った上でこんな戯事を言っているのだろうか? > この人は.NetのCLRやJAVAのVM環境を知った上で… 非存在証明なんだから反例なんかじゃ答えになってない > 確率的言語モデルぐらいはご存知でしょう? > つまり日常言語の分析に使用するモデル すまんね.自然言語は専門外 > 「何故?SMLにおいてはチルダを単項マイナスに使用したのか?」 > これが、原点であります (中略) > まさに、ここML板においてなされるに相応しい議題では > ないでしょうか? 今まで「モジュールFunctor機能」なんて一言も発してなかったな その脈絡のなさ,まさに「無能」か
1つ忘れてた どうでもいいけど… > エージェントアプローチも知らん?? > >関数型言語との関連を述べよ。 > ってか?この本15,000円もするの知ってた?(藁) > 関数言語やってる人でこの有名な「人工知能」の本 > 知らんってか? > >論点をずらし続けていくだけなら、どこかよそでやってもらえ > >ませんか? > 論点をずらしたのは、「カリー化って知ってる?」のオッサン > でしょう?
放置しろって!!!
いいかげん、ウザすぎるのでしばらくこのスレには来ないことにしました。 かまうやつもウザい。(藁藁)
> OCALM これが恥ずかしかったんだな(藁藁)
一言だけ言語が専門のものから言わせてもらえると、 > そして「真の」狙いは、OCALMにおけるオブジェクト指向的仕様が > 如何に関数型言語の理念からかけ離れた不整合なものであるか、 型理論からすると OCaml のオブジェクト指向の仕様は普通だよ。 むしろ、型理論から自然に発展させた仕様だよ。 ちなみに、彼の挙げる本は既にとうの昔に読んでいて、それらから学んだら どうがんばってもああいう思考回路は形成されないと思うけど。 ゼッタイ読んでないでしょ。 僕はこのレスをもってもう放置☆
amazonからの粗い情報抽出でわかるごたくはいいから、質問に答えてね。 > 関数型言語の関連を述べよ AIMAとベクトル量子化と情報圧縮(と、351の各書名)が関数型言語とどう関連あるのか 人工無脳のこじつけが楽しみだなあ。 ま、ろくに答えられないに500モナー。
キチガイにかまってるやつらよ、
>>250 を読め。
>>402 この本15,000円もするの知ってた?(藁)
が答えと思われ。
405 :
デフォルトの名無しさん :03/11/28 23:07
この人工無能の言をまとめるウェブページを作って、後世までの笑いものに してしまおう。誰か作らない?
407 :
デフォルトの名無しさん :03/11/28 23:18
そのための時間をMLいじりに使うほうがいいよ。
408 :
デフォルトの名無しさん :03/11/28 23:25
>>366 とか
>>384 とかの自分に都合の悪いレスを完全に
無視しているところが素晴らしい。
是非名前を教えてもらいたいものだ。やっぱ Aransk ですか。
くだらないレスはスルーして当然でしょ。
411 :
デフォルトの名無しさん :03/11/29 14:00
> OCALM ネタ? そう、CALMって英語だよね?映画もあった。 CAMLはカメルって読ませているが、 正式にはCAMELだ。もっといえば、キャメルだ。 従って、カームの方が良いと思わない? すくなくとも雑音は減りそうな気がする。 (かなり苦しい片腹、藁藁) >reference だけで引用されてるかどうか分かる referenceだけ読むことも出来る。(藁) > >この人はプログラミング言語によっては意味が実装依存な部分がある > >ことを知った上でこんな戯事を言っているのだろうか? そもそもこれが小生の意見に対する貴方の「反例」であることを お忘れでは??=>非存在証明なんだから反例なんかじゃ答えになってない (藁藁)
412 :
デフォルトの名無しさん :03/11/29 14:02
>すまんね.自然言語は専門外 自然言語じゃなく、コンピュータ言語の仕様と機能差異を 調査する話なんだが、何か誤解してない? 正直に確率的言語モデルは勉強してない。と何故言わないの? >今まで「モジュールFunctor機能」なんて一言も発してなかった あのぉ、それが、さりげなく言っておるのですよぉ =>MLならFunctor!!(WWW!) >>1つ忘れてた >どうでもいいけど… >関数型言語→人工知能という発想はもう古い どうでもいいけど…これ「しか」売れてないから 古かろうが陳腐であろうが、しょうがないじゃん。(藁藁) >ちなみに、彼の挙げる本は既にとうの昔に読んでいて、 >それらから学んだら >どうがんばってもああいう思考回路は形成されないと思うけど。 >ゼッタイ読んでないでしょ。 全部読んだような人間が2ちゃんのML板なんかにカキコすると 考える方の思考回路を疑いたい!(藁藁) 右も左も分からない純真無垢の初心者と何度も 申し上げております。この慎み深い謙虚な態度で十分察して 頂けると思うが??? さらに一言だけ、 >一言だけ言語が専門のものから言わせてもらえると(後略) これはどなたのことでしょうか?(藁藁)
413 :
デフォルトの名無しさん :03/11/29 14:04
>人工無脳のこじつけが楽しみだなあ。 Elizaに聞いて楽しんだら?返事は英語だけど分かる??(藁) >この本15,000円もするの知ってた?(藁) >が答えと思われ。 立ち食い蕎麦50杯分って、かなり切実な問題だと思われ。(藁) >是非名前を教えてもらいたいものだ。 あれ??言わなかったっけ?? 「デフォールトの名無しさん」!覚えといてね。(wara,wara) 隠れマルコフモデルに誰も「ついて来れない」のなら ちょっと視点を変えて「あげる」からしばらく待っててね。 実はホッとしてたりしてね。(大藁藁)
414 :
デフォルトの名無しさん :03/11/29 14:18
関数型言語かなんか忘れたけど、すっごいアッタリマエのことを 真面目くさって長文で掲載する比較的「マトモ」なオッサンが 存在されたような気がするが、もう居られないのでしょうか? 2002年度NO1発言とか自画自賛しておられたような…? 新人としては是非直接お教えを乞いたいと切望しております。 (モジモジ)
もういいや。飽きた。コテハンつけてよ。透明アボーンするから。
「単項マイナスはなぜチルダなの?不自然じゃん!」という主観バリバリの質問 ↓ 解答のヒントを示されるが、全く理解できず 「私はお前らより頭がいい」というキチガイ特有のカキコが爆発 ↓ 解答。 ↓ 非可逆計算、ベクトル量子化、エージェントアプローチ…と必死に話を 脱線させて、自分の知的優位さを無意味に印象付けようとあがく ↓ あまりの脈絡のなさ、会話の応答のなさに、人工無能の認定を受ける
(藁) (藁藁) (大藁藁) (wara,wara) この変化はどういった基準で付けられているのでしょうか>無能氏
関数型言語の中のひとも大変だな。
キティガイもキティガイを放置できない香具師もキティガイ
この人って本物の分裂病か自閉症なんじゃないの?
彼が常識とか叫んでいるものは実際学部レベルでやることだから情報系の 人間にとっては常識なんだが、それよりレベルが上の単語が全く出て こないところが素晴らしい。出せるんでしょ? 出してよ。出し惜しみせずに。 優秀なんでしょ? エージェントアプローチとか人工知能とか、関数型より上のレイヤー (i.e. 関数型の応用) の話じゃなくて、もっと「関数型のレイヤー」で 研究されている話題を振ってよ。それならここの住人もきっとついていけるからさ。 エージェントとか関数型に直接関係ない話題を振る前に型の話を振ってほしいね。 それとも、型の話なんか知らないとでも? 自分のことを相当優秀と思っているぐらいだから 当然知ってるでしょ? ちょっと古いけど quasi linear type とか知ってるでしょ?
>>419 1. Aransk は基地外。
2. 基地外を放置できないやつは基地外。
remark: 2.を書き込む
>>419 も、基地外を放置できなかった。
以上より、このスレに登場するやつはすべて基地外。オレモナー。
>全部読んだような人間が2ちゃんのML板なんかにカキコすると >考える方の思考回路を疑いたい!(藁藁) 優秀な無能様は全てをお読みになったのではなかったのでしょうか。 まさか読んでないのに「イロハのイ!」とかほざいていらっしゃったのでしょうか? だとしたらこれはあまりに素晴らしい発言ではありませんでしょうか?
もうやめれ
425 :
デフォルトの名無しさん :03/11/29 21:01
ちょっと前から黙って読んでるが、一対多って 構図に見かけはなっている。しかし何か変だ? AranskかOranskか知らんが、そいつをダシにして お前ら、グルで掛け合いやってない? とか、ボソッと言ってみる…
M L の は な し を し よ う ぜ
>referenceだけ読むことも出来る。(藁) 何言ってるの?(藁) >そもそもこれが小生の意見に対する貴方の「反例」であることを >お忘れでは??=>非存在証明なんだから反例なんかじゃ答えになってない あれは存在証明だから反例で答えになってるんだよ 論理学もう一度勉強したら?(藁) ちなみに >貴方の って俺じゃないぞ >自然言語じゃなく、コンピュータ言語の仕様と機能差異を >調査する話なんだが、何か誤解してない? >正直に確率的言語モデルは勉強してない。と何故言わないの? 確率的言語モデルは勉強してない。(藁) ところで確率的言語モデルって自然言語の話じゃないの?(藁藁) >全部読んだような人間が2ちゃんのML板なんかにカキコすると >考える方の思考回路を疑いたい!(藁藁) >右も左も分からない純真無垢の初心者と何度も >申し上げております。この慎み深い謙虚な態度で十分察して >頂けると思うが??? これらの本を読まなくてもいいが 一度「慎み深い」とか「謙虚」とか「純真無垢」の意味を辞書で調べた方がいいんじゃない? (藁藁) >あのぉ、それが、さりげなく言っておるのですよぉ >=>MLならFunctor!!(WWW!) ふーん。運が良かったね。(藁) それとも先読みが上手なのかな。もしそうなら2chでこんなアフォなことやってないと思うが(藁藁) >これはどなたのことでしょうか?(藁藁) さあ?あなたのことでは?(藁藁)
>Elizaに聞いて楽しんだら?返事は英語だけど分かる??(藁) OCALM と書いてアフォないいわけする人間よりは英語は達者だと思うよ。(藁) >立ち食い蕎麦50杯分って、かなり切実な問題だと思われ。(藁) 意外と庶民的なのね もっと外界値が高い御人だと思ってたよ。(藁) >「デフォールトの名無しさん」!覚えといてね。(wara,wara) 「デフォルトの名無しさん」じゃないの?(wara,wara) >隠れマルコフモデルに誰も「ついて来れない」のなら >ちょっと視点を変えて「あげる」からしばらく待っててね。 ついて逝けないから是非頼むよ(藁藁)
>OCALM と書いてアフォないいわけする人間よりは英語は達者だと思うよ。(藁) あ、ごめんね 英語が達者過ぎる御人だから英語に存在する CALM の方が自然なんだよね。(藁) 大変失礼しました。(藁藁藁)
430 :
デフォルトの名無しさん :03/11/29 21:57
ML2000って結局どうなっちゃたの? あぼん?
2ちゃんねる共通 藁及びwの数=厨のレベル。 1レス中に2つ以上使われている場合、間違いなく負け惜しみかキチガイです。
432 :
デフォルトの名無しさん :03/11/30 12:53
433 :
デフォルトの名無しさん :03/11/30 12:54
これまでの先輩諸兄姉の発言全てを確率的言語モデルを 応用した知的標準偏差判定OCAMLプログラムで解析して みました。 不思議なことにバラツキが一点に収束しておるのです? 皆さんに分かり易く偏差値で言えば50ちょっと、大学で 言えば、セントラル、映画館ではありません、まあ似たような ・・藁藁(MLをやっておられる皆さんは型INFERENCEには 強いですよね?中にはWEAK INFERENCEの方々も…苦笑) 多摩の「外れ」にキャンパス移転しても相変わらず セントラル大と称する、箱根駅伝の常連大学です。 そこで唯一著名な法学部「付属」文学部!の受験偏差値に 異常に近似しておるのです。ただあそこの文学部は一人として 売れる作家を生み出さないことで有名であります。 かろうじてネットで高名な、(いや悪名か?)某ちゃんねるの 運営者が辛うじてそこを卒業(又は中退?)したとかの噂を 聞いておりますが… そこで、 仮説:ネット掲示板の知的レベルは運営者のそれに収束する。 (大ワラワラ) 少なくとも50チョイですから、70以上の基地外、5以下の基地外で はないことは確かですからご安心下さいね。
>今や何かを知っている、記憶しているって、なんの意味も >ないのがお分かりではないらしい。 ふーん。(藁) お前のこと?(藁藁)
>>433 > 仮説:ネット掲示板の知的レベルは運営者のそれに収束する。
> (大ワラワラ)
> 少なくとも50チョイですから、70以上の基地外、5以下の基地外で
> はないことは確かですからご安心下さいね。
君が大きく偏差値を下げているからね。(大藁藁)
>これまでの先輩諸兄姉の発言全てを確率的言語モデルを >応用した知的標準偏差判定OCAMLプログラムで解析して >みました。 こっちでも検証してみたいからそのOCAMLソース見せて。(藁) 見せたくないなら無理にとは言わないけど。(藁藁) その場合は君の発言の説得力は皆無に等しいけどね。(藁藁藁)
あ、何ならそのソースの行数だけでもいいよ。 それで君の程度が知れるから。(藁藁)
ここ、何のスレ?
Aranskスレ
http://homepage3.nifty.com/Aransk/pro.html まだCalmになってるよ。(藁)
恥ずかしくないのかな。(藁藁)
>そう、CALMって英語だよね?映画もあった。
>CAMLはカメルって読ませているが、
>正式にはCAMELだ。もっといえば、キャメルだ。
>従って、カームの方が良いと思わない?
>すくなくとも雑音は減りそうな気がする。
>(かなり苦しい片腹、藁藁)
こっちの方が恥ずかしいけど。(大藁藁)
>Haskell,Object Calmとか触ってみようかなぁ〜っと。 (藁)
>>Aransk ( ´_ゝ`) フーン (藁藁)
Aranskはもう自分でも何が言いたいのか分からなくなってると思われ
>>432-433 433は文系特有の中身のない修飾を取り除くと
「ひろゆきが中央大卒だからプログラム板のレベルは低い」
という主張みたいだけど、これほどレベルの低い負けおしみも珍しいね
object calm ってどんな言語だあ?
> 今や何かを知っている、記憶しているって、なんの意味もないのがお分かりではないらしい。 これが意味があるんですなぁ! 考える力は自分の知識のもとに作られる。知識を使いこなせることが重要。 その知識すらなく、それを使いこなせないのが Aransk こと無能だ。 頭の良いやつは色々知ってるよ。色々知ってるから、すぐに必要な知識を 引き出せるんだよ。そんなことも優秀な無能はご存じない? それはそうと、小林先生、日本 IBM 科学賞授賞おめでとうございます。
> 世の中アブダクションの時代でしょう? 誰がいい始めたんだ? お前、宇宙人にアブダクションされたんじゃないのか? それならこの無能ぶりも説明できる!
世の中、誘拐拉致の時代でしょう? 北とかに(違)
そろそろ ML の話に戻ろうよ。
>>446 に無能がかじりついて来るに 4096 ペリカ
450 :
デフォルトの名無しさん :03/11/30 22:58
ROMに誤解の無いように申し上げますが、大学セントラルは 大好きです。真っ白なユニフォームに真っ赤な「セントラル」の 「C」を付けて、(まるで国旗のような?) 箱根駅伝を走る同校の選手諸君にはいつも感動しております。 檜木が居た時も強かった、しかし今年のチームも期待できます。 ML板のメンバー挙げて正月は応援しましょう! ところで、これまで何とか某氏との知的レベルを調整すべく、 ロッククライミングで下降しておりましたが、いつまで 経っても「底が見えない。!」 これでは、これまで閑古鳥が巣食っていたML板を「いたずらに」 賑わせてしまい、某氏に広告収入アップの機会と、この有意義な 発言ログをまた本にして印税収入の道を提供するだけではないか? と、深く反省致しまして、これにて潔く身を退くことに致します。 (藤井前総裁のように板に恋々とは…藁) ML板を愛する皆さん!どうぞお戻り下さい。また心ゆくまで MLは良いよなぁ。OCAMLは素晴らしいよなぁ。こんな コードも書けるんだぁ。ゴニョ、ゴニョ、ゴソ、ゴソ・…と まるで、某大、某研究室の雰囲気マルだしでマッタ〜リとクラ〜イ 雰囲気を存分にお楽しみ下さい。(藁藁藁) 受験生の皆さん!でも某大、某研究室も良いところです。 是非一度遊びに来て下さい。 但し元阪神タイガーズ田淵コーチの悪口だけは 禁句のようですから…大藁藁!
>ところで、これまで何とか某氏との知的レベルを調整すべく、 >ロッククライミングで下降しておりましたが、いつまで >経っても「底が見えない。!」 ここを勘違いしてるんだから底が見えるわけないよね。 だって君が圧倒的に底辺にいるんだから。(藁藁藁)
ひょっとして、このスレで自分を罵倒してるのが 2chの管理人だと思い込んでないかい?>Aransk だとしたら本物のキチガイだな。。。 いや、用語をググって人名が出てきたら、即その人物が レスしてると思い込んじゃう時点でもうキチガイ確定なわけだが
>>ところで、これまで何とか某氏との知的レベルを調整すべく、 >>ロッククライミングで下降しておりましたが、いつまで経っても「底が見えない。!」 >ここを勘違いしてるんだから底が見えるわけないよね。 >だって君が圧倒的に底辺にいるんだから。(藁藁藁) 彼が見ていた底にはおそらく大きな鏡があって、はるか上方にいる我々が写って見えたのだろう。
>発言ログをまた本にして印税収入の道を提供する 今度の冬コミで「キチガイ Aransk」を作って売ろうぜ!
455 :
デフォルトの名無しさん :03/12/01 01:25
> 今や何かを知っている、記憶しているって、なんの意味もないのがお分かりではないらしい。 とかいいながら、Aransk は我々に隠れマルコフモデル、 エージェントアプローチ、ベクトル量子化、情報圧縮等などの知識を 要求していたわけです。 だとしたらこれはあまりに素晴らしい発言ではありませんでしょうか? 「素晴らしい発言」を批判されたことに対するフォローが殆どないところが素晴らしい。 素晴らしい素晴らしいと誉めすぎだな、俺。 まあいいや。Aransk が敗北を認めた記念あげ。
>ロッククライミングで下降しておりましたが 確かに彼の発言レベルは、発言ごとに低下していった。 自分のことを正確に捉えてるじゃないか。見直したぞ(プ
素敵に荒れてるところで申し訳ないんですが、図書館でプログラミング言語StandardML入門なる 書籍を借りてきますた。 大堀淳さんて方の本。こいつを読み進めてく方向で問題ないっすか?>諸賢。
>>457 SML/NJ の教科書的な本は実質それしかないのでは?
洋書は知らないけれど
Aransk超先生にもお尋ねしますか?(超藁藁)
頭悪い所為か良く解らないのでつが 「ここにいらっしゃる粘着キチP-超先生=Aransk」 は規定値なんでつか?
規定値です。たとえ違っても。
おまいら、レスを憎んで人を憎まずだ。ここはヲチスレじゃないからな。
本人な名乗らないし、トリップもつけないから不確定名が Aransk のようなもの で定着しちゃったんだろう。せめて名乗ってくれればフィルタリングで一発なのだが…
Bayesian Filter の実験には使えなさそうだな。簡単すぎて。。。
>>458 さんくすこ。
やっぱり他に本は無しでつか。
てかこれやっぱり学校の教科書だよなぁ。
ML理解してる椰子がそばにいないとつらそうな感じ。
独習するには漏れは厨過ぎた悪寒。
吊る前に返却までがんがってみよう。
大堀さんの本は独学にはつらいと思う。 型理論・意味論・λ計算はある程度理解してるつもりだが、あの本は挫折した。
> MLは良いよなぁ。OCAMLは素晴らしいよなぁ。こんな > コードも書けるんだぁ。ゴニョ、ゴニョ、ゴソ、ゴソ・…と 藁氏はやなやつだが、この言葉はぐさっときた。 他人のはじめた研究分野の隅をつついてるだけの自分が嫌だ。
他人の研究の表紙を撫でているだけの藁氏よりはマシかと
>>468 ぐさっとくるべきなのは己の空気読めなさじゃぁないか?
465-467 の流れを読んでくれよ。なんで、なんで蒸し返す…
知ってるか?内輪ネタって場をわきまえないと寒いんだぞ?
残念ながら 470 は未来を指してしまったが。反省して ML ネタを振れ。
>>467 SML入門は至って普通の言語入門本だと思うけど。
「プログラミング言語の基礎理論」は確かにむつかしいが、こっちはスレ違いだ。
申し訳ない。 それではMLねたを1つ。 大堀さんのところが国プロで拡張MLの開発をやってるようだけど、 こういう機能が欲しい、というのはありますか? 今のところは、 ・多相型レコード計算 ・ランク1多相(これはよく知らない) ・JAVAやSQLとの相互運用性 あたりを追加するようですが。
ソケット
・type safeなprintf
>>474 Unix moduleのやつじゃだめ?
478 :
デフォルトの名無しさん :03/12/02 02:03
OCamlでは、ClassとModuleのどっちで組むべきなんだ?
480 :
デフォルトの名無しさん :03/12/02 16:27
>>479 Ocamlのオライリーの本には、プログラムによって適切な方を使えと書いてあった気がする。
標準ライブラリは全部Moduleなんだよな。 QueueとかはClassにすべき気がするんだけど、どうなんだろ?
>>412 > 正直に確率的言語モデルは勉強してない。と何故言わないの?
まあガンガってsmlに単項-を導入したstochastic parserでも書いてみてくれ。
もちろんerror rateは0で、precisionもrecallも1でよろしく。
当然、shallow parserでお茶を濁すようなことはしないだろうな?
>>433 > これまでの先輩諸兄姉の発言全てを確率的言語モデルを
> 応用した知的標準偏差判定OCAMLプログラムで解析して
> みました。
stochastic language modelで書き手の知性を測るって・・・
結局こいつはfunctional programming languageだけでなく
natural language processingもcomputational linguisticsもまるで知らないのか。
stochastic language modelではsemanticsの領域にもなかなか入れないのに、
知性をはかるとなると、pragmaticsもcynicismも捉えにゃならんだろうに・・・
>>482 無駄に英語使ってたら言いたいことが欠片も伝わらないよ
>>478 それはちょっとしたスクリプトにも ML を使えという事でしょうか?
ひょとして MLer は既にそうなのですか?
>483,484 過去の経験からして、この手の言葉を無駄に日本語にしても読みやすくはならん気がする 所詮抽象概念へのポインタに過ぎないんだから…まぁその人の頭の中のハッシュテーブル の構造に依存することなんでどっちでもケチが付くとは思うけど >482 もまいも空気嫁、ぶり返すな
ちょっとしたスクリプトにも ML を使ってますが何か。 perl知らないだけとも言う。
>>486 > 過去の経験からして、この手の言葉を無駄に日本語にしても読みやすくはならん気がする
semantics=意味論,pragmatics=語用論 はともかく
少なくとも cynicism=皮肉 は日本語の方が意味が通る気がする
あと,
natural language processing=自然言語処理
computational linguistics=コンピュータ言語学
もな
>>481 そういえばOCamlでクラス使ったライブラリって見たことないなぁ。
状態を持ってる場合クラスの方が使いやすそうなんだけど、なんか落とし穴でも
あるのかな?
>488 個人的には漏れもだいたい同意見だ…でもどっちでもいいとも思う # 言外のcynicismを察してくれ
Read between the lines! 英語でもこういうのな…
492 :
デフォルトの名無しさん :03/12/03 01:03
>>481 Object 周りは枯れ切っていないので standard lib にはまず使いません。
Standard lib に class 入れると入門者に突然 object を使わせる事になるので
まずいのです。ただでさえ、Caml は関数型のはずなのに、何が何でも object で
プログラムを書き出していろんなトラブルで困ってしまう oo 志向から来た
初心者が多いんよ。
>>489 Jacques が作っています。
ttp://wwwfun.kurims.kyoto-u.ac.jp/soft/olabl/classes/ >>485 製造元の Cristal には 100% ML 原理主義者から
Perl を使う日和見主義者までいろいろ居ます。
状況とあなたの好きなようにして下さい。
>>492 その 100% ML 原理主義者のコードに興味津々。
もっと日々の生活に密着したコードが見たいなぁっと思って
いたところでして。コソーリ見せてくれませんかね?
>>466 を、同志よ(って、こたないが)。厨っぷりが見えるのが痛い本ですな、ある意味(汗
>>467 そんだけ、分かってても挫折する人がいると思うとちょっとだけ安心(ヲイ
>>472 確かに書き方自体は普通の言語入門書なのだろうという感じはさらっと読んだときに感じて借りて
みたわけですが、ここで語られている概念に戸惑う厨脳な自分を発見て感じでつ。
でもこの辺クリアできたら新たな地平が目の前に開けてそうな予感はするんで、もうちっと頑張ってみまつ。
私だったら習慣上 perl で書くので、 ある人のホームディレクトリから拝借してきました。 X11/rgb.txt から TeX の色宣言を作るコードらしい。 try while true do Scanf.scanf " %d %d %d %s@\n" (fun r g b c -> Printf.printf "\\definecolor{%s}{rgb}{%.5f,%.5f,%.5f}\n" c (float r /. 255.0) (float g /. 255.0) (float b /. 255.0)) done with End_of_file -> print_newline (); exit 0;; だから何、といわれても困りますが。
>>495 いや、そーゆうのを待ってた。495 とそのある人は漏れにとっては神。
漏れ日曜プログラマなのに ML for Working Programmer とかいうのを買って
きちまってょぅ。この本さ、悪くはないと思うんだけど、序盤はめっちゃ親切だし。
でも、漏れ計算機科学の教育は受けてねーから後半頭イタタタタで困ってたのよぅ。
そーゆう現実的な例をみると元気がでる。
497 :
デフォルトの名無しさん :03/12/03 02:19
>>495 むー、ML向きじゃない例だけど、
逆にいうと、そういうのも普通に書けてしまうから、
なれている人には、日常のスクリプトにもつかえるということかな?
MLは。
let log_filename = "old_referer.log";; let httpd_log = "/var/log/httpd/referer_log";; module StringSet = Set.Make(String);; let get_referer str = let rec iter i = if i < String.length str - 2 then begin if str.[i] = '-' && str.[i + 1] = '>' then begin String.sub str 0 (i - 1) end else begin iter (succ i) end end else begin "" end in iter 0 ;; (* read old_referer *) let make_old_referer () = let in_chan = open_in log_filename in let rec loop refs = let t = try Some (input_line in_chan) with _ -> None in match t with None -> refs | Some x -> loop (StringSet.add x refs) in loop StringSet.empty ;;
let _ = let old_refs = make_old_referer () in let log_in_chan = open_in httpd_log in let rec loop newrefs = let t = try Some (get_referer (input_line log_in_chan)) with _ -> None in match t with None -> let refs = StringSet.union old_refs newrefs in let out_chan = open_out log_filename in StringSet.iter print_endline newrefs; StringSet.iter (fun x -> output_string out_chan x; output_char out_chan '\n') refs | Some x -> if StringSet.mem x old_refs then begin loop newrefs end else begin loop (StringSet.add x newrefs) end in loop StringSet.empty ;;
あー、上のは /var/log/httpd/referer_log から新しい referer を抜き出すプログラムね。 古い referer は ./old_referer.log に保存。 これもあんまり ML 向きじゃないけど。
502 :
デフォルトの名無しさん :03/12/03 13:58
OCamlじゃなくてSML/NJでそういうことやっている猛者はいる?
503 :
デフォルトの名無しさん :03/12/03 23:09
>>492 枯れていないとは、バグが残ってるとかそういう意味?
それとも理論面で煮詰まっていないってこと?
>>501 サンクスコ!おかげでちょっとずつ Ocaml でプログラミングできる
ようになってきたYO!! いや〜ファイルからの読み込みで悩んだ
悩んだ…。ML 向きじゃないってのは Perl よりは向いてない、くらいの意味?
>>314 書いてみたんだけど、これでいいのかな?
let map2 f lst =
let rec map2_iter cont = function
[] -> cont []
| x :: xs ->
let t = f x in
map2_iter (function result -> cont (t :: result)) xs
in map2_iter (function x -> x) lst
;;
GC.allocated_bytes を使ってみたところ、map2が一番メモリと時間を使うことが分かってがっかり。
(n = 10000, 100回試行, pen3-450/win2000/mingwで
map1: 0.681000 sec, 12000788.000000 bytes
map2: 1.352000 sec, 32003228.000000 bytes
map3: 0.370000 sec, 12002096.000000 bytes)
ocamlで一度に使うメモリの最大値を求める方法をご存じの方はいらっしゃいませんか?
506 :
デフォルトの名無しさん :03/12/04 08:07
>>503 > 枯れていないとは、バグが残ってるとかそういう意味?
> それとも理論面で煮詰まっていないってこと?
既知のバグが残ったままリリースされるという事は
間違ってもありません。ただ、知られてないバグが紛れ込む時はある。
object 方面は、今この瞬間にも拡張が行われているので、
新しいバグが導入される可能性があります。
そういう理由もあって標準ライブラリには使いません。
理論面では、、、さあどうでしょう。ジャックはここには居ないのか。
3.07pl2 何か変なんだけど。
ガリグ氏日本語うまいよね ときどき漢字間違うけどw
OCamlに型クラスの入る予定はないのかなぁ。 intとfloatで演算子変えたり、いちいちArray.length arrとか書くの面倒。 そういえば、なんで > < = だけオーバーロードされてるの?
509 :
デフォルトの名無しさん :03/12/05 00:23
型クラスって何か理解するのに 150 秒程かかった。 type class かせめてタイプクラスと書いてくれたら、、、 考えうる理由: * object の method overloading がもうある いや、でも class library がないんですけど、という突っ込みは無視。 * type class と ML module system の兼ね合いはどうしますか。 functor の中で class declaration されたらどうしよう、とか。 まあ禁止するんでしょうかね。 * link 時に dictionary 作るコードを付け足すの?今の caml に?大変ね。 * INRIA の中の人が Array.ほげほげ に慣れていて overloading を 必要としていない。 * もー俺達には俺達の class があるから他の何とか class なんかいらないよ。 * 正直、 Haskell の真似するの嫌。 こんなとこすか?
比較演算子は caml の値の内部表現を使って generic に 定義されているからです。(そのため個別の型に関する比較の定義はない。) まあ、そのおかげで変な比較ができちゃったりするのですが。 [2;3;4] < [1;2;3;4] とか。 内部表現での比較だと関数とかオブジェクト以外は全て (もしかすると嘘かもしれん)型さえ同じなら「比較」できちゃうので、 Caml では比較演算子に parametric polymorphic な型を与えています。 (<) : 'a -> 'a -> bool とか。ただし、定義されていない関数の比較は 型チェックを通ってしまい、実行時エラーになります: (fun x -> x) < (fun x -> x)。 上のように overloaded function に(半ば無理矢理) parametric な型 を与える事が許容できるのは比較関数のような(ほとんど) non-exhaustive な overloading に対してだけです。おわかりとは思いますが、length のような 普通の overloading には parametric な型を与えるのは危険です。
>>509 すんません。→型クラス
確かに今さらtype classの実装は大変そう。type classが万能なわけでもないし、
現状でもmoduleやらclassである程度代用できるし...といった感じか。
まぁArray.ってのはINRIAの中の人にならって慣れるとしても、
int, float, Complexとかに共通して適用できる関数をさらっと書けないのはちょっと。
今のOCamlの仕様だとintやfloatのmoduleかclass作ってゴニョゴニョする
しかないのかな。
>>510 比較演算子はparametricなのか。floatとintくらいで定義されている
adhocなものだと思ってた。関数の比較が型チェックを通ってしまうとは驚き。
>>509 > * 正直、 Haskell の真似するの嫌。
まじかよ….
513 :
デフォルトの名無しさん :03/12/05 09:29
> まじかよ…. んなわけねーよ。最後の三つは真面目に取っちゃいかんよ。
Haskell 使いと仲が悪いのかと思ったよ…
515 :
デフォルトの名無しさん :03/12/05 23:05
516 :
デフォルトの名無しさん :03/12/07 02:35
とにかく、国の予算でプログラマーを100人くらい2年間雇うんだ。 それで、彼らに2年間研究室でそのマイナー言語を使って、プログラミング してもらいながら教えるんだよ、そうすれば、2年後、その言語を使ってる プロのプログラマーがきちんと100人できるだろ。 いいアイデアだろ! 申請よろしく。
ソダネ 予算が下りたら漏れも頼むョ
ひとり年400〜500万として、一年で5億、二年で10億。 そんなに予算ってあるの、情報系はすごいな。 それともプログラマってそんなに給料高くないの? 教育も受けるって事で、安くしてもらうって事なのかな…
むりだと思う?多分。
>518 そんなに安いのは勘弁してください
このgcamlって、既にいくつかの型でoverloadされている関数に対して、 新しく別の型でoverloadできるのかな? ドキュメント斜め読みした感じでは、毎回genericsの定義をいじらないと いけない気がする。
>>521 generic xxx ...
| include xxx
| a->b => ...
in
...
複数のモジュールで定義したオーバーロードのマージを
自動でやってくれないと、実用にはちと厳しいけどねぇ。
>>522 なるほど。..これはまた微妙だなぁ。(笑)
APIライブラリのocaml-win32使ってる人いる?
525 :
デフォルトの名無しさん :04/01/07 07:16
526 :
a novice :04/01/08 19:35
>>515 のGCamlは取り込まれないのかな。2.x用ではなぁ。
528 :
デフォルトの名無しさん :04/01/11 01:56
529 :
デフォルトの名無しさん :04/01/12 02:45
時間がなくてね。少しづつ…やってるから。
531 :
デフォルトの名無しさん :04/01/12 23:36
>>529 もしやJun様?
応援してますんで、ガンガってください*(≧∇≦)*
532 :
デフォルトの名無しさん :04/01/19 08:03
MLでもっともシンプルな処理系はどれになりますか?
533 :
デフォルトの名無しさん :04/01/19 08:07
Minimalは反則でしか?
winで使おうと思ったらcygwinいるんじゃねーか。 gccでコンパイルしることにした。
535 :
デフォルトの名無しさん :04/01/22 23:18
Chiris Okasaki の "Purely Functional Data Structures" って読んだ人いた ら、読書感想文キボン. 目次を見る限りでは Lazy の話が多そうだけど...?
OCAML はどう発音してます? 「オブジェクティブ・キャムル?」
岡村
おーきゃむる
名前でずいぶん損してるよな この言語
>>540 少なくとも織田信長よりは得していると思う。
間違いないな
>>535 後半はその通りひたすらLazy前提だったんで、Strictで無理なく
できる話ももーちょい増やして欲しかったかなって気は確かにした。
最後の方になると、静的型付けの言語だと比較的新しいものでも
実現できないことが多いような Polymorphic Recursion とかを使う話もあるし。
有用なデータ構造が書けるのを示すことで、言語側の実装が
もっと進むようにプッシュする意図もあるのかなぁ、とか思った。
けど、(手続き型ではない)関数型のデータ構造を設計する際の思考法みたいな もんはどの関数型言語でも共通で、その辺は丁寧に解説されてるんで、オススメ。 俺には色々と新鮮で面白かったです。
オカンムリ
計算機代数システムというとLISPで書かれたものが ありますが、MLでそれらに匹敵するものってあるんでしょうか? この分野だとS式の柔軟性が不可欠なのかな?やっぱり。
>>543 ありがとう。
私もちょっと読んでみた。遅延評価の memoization ってやつをある種キャッ
シュとして使って、O(n) 必要なところを O(1) にしてやろうっていう発想は、
思いつきませんでした。
stream ってホントに色んな使い方があるのね。
548 :
<sage> :04/01/29 23:51
OCamlはむしろ手続き的な面を強化していって欲しいと思うのは俺だけかな。 継続とかコルーチンとか。
むしろ Object (゚听)イラネ
inriadj
553 :
デフォルトの名無しさん :04/02/04 06:54
週末はしばしば継らなくなるんでそこんとこよろしく。 マシントラブルが有っても月曜までそのままです。 土日に仕事しようと言うほうが悪い。フランス的にはね。
554 :
デフォルトの名無しさん :04/02/04 07:24
lazy evaluationって簡単にいうとどういう事ですか?アホなので 説明よんでもわかりません・・・
>>554 > 説明よんでもわかりません・・・
本当に必要になった時に説明を読むこと。
lambda渡すようなものか?
557 :
デフォルトの名無しさん :04/02/04 10:50
ほんとに必要になるまで、計算しないこと。 ((function x -> 0) (1 / 0)) + 1 みたいな式は lazy だと、(1 / 0)の計算が必要とならないから、計算されず エラーにならない。(MLは lazy じゃないから、エラーになる。)
>>557 > (MLは lazy じゃないから、エラーになる。)
昔MLの本で遅延評価の話を読んだような気がするのだが
ML自体は遅延評価をサポートしていなかったのか…
ということはf (x + y)のような式をコンパイルしたら, 普通なら 1. x + yを行って結果をレジスタなどに格納するコード 2. fの呼び出しコード になるところが,lazyだと 1. x + yという式を作るコード(メモリ確保してツリーを生成するコード?) 2. fの呼び出しコード になるのだろうか. 余り嬉しくないような…….
>>559 evalじゃあるまいし、ツリーなんて生成しない。
最適化されないナイーブな実装でも、
x + yを計算するコードが生成されてそれへのポインタがfにわたされるだけ。
# x + y == ((lambda (x y) (+ x y)) x y)
なるほど. 引数の式はすべてクロージャになるという感じなのかな.
562 :
デフォルトの名無しさん :04/02/05 20:22
lazyサポートしてる言語って何があるの?scheme?
>>562 Haskell。
元祖はMirandaだったかな?
Haskell。
リロードしとけば…。orz
566 :
デフォルトの名無しさん :04/02/06 07:24
Mirandaとは美しいというギリシャ語の単語と聞いたけどほんとうだろうか
Scalaってイイ!でつか?
>>562 Concurrent Clean
LazyML (LML) というのもあるらしい
569 :
デフォルトの名無しさん :04/02/06 12:58
570 :
デフォルトの名無しさん :04/02/06 16:50
Schemeでも、ライブラリで、lazyな評価ができる機構がある。 Schemeだと、 > (define a (delay (write "a")) って、やるとなんも表示されなくて、次に、 > (force a) とやると、初めて、 "a"が表示される。 Ocamlでも、Lazyモジュールで同じようなことができる。 lazyな評価のメリットとしては、記述力が高いとか、必要最小限の 計算しかしなくてすむ、とかいうのがあげられる。 でも、毎回closureを作らなきゃいけないから、実行速度が遅くなるという 欠点もある。 一部の計算をeagerに行うように最適化するなど、コンパイラが 頑張ってどうにかする必要がある。 推測混じり。
>>570 Lazyの欠点は、次にしないといけないことをずっと覚えておく必要があり、
それがメモリを圧迫する可能性があること。
もう一つは、tail recursion でよく表れるような罠かな。
> sum [] s = s
> sum (x:xs) s = sum xs (x + s)
> -- 例: sum [1,2,3] 0 == 6
> -- [1,2,3] == (1:2:3:[])
このsumはtail recursiveだが、sum [1..n] 0 はnが大きいときにstack overflowする。
なぜか?
sは最後まで必要でないので+が計算されず、
sum [] s = s にいたって初めて、 n + x_{n-1} を計算しようとし、
(ここで、x_{n - 1} = (n - 1) + x_{n-2}, ...)
結局、sum (x:xs) = x + sum xs と順序が逆なだけで、
同じ様にスタックを必要としてしまうからだ。
解決法の一つは、accumulatorについてstrictにすること。
> sum (x:xs) s = sum xs $! (x + s)
GHCコンパイラはこの程度のことは最適化で自動でやってくれる。
利点は、
>>570 が述べたとおり。記述力が違う。慣れるとやめられん。
デフォルトで Lazy である事のメリットは?そーゆうのを激しく気に するよりも、デフォルトは eager で lazy にしたいところだけ明示する ほうがいくない?
lazyの記述力ってそんなに高いのだろうか? 無限リストくらいしか使い道を思いつかない.
>>572-573 パイプライン的に計算されるから、中間リストや中間データ構造が
大きくなって困ることがない。
無限に続くとみなすと都合のいいデータ構造やアルゴリズムが
意外にたくさんある。テキストも処理もそう。
再帰的なものは無限リストにしといて必要なところだけとってくる
ように書くと綺麗でしかもリスト要素がキャッシュになるから速い。
Lazyなおかげでmutableな変数の必要性がなくなることもある。
# pure + strict が無い理由?
> するよりも、デフォルトは eager で lazy にしたいところだけ明示する
そういう議論はたまにHaskell mailing listでもあるけど、
strictが途中に一つでもあると駄目だから、そうするとあまり使えない、
というのが大方のHaskellerの意見かな。
実際おれも不満にはおもわないし。害よりも便利なことの方が多い。
# ちなみに上の n は 600,000 ぐらい(ghci)。
# 600,000回もネストできれば実際にはあまり困らない。
# オプションで増やすこともできる。
でも数メガ以上のファイル扱ったりするとなると 文字のリストって不利にならない?
>>576 Lazyなリストだから、必要な部分だけ読み込まれ、大きさは問題にならないことがおおい。
もちろん、処理によるけれど。全体をみながらちょっとだけ置換するとかいう
ことならPackedStringみたいなmutableなものをつかわないといけない。
でもフィルタ的に全部書き換える/処理するようなものは、OK。
例えば、(Cleanスレに書き込まれたものだが)
csvファイルのnカラム目を全てとってきてprintするのに、
> s <- getContents
> putStr $ unlines $ map ((!! n) . cols) $ lines $ s
のようにできる。
これでファイルサイズに関わらず一定メモリで走るのはLazyなればこそだと思う。
# 当然入力が間欠的に供給されるパイプなんかでも問題ない。
# s: String、Lazyに読み込まれる。
# lines: lineに分割。 unlines: line を結合。
# cols: 各行を、各桁からなるリストに変換。
# a_list !! n : リストa_listのn番目の要素を返す。
>>577 に捕捉。
s <- getContents
はファイル(stdin)の中身全体を一つのLazyなStringとして返す。
# Cleanスレのものはファイル名をとるようにhGetContentsを使っているが同じこと。
ポイントは、getContents, putStr,..., lines というすべての関数が
Lazyだから、行毎のループを使わず、
ファイル全体としての文字列というよりシンプルで抽象度の高い表現を用いて、
ローカルな(ここでは行毎の)処理を効率的におこなえるということ。
フィルタは C でも書けるね。
>>580 分からなくないし、もっと Lazy の利点を書いて欲しいな。
>>581 とりあえず
>>575 以外には思いつかん。
まだ読んでないなら、Why functional programming mattersを読むといいかもね。
# Lazyの欠点だとおもうことがあったら答えるよ。
Lazy言語の欠点といえば基礎概念の壁の高さじゃないかと。 C使いにいきなりHaskellで書けと言われても書けないというか。
>>582 ありがとう。読んでみます。
以前読んだときは、途中で挫折しました。
>>577 はCとかじゃ書けないな
遅延を意識して書こうとするとものすごい工数になりそうだ
>>583 ある種の直観には反するのかもね。
しかし、プログラム意味論なんかは圧倒的に簡単だよ。
誰でも習う数学(数式)により近いという利点もあるし、、
結局は最初になにをやるかってだけのことではないかと思う。
x = x + 1 と、
natural_numbers = 1 : map (+1) natural_numbers
のどっちが難しいのか。
MLの型推論もそうだけど、lazyな機構を実装したやつらって C言語とか作ったやつらと比べるともう次元を超越してるよな。 たぶん頭の構造が全く違うよ。未来からきた人? CとHaskellの凄さの比って、ミジンコと宇宙人? って間違えるほど差がありすぎだよ。 ちびりまくりだよ。
ミジンコの頭じゃ宇宙人の技術はそう簡単には理解できないって事だな でもなぜか侵略戦争は物量の差でいつも宇宙人が負けちまうのさ。 ミジンコ数だけは多いからね。
んでミジンコは戦争に勝っても宇宙人の技術を吸収したりしない。 宇宙人の技術は次元を超越してるからね。 もうミジンコにとっては理解の外。宇宙人に聞くかしないとわからない。 多分聞いてもわからないんじゃないかな。 そんで無かったことにする。これがミジンコにとっての平和。 だからミジンコはミジンコのまま。 たまに宇宙人がやってきて、いじめられるのを繰り返す。 おまえら、こんなミジンコどもを焼き払ってくれ。
>>587 マジレスすると、
Cコンパイラを一度書いてみるとたぶんそんなこと言えなくなると思うよ。
>>590 最近のコンパイラは、内部表現が関数型言語に近づきつつありますね。
SSAとかCPSとか。
>>571 遅レスで申し訳ないけど、 stack overflow はしないと思うのですが。
クロージャーはヒープに取られるから。
tail callに限らずクロージャーでヒープを大量に消費しがちというだけではないの?
あと、sum [] s = s で、計算が開始するわけでもないです。
無限リストと言えば,Pythonのyieldみたいなのを使う解決方法もあるよね. ああいうのは関数型言語の枠組の中で扱えるんだろうか?
>>586 両方わからんわ
少なくとも意味がわかるように擬似言語で頼む
>>594 > x = x + 1
次のxは現在のxに1を足したもの
> natural_numbers = 1 : map (+1) natural_numbers
自然数の集合は,{1}および自然数の各要素に1を足した集合の和集合
>>593 Scheme の継続はどう?
いや、よく知らないんだけど。
>>592 1)
>>571 の
> sは最後まで必要でないので+が計算されず、
以下をもう一度よく読み、
何がスタックを必要としていると書いてあるか考えるように。
2) 570の考える評価順序について説明してくれ。
>>594 > x = x + 1
この命令以降、xはこの命令前のxに1を足したものを指す。
> natural_numbers = 1 : map (+1) natural_numbers
[1, 2, 3, 4...] = 1 : map (+1) [1, 2, 3, 4, ...]
= 1 : [1 + 1, 2 + 1, 3 + 1, 4 + 1, ...]
= 1 : [2, 3, 4, ...]
= [1, 2, 3, 4, ..]
ただし、[a,b,c,...] は a:(b:(c:...))の省略記法であり、
map f [a, b, c, ..] = [f(a), f(b), f(c), ...] である。
>>598 1)
> 同じ様にスタックを必要としてしまうからだ。
ここがおかしい。
sum (x:xs) = x + sum xs
の場合は、xがスタックに置かれるから stack overflow の可能性はあるけど、
sum (x:xs) s = sum xs (x + s)
の場合はスタックの上のxはtailcallで上書きされるから、stack overflow にはならんと思うよ。
失礼ですが、tailcallをよくわかってない気がする。
2)
sum [] s = s
は s で渡されたクロージャーが返ってくるだけで、ここでは計算は起こらない。
計算が起こるのは基本的に、プリミティブの演算が行われるときと、適用する関数を
評価するときで、関数から返る値は評価されない。
失礼ですが、遅延評価もよくわかってない気がする。
-- MLスレで遅延評価の話ばっかりして非常に申し訳ないと思っています。
もしかして Haskellスレが落ちたから、そっちの人がここに来てるのか?
いいよ別に
>599 もしかして末尾再帰のことか? だとしたらおまい何も分かってないだろ. sumの例は末尾再帰になってない.
sum [] s = s sum (x:xs) s = sum xs (x + s) は末尾再帰じゃないの?
>>600 1)
sum [1,2,3] 0
-> sum [2,3] (1 + 0) -- tail recursiveだからsum自体はstackを要さない。
-> sum [3] (2 + (1 + 0))
-> sum [] (3 + (2 + (1 + 0)))
-> (3 + (2 + (1 + 0)))
で、この最後の式が評価されるときにスタックが要ると
>>571 に書いているわけ。
2) これは大前提だが、sum [1..n] 0の計算が行われる場合について書いている。
計算が起こらなければstack overflowが起こらないのはいうまでもない。
そして遅延評価であるから、sum [1..n] 0 がそもそも評価されるのは、結果が要る場合だけだ。
すなわち、sum xs s が評価されてsum [] s = s に至ったなら必ずsは計算される。
そして、nが大きいと1)の理由により、stack overflowする。
# 最初から [] にマッチする場合を除く。
> の場合は、xがスタックに置かれるから stack overflow の可能性はあるけど、
??? 関数のリターンアドレスがスタックにつまれるんだぞ?
> の場合はスタックの上のxはtailcallで上書きされるから、stack overflow にはならんと思うよ。
??? 同じく意味不明。
再帰も遅延評価もわかってないぞ。勉強し直せ。
# スレが落ちたからじゃなくて流れでね…
606 :
デフォルトの名無しさん :04/02/10 17:13
> で、この最後の式が評価されるときにスタックが要ると
>>571 に書いているわけ。
そう書いてあったのか。そう読めませんでした。曖昧な日本語をお使いになる。
> ??? 関数のリターンアドレスがスタックにつまれるんだぞ?
??? 末尾再帰の場合はスタック上のリターンアドレスは、深さに比例して増えたりしないんだぞ?
> # 最初から [] にマッチする場合を除く。
これをコメントアウトするのは非常にずるいと思う。
大事な大前提を暗黙に議論してるな。前提がlazyに出て来る感じ。
>>606 そこまで馬鹿げたことを書かれると心底うんざりするな。
> そう書いてあったのか。そう読めませんでした。曖昧な日本語をお使いになる。
少なくとも
>>571 は理解しているし、自分の国語力と理解力をうたがったほうがよい。
>>600 の主張はどこに行った?
> ??? 末尾再帰の場合はスタック上のリターンアドレスは、深さに比例して増えたりしないんだぞ?
それが何か?
この文章:
> > の場合は、xがスタックに置かれるから stack overflow の可能性はあるけど、
> ??? 関数のリターンアドレスがスタックにつまれるんだぞ?
が、「xがスタックに置かれるから」云々という意味不明の文章について言及していることが
わからないほど、国語力がないのか?
> > # 最初から [] にマッチする場合を除く。
> これをコメントアウトするのは非常にずるいと思う。
「sum [1..n] 0のnが大きい場合にオーバーフローする」
ことを証明するのに[1..n] == []の場合を考える必要は無い。
あなたが
>>570 なら、以後名前のところにそれを明記してくれ。
二度と返信しない。
藻前ら、とりあえずおちけつ。マターリ汁。
「再帰の際の環境をスタックに保存するか、ヒープに保存するか?」とか 「末尾再帰の最適化をするか?」とかは、実装依存の話だよね。 環境依存の話を環境を限定せずに議論するってのはどうなの? こうゆうのを遅延評価って言うのか(^^)
上手いな
612 :
570=606 :04/02/10 19:05
>>607 なんかすげー近くにいる人間な気がする。気のせいかな。
僕の国語力がないのは自分でも知ってる。
うまく落ちもついたので、かなり満足しました。
>>610 > 「再帰の際の環境をスタックに保存するか、ヒープに保存するか?」とか
意味がよくわからないけれど、
末尾再帰でなくてもスタックオーバーフローしない処理系がある
といっているの?もしそうなら教えて欲しい。
> 「末尾再帰の最適化をするか?」とかは、実装依存の話だよね。
違う。Lazyであれば外側から評価されるから勝手に
いわゆる末尾再帰の最適化がされた状態になる。
613は607と同じ人? やっぱり言ってることがおかしい気がするんだけど、僕だけなのか? 610が「末尾再帰でなくてもスタックオーバーフローしない処理系がある」と言ってるとは 思えないし、「外側から評価されると末尾再帰の最適化がされた状態になる」 ってのも全然理解できん。 国語力が足りんのかも。
>>600 > 失礼ですが、tailcallをよくわかってない気がする。
ここで最初に喧嘩売ってるな
あと,返信の際に誤解していると取れる文章も
>>570 側に多く見られる
国語力というか,読解力と論理感が少し足りない感じ
ただ,Haskellerの方もその後罵詈雑言が増えて,いけてない
>>613 2行目は間違いだが、これは少し微妙だな。
> 「再帰の際の環境をスタックに保存するか、ヒープに保存するか?」とか
1) 再帰の際の環境とは何?
2) 「ヒープに保存する」ものは結局スタックであって、そのヒープ上の
スタックが大きくなりすぎたときに起こるのはスタックオーバーフローというべきもなんじゃないか?
3) 末尾再帰でなくてもスタックオーバーフローが起こらない処理系なんてものが
存在しないとすれば、実装依存云々というのは、意味のある議論だとは思えない。
>>613 > > 「再帰の際の環境をスタックに保存するか、ヒープに保存するか?」とか
> 意味がよくわからないけれど、
> 末尾再帰でなくてもスタックオーバーフローしない処理系がある
> といっているの?もしそうなら教えて欲しい。
> > の場合は、xがスタックに置かれるから stack overflow の可能性はあるけど、
> ??? 関数のリターンアドレスがスタックにつまれるんだぞ?
ここの事を言ってるんじゃないのか?
この x は環境の一部だと思うけど,環境がスタックに積まれないという前提で話している感じ
なんかHaskellerの方も国語力がないような気がしてきた
相手に行間を読ませることを強要したり,相手の言葉を深読みし過ぎたり
評価途中のクロージャーはヒープ上に置かれるけど、 その中には lazyでない言語でいうところの stackに置かれる情報も入っているから、 言葉の使い方が、ややこしくなっているんじゃないかと思えてきた。 Haskellerさんのいうstack overflowは eagerな言語の stack overflowとは、 ちょっと性質が違うのかな?
>>616 > 1) 再帰の際の環境とは何?
静的スコープによる変数のバインドやリターンアドレス(あるいは継続?)のことでは?
> 2) 「ヒープに保存する」ものは結局スタックであって、そのヒープ上の
> スタックが大きくなりすぎたときに起こるのはスタックオーバーフローというべきもなんじゃないか?
> 「ヒープに保存する」ものは結局スタック
この前提がおかしい
例えば,線形リストで実装すれば割り当てられるメモリの限界まで取れる
その超過はスタックオーバーフローとは言わないだろう
一般的に言われる末尾の最適化ってのは 呼び出しにコストが掛からない、「何も保存したりしない」のが前提だよ。 スタックの代わりにヒープや環境が延びたりするなら それは末尾の最適化には当てはまらない。 保存場所が変わっただけ。
>>615 すまん。自分の間違いを認めない態度と、理解力の無さ(とおれには映った)に苛立ってしまった。
>>617 > この x は環境の一部だと思うけど,環境がスタックに積まれないという前提で話している感じ
うーむ。やっぱりこの意味がわからない。
> なんかHaskellerの方も国語力がないような気がしてきた
国語力ではなくて、多分知識が間違っているのだろう。
「環境をスタックにつむ」ということの意味がわからない。
たとえばMLでは再帰の際に「環境」をつむの?
再帰から返ってくるならば、スタックの上に引数とか内部で定義された変数の 環境がつまれている ということでしょう。
>>621 「環境をスタックに積む」ってのは
・アセンブラで言うcall命令ステップで起こるIP(PC)と、
・レキシカルに見える変数への参照の
2つを保存の事だと思うけど。
これが必要な場合は末尾呼び出しとは言わない。
s/2つを保存の/2つを保存する/
>>619 > その超過はスタックオーバーフローとは言わないだろう
賛成できない。
いかなる方法(ヒープ上の線型リスト?)でスタックを実装したとしても、
処理系が出すべきメッセージはスタックオーバーフローだ。
# これは考え方の違いか。
# そのヒープ上の線型リストがスタックを実装したものでないなら 3)へ。
>>620 >>613 の二段落目へのレス?
あれは本当に末尾再帰と同じ様に何のスペースも消費しないといってる。
# ちょっと説明を考えるので待ってくれ。
>>621 環境=ローカルな変数(あるいはバインド)とリターンアドレス(あるいは継続)をまとめたもの
と仮定するなら,環境をスタックに積む実装は,
「関数を呼び出す→関数内→関数から戻る」という概念を持った殆どの言語に見られるんじゃないかな
上の概念を「関数へジャンプ→関数内→関数からジャンプ」と考えるSchemeのような言語の場合は分からんが
>>626 MLでもSchemeと同じ様に末尾の検出を行って最適化されるはずだけど
Schemeでも、関数から戻るという概念だと思うけど。 関数へjumpっていうのは アセンブラかベーシックぐらいじゃない?
>>625 > > その超過はスタックオーバーフローとは言わないだろう
> 賛成できない。
> いかなる方法(ヒープ上の線型リスト?)でスタックを実装したとしても、
> 処理系が出すべきメッセージはスタックオーバーフローだ。
その超過ってのは
> 割り当てられるメモリの限界まで取れる
でいう「限界」を超過することを言ったつもり
線形リストで実装する場合,スタックによる実装のような
「最初に確保した領域を超過」
なんてことは考えないと思う
>>627 今回の話は
末尾再帰(というか末尾呼び出し)が最適化できない場合にどこに環境を保存するか(スタック?ヒープ?)
ということ
>>628 Schemeでは継続引き渡しスタイルという概念になる
>>628 前提知識が足りてないみたいだけど、SchemeやMLでは、
普通の再帰呼び出しになるのは関数が末尾に無い時に限られる。
実行時に、ヒープレジスタとスタックレジスタを使って 表されるような メモリの区切りを ヒープとスタックと呼んで使ってました。 だから、やっぱり (n + ... (2 + (1 + 0))) が肥大化するのは ヒープが溢れる気がするなぁ。 今更だけど。
>>631 CPSは Schemeの仕様に含まれてないでしょ。
実装依存だと思う。
call/ccなら MLにもあった気がするし。
Haskellの場合は計算の仕方が違うから、 保存も発生しないし、末尾の最適化も必要ないってことだと思うけど
>>631 話をややこしくするなよ
>>634 >実装依存だと思う。
何の話だ?
もっと勉強してこい
>>626 なるほど。分かりました。
引数の無い関数でもスタックはつまれるので、
xこそがスタックが増える原因であるかのような記述は納得できないが、
xも原因の一部であるような実装は普通なので、
>>600 も嘘ではないわけだね。
# Haskellの実装は知りません。
>>629 わかってる。しかしスタックオーバーフローというのは
プログラマにとって(プログラムの設計に関わる)重要な情報だから、
実装は通常スタックオーバーフローとなるようなものに
対して謎の実装依存のメッセージを与えるべきではない。
というのが趣旨。
>>633 ヒープが溢れないとは書いてない。
>>635 Exactly.
おまいら、スタックをヒープに移動したからって、 ヒープがなくなればスタックオーバー風呂と同じことだからね。 末尾呼び出しってのは、これが永久に動作するってことだよ。 ((lambda (x) (x x)) (lambda(x)(x x)))
>>636 > 話をややこしくするなよ
一応570をSchemerだと見なして発言してみた
>>637 > わかってる。しかしスタックオーバーフローというのは
> プログラマにとって(プログラムの設計に関わる)重要な情報だから、
> 実装は通常スタックオーバーフローとなるようなものに
> 対して謎の実装依存のメッセージを与えるべきではない。
> というのが趣旨。
ヒープの場合は「メモリ不足」では駄目なの?
>>636 CPSは Schemeを実装するときに Call/CCを実現しやすくするために
採用する中間形式であって、すべての実装がそのスタイルで実装するわけではない。
と言いたかった。国語力がなくてごめんよ。
ここは Haskell スレですか?それとも Scheme スレなのか… ハッキリしろや(゚Д゚)ゴルァ
>>642 岡村スレだっつってんだろ(゚Д゚)ゴルァ
つまりHaskellは (define (fib n) (if (< n 2) n (+ (fib (- n 1)) (fib (- n 2))))) こういうのを (define (fib n) (let inner ((n n)(k identity)) (if (< n 2) (k n) (inner (- n 1) (lambda(l) (inner (- n 2) (lambda(r) (k (+ l r))))))))) こういう形式(CPS)に書きかえるって事でよいか? でもこれは、どのみち(< n 2)になるまでクロージャが連なって状態が 増えてくただの問題のたらい回しなわけだから、 先のHaskellの sum (x:xs) = x + sum xs はsumに無限の値が入った場合はヒープが枯渇して死ぬ 可能性があるってことだよな?
>>613 の2段落目、
Lazyだと末尾再帰を特別に扱う必要がないことの説明。
あまり巧い説明でないかもしれない…
例:
f 0 s = s
f x s = f (x-1) (s + x)
---
f x sを計算するのに、
Strictな言語は、
f 3 0
-> f 2 3
-> f 1 5
-> f 0 6
-> 6: f 0 6の返り値
-> 6: f 1 5 の返り値
-> 6: f 2 3 の返り値
-> 6
とネストするからナイーブにはスタックがいり、
末尾再帰の最適化が必要になる。
Lazy だと、
f 3 0
-> f (3 - 1) (3 + 0) -- これをまずは返す。
-> f 2 (3 + 0) -- パターンマッチ(0との比較)で (3 - 1)が評価される。
-> f (2 - 1) (2 + (3 + 0))
-> f 1 (3 + 0)
..
-> (1 + (2 + (3 + 0))
-> 6
と評価されるから最適化はいらない。
>>647 sum (x:xs) = x + sum xs
はどうなるの?
(define (fib p n) (let ((cont (lambda (a) (let ((cont2 (lambda (a2) (+ a a2)))) (fib cont2 (- n 2)))))) (if (< n 2) n (fib cont (- n 1)))) こうかな? 合ってるかな? 関数が継続を引数にとるようになって、全ての関数呼出はtail callになる。
ごめんなさい。なぜかインデントが潰れた
あと細かいこと言うと、"+","-","<"はネイティブの演算子で、継続をとらないと 勝手に仮定してる。
うあー活発だなあ。 オレには難しすぎてよう分からん ・゚・(ノД`)・゚・ 勉強しよ…
>>648 普通。
sum [1, 2, 3, 4]
-> 1 + sum [2, 3, 4]
-> 2 + sum [3, 4]
-> 3 + sum [4]
-> 4
-> 3 + 4
-> 2 + 7
-> 1 + 9
-> 10
>>655 よくわかった。
つまりそっちはsumに渡す数が大きすぎると死ぬってことだな。
>>657 そう。普通にスタックオーバーフローする。
そして、tail recursiveにしてもaccumulatorがlazyなままだと、
>>571 に書いたように実は…ということ。
じゃ、もうこの話はおしまいだな。 570はもうちょっと考えて発言すれ。
もう終わったようだが
>>652 >
>>571 はスタックをアルゴリズム的な意味として指してたが、
> それを
>>570 は実装側の話に固着して話を進めて場を混乱させた。
これは逆だろ.
>>570 はヒープ上に計算すべき式が構成されていく(accumlatorのことね)
のも概念的なスタックの伸長とみなしていたけど,
>>571 は
処理系の実装がスタック領域を使用しているかどうかを基準にしていた
と思う.
>>660 >>570 のことは知らないが(とはいえ
>>652 の理解が正しそうに思う)、
> 処理系の実装がスタック領域を使用しているかどうかを基準にしていた
これは違う。
>
>>571 はスタックをアルゴリズム的な意味として指してたが、
これが正しい。
#
>>647 でも関連することを書いた
どうでもいいけどHaskellスレマダー?
>>664 激しくお疲れ。
おまいら(・∀・)カエレ!!
式の終わりのセミコロン2個;;が気になるんですが、 どういったタイミングで付ければよいんですか?
たたんっ,という感じかな.
いやー・・そうじゃなくて 文法がよくわからないという意味ですよ
>>668 ワロタ
アレは、テキトーで良いみたい。
ぶっちゃけ付けなくても可。
しかし可読性は上がる。
でも、つけなくちゃいかん場合があるんじゃなかったっけ?
673 :
デフォルトの名無しさん :04/02/17 01:29
let _ = ... なしで toplevel evaluation したい時にいるぞ。 ------------------------------ let double x = x + x let _ = print_int (double 1) ------------------------------ これだと ;; なしでも double の定義と print_int の境目ははっきりしている。 でも、次のはダメだな。 ------------------------------ let double x = x + x print_int (double 1) ------------------------------ let double x = (x + x print_int (double 1)) としてパースされるからな。 ------------------------------ let double x = x + x;; print_int (double 1) ------------------------------ こういう時に ;; を書く。それ以外の時に書いても良いけど、 好みの問題やね。
し,知らなかった….いつも付けてたよ.
>>675 普通に lambda を関数に渡してコールバックするだけだが。
for_each listみたいな時はそれで十分だろうけど,それって何か違わないか?
コルーチンぽいのが重要だよね.yield もしできるとしたらこんな感じ? let generator = fun () -> begin yield 0; yield 1; end let _ = begin print_int generator (); print_int generator (); end 関数型言語でこれができるのは邪道だろうけど.
>>678 すまん Scheme の lambda のつもりで言ってた
>>678 Monadicにやればできそうに見える。MLでどこまで出来るか知らんけど。。。
MLにはcall/ccがあるらしいから,一応できるはず. ちなみにOCamlにはないみたい.
OCamlにoverloadingとcall/ccが導入されたら,殆どのプログラムをOCamlで 書けるな….
スレ違いという認識で良いと思います。
正解.
なんか ocaml のメーリングリストに出てきたので、Jacques Garrigue 氏の
Code reuse through polymorphic variants を読んでみた。
http://wwwfun.kurims.kyoto-u.ac.jp/~garrigue/papers/ 普通の和を取るよりも、多相バリアントを使ったほうが、coalesced sum(合体
和? 何て訳すんだろう?)が使えて便利だとの事。
要するに、通常だと
type var = string
type lambda = VarL of var | Abs of string ...
type expr = VarE of var | Num of int ...
のように、ある基本となる型 var を別の型 lambda と expr で共有するよう
な場合に、多相バリアントで定義しておけば、
type lambda = [`Var of string | `Abs of string ...
type expr = [`Var of string | `Num of int ....
`Var of string の扱いが lambda と expr に多相化されるから便利な時があ
る。
...という認識で良い?
coalesced sum は合体直和.型の sum もたぶん,直和と訳すべきなんじゃないかな. 手元の本(『プログラム意味論』)だと,合体直和というのは半順序集合の話で,2つの半順序集合があるときに,両者から最小元を抜いた集合の直和と最小元の直和で定義されるもの?かな. もっとも,ガリク氏の説明では単純に, type typ1 = Int of int | Char of char;; type typ2 = String of string | Float of float;; とかあるときに, type typ3 = Int of int | Char of char | String of string | Float of float;; と扱うのを合体直和と呼んでるっぽい気がする. 普通の直和では, type typ4 = Typ1 of typ1 | Typ2 of typ2 とするか,もしくは論文のように Int1 と Int3 で使いわけなきゃいけないけれど,合体直和の方がいろいろと便利でしょう,ということでしょう.
>>687 > coalesced sum は合体直和.型の sum もたぶん,直和と訳すべきなんじゃないかな.
合体直和ですか。なるほど。
> 普通の直和では,
> type typ4 = Typ1 of typ1 | Typ2 of typ2
> とするか,もしくは論文のように Int1 と Int3 で使いわけなきゃいけないけれど,合体直和の方がいろいろと便利でしょう,ということでしょう.
論文の例でも分るけど、基本型の扱いが統一されたり、型を特定するためのコ
ンストラクタの列挙が減ったり、便利な場面はありそうです。
でも、他人が(自分の書いた)コードを読む時に、型の宣言を見比べないと「共
有してる」事が分らないので、可読性が落ちそう。
まぁ、その旨ちゃんとコメントに書くとか対策すればいいのか。
689 :
デフォルトの名無しさん :04/03/24 23:18
let (+) = fun x y -> match (x, y) with | (`int u, `int v) -> `int(u + v) | (`int u, `float v) -> `float(float_of_int u +. v) | (`float u, `int v) -> `float(u +. float_of_int v) | (`float u, `float v) -> `float(u +. v) とか書いて let n = `int 0 + `int 1;; と使った場合,どの程度最適化されることを期待していいんだろうか. let n = 0 + 1;; と同じコードになれば一番嬉しいけど….
690 :
デフォルトの名無しさん :04/04/05 12:42
>>689 詳しくはないんだけど,同じコードで特定の部分を,
let n = add (`int 0) (`int 1);;
なやつと
let n = `int(0+1);;
なやつをコンパイルしてみると結果が異なる(サイズも違う)ので,そういう最
適化はしていないんじゃないかな.
ちなみに 0 + 1 と (+) 0 1 は全く同じコードを吐くみたいだけど,
let add = (+);;
したあとの add 1 2 は違うコード吐くみたい.ちゃんと関数つくって呼んで
しまうので,微妙に効率が悪くなってるっぽい感じ? 部分適用も違うコード
を吐いているね.
OCamlはちょっと構文が見にくいと思う人挙手。
ノシ
>>690 うーん.add 1 2すら違うコードを吐くのは意外だな.
OCamlを使う大きな理由の1つが,関数型言語ながらC並の速度が出ること
なんで,どの程度最適化されるかは気になるんだよね.
694 :
デフォルトの名無しさん :04/04/20 17:31
SMLofNJをやってる暇があったらこっちにきなさいという言語は ありまつか?
英語 と、レスするのがム板のしきたり。
>>690 ,
>>693 ocamlc ではなく、ocamlopt での話だよね?
コードの違いってのは、add の関数のコードを出力してるからでは?
呼び出しはインライン展開されていると思うが。
>>689 はちょっと無理みたいだね。
ざっと眺めたところでは、関数自体は (-inline を高めに設定すれば) 展開されるけど、
パタンマッチの部分が残ってしまってるのかな。
>>698 そういう問題じゃないだろう・・・・・
という気がするっ!
↑再帰?
>>696 -inlineなんてオプションがあるんだね…
undocumentedなのにナゼにご存知で?
>>697 この改定版構文使ってる人いる?
>>700 はい! 改訂版構文使って...ません。
使うべき?
Revised にも利点はいろいろあると思うんだけど,リストは常に [] で囲むと かいった制約がちょっと萎える. [ x; y; z :: t ] とか. ただ, OCaml が見づらいのってカッコが妙に増えるあたりにある気がするの でそれを防ぐ意味合いはあるかもしれない……けどあんまり使う気になれない.
>>696 いや ocamlc の話でした. add とか関数のコードは全部共有して,実際の計
算の部分だけをすげかえた結果です.
ちなみに関数名を変えてもサイズは変わりませんでした(むろんコードの中身
は変わりますが).
-inline なんてオプションは初耳. -help を精読された方ですか?
ocamlc の方には -inline はないんですね…….
>>702 最初はリストを括弧で括るのも悪くないかな,と思ったけど,
let f = fun [ [x::y] -> ... ]
…やっぱり悪いかも.
もう少し優しくアクセスしてくれ.
違うアルゴリズムのfactを比べるという 馬鹿げた習慣はなくならないものか。 本来 int fact(int n) { if (n == 0) return 1; else return n * fact(n - 1); } と比べるものだ。 このおかしな例のせいで、関数型言語のプログラミングがこういう 非効率なものだと思うようになった人の例をいくつもみたことがある。 まともな関数型言語のプログラマーはfactは必ず末尾再帰にするのだし、 一般的な手続き型言語でも定義の直訳は簡単にできる…
708 :
デフォルトの名無しさん :04/04/29 19:10
>>707 漏れはfor文をつかいまつが?
再帰なんて仕方ない場合じゃないととても使えません
cとかJavaとかでわね
>>707 スライド10ページだろ?確かにあの比較はおかしいな。
効率化のために工夫した実装と比較してMLの方がシンプルだと言われてもな。
まあ確かにfactは字面的にはMLの方がシンプルだと思うが、
だったら例えば行列積の計算をCとMLで書いてみろって話。
n fact(n) = Π i i=1
>>708 そうだね。Cで
>>707 の再帰の代わりにforを使うのと同じように、
関数型言語プログラマーは末尾再帰を使うんだよ。
あんな実装はしないんです。
712 :
デフォルトの名無しさん :04/04/29 21:36
分割コンパイルの仕方とか、 コンパイル関係のパラメタの設定のしかたとかもふくめた、 日本語のアツい本((E)かんじのやつ) がでればもっとひろまるよ。
>>711 MLはよく知らんのだが、自動的に末尾再帰に変換してくれないの?
>>714 どの言語というか、処理系の最適化の話。
末尾再帰でない形のプログラムを末尾再帰に変換するアルゴリズムはかなり昔
から知られてるから、関数型言語ならそれくらいはじめから実装されてないの
かな?と思ったのだ。
たぶんそうだね。終了でよさそうな気配。
重要なのはcontinuationsが値にまとめてあるところでしょ。 実際にこの最後のステップを実行できるコンパイラってあるの?
「昔から知られている」って言ったらCPS変換くらいしかないと思って。
>>720 下の方の日本語の読みました。
後半(同じ順序で計算する)は、まさにCPS変換ですよね。
問題は前半の変換。
この方法で任意の関数を末尾再帰に変換できるわけではない。
さらに、この方法で変換できる関数かどうかを機械的には判断できない。
なので人間が手作業で変換するときの指針としてはともかく、
コンパイラのアルゴリズムとしては成立しないと思うのですが。
>CPS変換では、スタックの消費がヒープの消費に代わるだけでは? 末尾再帰に変換できるかどうかというのは、 CPS変換したときにcontinuationが(lambda (x) x)になるかどうか、ということの判定問題では?
OCamlの Wikiって無くなったの?
>>724 wiki.ocaml.jp はマシントラブルがあったみたいですよ。
Wiki のデータは消えたのかも…
>>725 レスありがとうです。
ocaml.jpのリンクから飛ぶと違うページが出るのでびっくりしました。
マターリ復旧を待つことにします。
727 :
デフォルトの名無しさん :04/05/30 12:20
MLのすばらしさを語れ こんなの勉強する気になれん
| | | | /V\ J /◎;;;,;,,,,ヽ _ ム::::(;;゚Д゚)::| ジー ヽツ.(ノ::::::::::.:::::.:..|) ヾソ:::::::::::::::::.:ノ ` ー U'"U'
まあ仕事で使う機会ないからねえ。 perlとかshで泥臭い仕事やってると憧れはするのだが。
730 :
デフォルトの名無しさん :04/05/31 00:02
ML使って卒論書きたいんですが何かいいアイディアありますか? 先輩の話だと担当の教授は何もアイディアくれないらしいので・・・・ ネタさえあれば自分で考えて努力できると思うので何かあったら 教えてください。
そんな漠然なこと言われてもな。 メーリングリストとMLの関係とか?
いや、機械学習(Machine Learning)との関係の方が...
>>733 今年はアリがテーマかな?
Machine Learning に出てきそーなテーマでつね。
ICFPもうすぐ開始ですよー。 ICFPスレってあるのかな?
某言語のcvsにICFP2004なディレクトリが出来てて恐ろしい勢いで更新されまくっとる(死 おっつけねぇよ(鬱
おっつけ?
追っ着け!
739 :
デフォルトの名無しさん :04/06/08 11:52
>>736 X と D が頑張っているね。
ところで、この cvs って anonymous でアクセスできないと思うんですが、
あなたは一体、、、
740 :
デフォルトの名無しさん :04/06/10 17:21
Japan, the Beautiful, and ML Compiler...とは何だろう。
>美しい日本の 嫌な予感
確か留学中だったと思うのだが、パワフルだねえ。
# fun f (x: [`TypeA | `TypeB]) (y: [`TypeA]) -> f(x) + f(y);; This expression has type [ `TypeA] but is here used with type [ `TypeA | `TypeB] The first variant type does not allow tag(s) `TypeB f(x)の型は[`TypeA | `TypeB] -> intとなって欲しいんだけど….
# fun f (x : [> `A | `B]) (y : [> `A]) -> f x + f y
>>747 素早いレスthx.
ただ,それだとyの型も[`A | `B]になってしまうので,
例えば g : [`A] -> int があったとき,
fun f (x: [> `A | `B]) (y: [> `A]) -> f x + f y + g y;;
は通らなくなるよね?
これを回避したい…というか,
fun f (x: [`A | `B]) (y: [`A]) -> f x + f y;;
のときに, f: [`A | `B] -> int と推論されない理由がいまいち判らない.
x と y は同じ関数 f に適用されるので、どうしても同じ型であるとみなされ てしまう気がする。したがって、 g y が正しく型付けできないみたい。 fun f (x:[< `A | `B]) y -> f x + f y;; - : (([< `A | `B] as 'a) -> int) -> 'a -> 'a -> int = <fun> というのは、できる。 この場合、 x に `B が来なければ、 f が [ `A ] -> int でも問題ない。
よく判らないけど、こうゆう事かな? fun f (x: [`A | `B]) (y: [`A]) -> match x, y with `A, `A -> f `A + f `A | `B, `A -> f `B + f `A ;;
[`A´]
[´A`]
今ガリグ氏の caml-list へのポスト見て、 polymorphic variant にも
coerce ができることに気付いた。
# fun f (x:[`A | `B]) (y:[`A]) -> f x + f (y:>[`A | `B]);;
- : ([ `A | `B ] -> int) -> [ `A | `B ] -> [ `A ] -> int = <fun>
>>750 の方法でも回避できるけれど、 x や y のコンストラクタの種類が
もっと増えると泣きたいくらいパターンの数が多くなるのが難点かも。
>>751-752 ワロタ
素人ですみませんが、ocamlにはマクロや templateはないんでしょーか。 ここら辺が強力で静的な言語があればとても魅力的なのですけど。
マクロ -> camlp4 template -> functor + parameter polymorphism でかなり代用可能
>>754 template については、 755 の言う通り functor や parameter polymorphism
で代用できる場面が多い気はする。
代用というか、言語自体に同程度の強力さがあると思うんだけど、別に
template というかたちでまとまってない。何かやりたいことがあれば OCaml
でどう書くかってのは示せると思う。
camlp4 はマクロ機能にしては充実しすぎているので面倒な気はするけれど……。
まじめなマクロや ifdef はちょっと面倒。
>>756 コンパイル時に数値計算をして、その数だけ if文を書くといったようなことがやりたいです。
C++の templateでも頑張ればできるんですけど、コンパイルに時間がかかって数百程度の配列
すら扱えなかったりと実用的ではないです。
Lispはインタプリタというイメージがあって遅いんじゃないかなあと。
camlp4はなんか難しそうですけど地道に調べてみます。
とりあえず Cで書いて、マクロを Perlかなんかで生成するという方向で考えてます。
>>757 >Lispはインタプリタというイメージがあって遅いんじゃないかなあと。
一応突っ込んでおくが、メジャーな処理系は殆どコンパイラを備えているよ。
静的な言語が良いって話だから Lisp は候補外だと思うけど。
>>758 静的、というか速ければなんでもいいんですけど静的と動的の違いってなんなんでしょうか。
コンパイルされる lispとスマートポインタ、関数templateを使うC++の違いは関数が作られる(?)
のが実行時かコンパイル時かってことですか?
やっぱりlispは遅そうな気がするんですけど実行時の負担が少ないようなプログラムを書いてやれば
Cなみに速くなるんでしょうか?
速度を保ったまま抽象度を増すのにマクロや templateが使えると思うんですがマクロ目当てでlisp
を使うのはちょっとやりすぎかなあという気がします。
えっとMLに関係なくてすみません。
>>759 Lispでは、関数というよりソースコードそのものがS式(リスト)として実行時に作れ、
evalやcompileができるという意味で動的?
まあ、
>>758 がおっしゃってるのは型が動的か静的かということだと思うけれど。
ちょっと方向性が違うかもしれないが、
http://www.metaocaml.org/ 言ってみればLispのquasi-quote。
コンパイル時計算というよりは、動的コード生成の範疇のものだけど、
>>757 を聞く限り部分計算っぽいことをしたいようですので。
Haskell(GHC)なら、Template Haskellっていうのがあるが。
>>760 いろいろ調べてみたんですが、動的にコードを生成するのを"generative programming"といって
コンパイル時に数値計算をするのを"partial evaluation"というらしいですね。
Lispでいうと前者がマクロで後者が quasi-quoteに当たると思われます("partial evaluation"
にはもうちょっと広い意味があるみたいですけど)。
後者はC++でも実現できるのですが(効率は別として)、前者はちょっと難しいです。
というか Lisp以外でこれができる言語ってあるんでしょうか。
まあ再利用性とか無視して適当なスクリプト言語でコード生成してやってもいいんですけどね。
>>761 > いろいろ調べてみたんですが、動的にコードを生成するのを"generative programming"といって
「動的」というのは違う。generative programmingの代表例は
C++のテンプレート(参考:Modern C++ Design)で、むしろ、
コンパイル時にコードを生成する事を指していることのほうが多い。
> というか Lisp以外でこれができる言語ってあるんでしょうか。
Template Haskellは、コードの構文木にコンパイル時にアクセスできる。
したがって、partial evaluationのみならず、Lisp的なマクロとしても使える。
GHC(Glasgow Haskell Compiler)に実装されている。
>>762 「動的」というのは違いましたね。コードを生成するのはコンパイル時でいいのですが、
コンパイル時に与える整数を変えると生成されるコードが変わるとか、単純な繰り返しを避けるとか
そういったプリプロセッサが欲しいです。
C++のtemplateはクラスや関数を作ることしかできませんし、引数も型か整数しか与えられませんし、
繰り返しも再帰で表現するのでinline展開がされなかったらパフォーマンスが酷いことになりそうです。
どちらかというとCのマクロの方が近いのですが単純なテキスト置換でメタ的な場合分けができないので
だめです。でも boost::preprocessorとかいうのもあるので、もしかしたらできるのかも。
> Template Haskellは、コードの構文木にコンパイル時にアクセスできる。
なんか面白そうですね。Template Haskellどころか普通の Haskellもよく知らないんですが、
遅延評価の言語で実行速度は遅いですよね? コンパイルされる言語は速い言語がよいので、
そのプリプロセッサ(もしかしたらパースした後?)だけが欲しいんですよね。
かなりスレ違いなので無視していただいて構いません。すでに教えてもらったことがいっぱいあるので
とりあえず消化します。ありがとうございました。
>>763 Lisp スレに来てお題だしてくれたら、適当に Lisp コード書いてやるぞ。
Lisp スレ最近話題ないし。
>>762 そこで camlp4 ですよ。 camlp4 では、利用するパーサによって camlp4 に与
えることのできるオプションを追加することもできる。
かなり柔軟な構文の変更ができるから、コード生成時に与える引数によってコー
ドを変えるようなこともけっこうできるよ。
それから、 Haskell も GHC を使ってコンパイルすれば、異常に遅いというこ
とはないよ。速くはないが、よっぽどシビアな用途じゃなけりゃ気にならない
くらいだと思う(コンパイルには時間かかるけどね)。
もっとも、そんなシビアな用途じゃないなら Lisp インタプリタでもよいとい
う話はある。
m4 じゃダメなのか?
>>764 Lisp楽しいですよね。関数型の言語いっぱいありますけど、あのマクロ(とeval)ばっかりは
S式じゃないと実現できませんしね。
>>765 camlp4 でもできるんですか。難しそうなので使えるようになるまで時間かかりそうですけど
地道にがんばります。
>>766 うう、単純に知りませんでした。昔からあるものみたいですね。
どの程度のことまでできるか分かりませんけど、調べてみます。
もう学習キューが溢れそうです。
768 :
デフォルトの名無しさん :04/07/07 17:33
769 :
デフォルトの名無しさん :04/07/08 09:08
SMLofNJ はいったい何の役に立ちますか?
俺の役に立ちます。
K.INABA氏のw.l.o.g.にこのスレのことが載ってます。
>>768 のOCaml-templatesに引っ掛かったらしい。
(* 私信: INABAさん尊敬してます。がんばってください。 *)
>> K.INABA氏 翻訳文の中に原文をHTMLのコメントとして埋め込んでおけば検索できて便利 スレ違いですまん
773 :
デフォルトの名無しさん :04/07/09 10:42
ごめん、だから何?
775 :
デフォルトの名無しさん :04/07/13 21:33
OCaml3.08 release age
777 :
デフォルトの名無しさん :04/07/14 02:59
あっというまに訳されていったな。
摩耶さまぁ ACMプログラミングコンテスト国内予選トップ通過おめでとうございますぅ きなば師と一緒にがんばってください (* 日記読んだらちょいと右寄りっぽいせいで萎え *) ;; どうでもいいがLisperはマクロは使うが効率の観点からevalは使わないぞ... Templete HaskellとかGOcaml, MetaOcamlとかそのへんは(使ったことはないけど) 型安全なコード生成(メタプログラミング)ができるというのがウリなのでしょう? 型を気にしないメタプログラミング(具象構文木の操作)だったら、 Lispがもう実現しているので学問的興味はない、という具合なんじゃないかな? ただ↑の言語たちは構文が死ぬ程読み辛いぽ。あれは素でアリエネー
> 摩耶 字が違う……
マクロでいじるのは抽象構文木だろが
>>779 「きなば」ってのも普通に間違えてそうだ….
Appelの虎本 in MLさぁ、ML-LexとかML-Yaccがダサいんだよ。 なに外部ツール使ってんの。 MLがそんなにすごいプログラミング言語なら、MLの記法の中で文法を記述してくれよ。 もちろん見易く。 つまり Boost.Spirit がキモくなくなった感じでだ。 先読みトークンをリファレンスに代入するのヤメレ。 参照透過性も何もあったもんじゃない。ペッ アルゴリズムの説明の疑似コードも全部MLで書いてくれれば面白かったのに。 もちろん直接動くものでなくていい。 疑似コードと同様に分かり易く書けて、しかも効率よく実行できるってのが 高級言語の目指すところじゃないのか? ありゃJavaやCに書き直せるのも無理ない本だよ。 MLの「記述力」に感動させてくれるようなコードないか。 「とても他の言語には移植できない」ってくらいMLを使い倒したコードが読みたい。 方言の問題が痛いが、感動したいだけなので何MLでもいい。 バード-ワドラーに載ってるようなリストままごとには飽きた。
何で外部ツールを使うのがいけないんだろう…… 大体 ML のすごさは別のところにあるだろう。C++ の Boost が凄いからって ML で同じ方向で凄いことが出来るわけじゃないし。 大体多重定義出来ないじゃん? GCaml はまだ発展途中だし。 ML のすごさは素直なところであって、変態的(これはこれで褒め言葉)な ところではない。
うーむ燃料を投入したつもりだったんだけど私の頭が悪いせいで大した内容にならなかったぽいな。
それとも人が余りに少ないのか?
>>783 素直なところ、ですか... そういうもんなんでしょうか。
有力な方言OCamlは >>746- みたいな複雑な型システムに向けてがんばってるみたいだけど、
ああいうのって単に理論の実践に過ぎなくて、
「あれがあるからこんなすごいコードが書ける」ってもんじゃないのかな。
素直な言語と言うなら、もう実現済みって気がします
(もちろん
>>783 さんの言葉をProject Cristalの代弁者として受け取るわけじゃないけど)。
# なお私はBoostに見られる不自然なメタプログラミングには反対です。
# 演算子オーヴァーロードも。キモい。
>>782 あれはまあ、確かに理論の実践でもあり、型安全なので便利だというのもあります。
# polymorphic variant はなんかの双対だったよね? 忘れちゃった。教えてエロい人
> 素直な言語と言うなら、もう実現済みって気がします そうですか? 素直なだけならそうかもしれませんが、素直でシンプルなのに 強力というのはかなり大変だと思いますが……。ML の強力さは今でも 素晴らしいけれどまだ発展の余地がありそうです。
>>785 polymorphic record ですよ。
let getName x = x.name
と書くと、nameフィールドを持つようなレコードすべてを受け取れるという。
ocamlではオブジェクト型においてのみ使えるようだ。(上のコードは受け付けない)
> let invokeName x = x#name;;
val invokeName : < name : 'a; .. > -> 'a = <fun>
# Boost.Spiritってparser combinatorのパクリだよなぁ。
MLの強力さってのは,記述力ではないと思う. 確かに関数型言語の道具(λ式とか)は便利だけど, それらの多くは手続き型の言語にも採り入れられてる. 関数型言語の専売特許じゃない. 確かに遅延評価スゲーって時もあるけど,それを可能にするため mutableなものを排除した代償も大きい. 関数型言語のメリットは,数学的にセグらないことが証明できたりとか そういうところにあると思う. …と全く専門外の人が言ってみるテスト.
MLでプログラムする利点 ・わかりにくい書き方でもOK ・コメント書かなくてもOK ・変数・関数名が適当でもOK な空気
遅延評価が良ければ Haskell か Clean を使った方がいいと思います。 ML系 言語はデフォルトでは正格な実装がほとんどだし。さらに mutable な変数も えらく簡単に作ることができるし。 関数型言語のワリには命令的なところをえらく簡単に書けるのが ML の特徴な のかも、と最近よく思います。 そういう意味では、破壊的操作があるのがイカン、というのは批判としては ちょっと安易で、コードの簡潔さに貢献していてわかりやすいかどうかをちゃ んと見るべきなんじゃないかと思うんですが、どうでしょう。
やはりまだ現代の計算機では手続き型風の命令が有った方が 速度も出るし書きやすくもなると思います。 そういえば、ML マシンってないんでしょうか? Lisp マシンや Prolog マシンは知っているのですが、ML マシンは聞いたことありません。
792 :
デフォルトの名無しさん :04/08/02 05:22
793 :
デフォルトの名無しさん :04/08/03 13:56
漏れもそう思った
ウェロタ
798 :
デフォルトの名無しさん :04/08/15 22:37
OCamlでRubyのamritaみたいなのありませんか?
ありがとう。 ちょっと見てみます。
3.08.1 release
803 :
デフォルトの名無しさん :04/09/05 23:14
さてそんなみなさんに質問です MLやっててこれにはマジぶち切れたという事があればどうぞ
今
>>803 がクソレスでageたのでマジぶち切れた
, - ,----、 (U( ) | |∨T∨ (__)_)
806 :
プログラマ :04/09/09 08:00
いいから、だれかOcamlのライブラリ&使い方の 分厚いけど、親切で、読みやすくて、表紙がかっこよくて、 これ一冊読めば、MLプログラマーになれますYOっていうかんじで、かつ安い、 当然日本語の本だせひょ。 はなしはそれからだ。
807 :
デフォルトの名無しさん :04/09/09 08:17
質問ですが。 数値計算用の言語で、MLみたいにチェックしてくれる言語ないですか? Cもfortranもいらいらするので。
>>806 つまりレシピブック/クックブックってこと?
出したくても書ける人材と出してくれる出版社がない気がする。でも、漏れは
ちょっと書いてみたいな(そんなにスキルないけどさ)。
それ以前に、まず使うための入門書がない気がしますが……。
>807 もしくはMLで数値計算できるようにするとか… どっちでもいいから正直漏れも欲しい ('A`)ノ
>>808 出たらたぶん買う。けど、萌えな表紙はやめてくで。
親が心配する。
812 :
デフォルトの名無しさん :04/09/10 22:14:02
let s = (f arg) in s と
(f arg) って違うの?
ocamllex やっててハマってて、上のようにしたら期待通りに動いたんですが。
http://www.tabee.com/oc/y2.html ↑の、「lexer.mll そにょ2」 の緑色になってるコードの部分の一番下の部分を参考にしました。
やりたかったことは、 "[文字列]" という文字列中の ']' は '\]' で
エスケープされてる文字列の、字句解析です。
ごめんよく読んだら書いてあった。 >{ (Lexing.lexeme lexbuf) ^ (immstr lexbuf) } >とかやりたくなるけど、実はこう書いて半日ほどハマりました。 >何かというと、この式ではまず immstr lexbuf の方が評価される。 >=> 結果、Lexing.lexeme lexbuf の評価結果は、 >最後にマッチした文字列 = 閉じの '"' になる。 >=> '"' だけがたくさん並んだ文字列ができる。という具合。
そうそう、Ocamlでは 関数の引数は後から前に評価されるんだよね。
いや、評価順序は不定じゃない? sparc だったら前から評価されるかもしれないよ。 C 言語でも sparc 系だと前から評価が普通だけど、 intel なら後ろからが普通でしょ?
なぜそこで全然関係ないはずのCの例が出てくる?
(前からか後からかの) どちらが実行効率が良いか、というのはアーキテクチャ依存
なので、そのことを考慮して、関数の引数の評価順序については unspecified と
している言語は C を初めとして多数あるかと思います
で、OCaml も (Reference Manual によれば) unspecified ということですので、
>>814 の様に決め込んで評価順序に依存したコードを書くのは良くないと思います
引数の実行順序が決まってる方がめずらしいよ。 その点で Java は奇特な言語です。
というわけで
>>816 の情報科学的素養は皆無です(煽
lispは決まって無いか?
scheme は不定。
>>817 の通り、3.08のマニュアルには評価順序は不定と書いてある。
ソース見た限りではsparcでもintelでも同じだったような。
sparc でこんなことしました。 (* test.ml *) let _ = let f x y = () in f (print_int 1) (print_int 2); print_newline () ;; > ocamlc test.ml > ./a.out 21 > ocamlopt test.ml > ./a.out 12 はーい、ocamlopt と ocamlc で実行順序が違いマースッ というわけで、よい子は引数の評価順序に依存しちゃだめー よいこじゃなくてもだめー
>>813 OCaml 3.07 以降なら ocamllex では as を使って変数に束縛できるから、そっ
ちを使った方が直観的かと。
[^'\\' '"']+ as s { s ^ (immstr lexbuf) }
みたいに(部分文字列にも使えるからかなり便利)。
どっちみち関数型言語で引数の呼ぶ順序なんて考慮する方がおかしいよ。
今月は月間50レス達成なるでしょうか
あーそうか MLって f(a1, a2) みたいに書くんだったっけ f a1 a2 形式と勘違いしてた。 大堀本を投げ捨てちゃって久しいからなあ。逝ってくるYO
>>826 の意味が分かりません。
「ML って」の ML は SML を指している?
それでも言ってることおかしいけど。
とりあえず逝ってこ
京大のサイト無くなってる?
>>829 五十嵐先生のやつ?
上のほうのディレクトリは生きてる。
今年度の講義に向けてreviseしているのでしょう。
831 :
デフォルトの名無しさん :04/09/25 08:38:17
寂れてますが、ACM/ICFP の感想戦でもしませんか。 私は初日で適当にコンパイラ作って色々やってたけど、肝心のアリが 強いのが出来ずにボロ負け。 今年は OCaml が不調でしたね。Haskell が異常にがんばってます。
真耶様かな。また来年がんがれ
834 :
デフォルトの名無しさん :04/09/30 05:19:00
.NETに萌え萌えな日曜プルグラマの私ですが貴様等を見込んで質問させていただきたい. Hindley-Milner アルゴリズムの実装に興味があるんですが,読み易いオンライン文書知りませんか. C#とかJavaによる具体的なコードがあるとなおよい. ;; 外国だとPythonなんだろうか? λ式の構造について再帰しつつ制約式を増やしてゆくことまでは分かったんですがね... なお情報科学科の学生ではないんで岩波ソフトウェア科学買えとかいうのはナシの方向で.
ぐぐれ
コンパイラを作るならMLと聞きましたが本当ですか?
おれは今C言語モドキ作ってるよ。 結局使う人がいないことにはねえ。 少し前Scheme作って仕事で使うの勧めたら嫌がられた。 さぱーり理解できんかったらしい・・・。 おれも説明すんの面倒だったしね。 まあ結果は予想範囲内。 んでさ、今作ってるCではがんばってクロージャ使えますよ。 まあベースは普通のCなんで限定的ですが。 やっぱ速いとそれなりに歓迎されたよ。 CにしたのはDLLとかのライブラリがそのまま流用できるのがいい。 言語よりライブラリ作る方が大変だし。 作る方はライブラリなんか興味ないしね。 MLも括弧が少なくて読みやすい点では評価できるんだけど いまいちメジャーじゃないってのがモチベーション沸かない原因かな。 ところで型推論の実装難易度はどうなのかね。 単一化自体は自体は簡単そうに見えるけど。
型推論は全く単一化。 単一化も効率を気にしないなら簡単に実装できる。 クロージャより簡単じゃないかな。
言い忘れてたけど、上の話は基本的な Hindley-Milnerでのこと。 部分型、type class, constructor class, etc を実装するには もう一工夫いる。
ありがとう。面白そうなチュートリアル、あるところには(無料で)あるんですねぇ。 型機構に下手にあれこれ盛りこむと完全性だか健全性だか両方だかが 簡単に失われてしまうと聞いたことがあります。 parameterとinclusionを同時ってのはそもそも贅沢な話だよな (w Pizzaとやらは昨日出たJava2 SE 5.0の新機能の中の人を想像するのに役立ちそう。 効率はそもそも求めてないんでユニフィケイションはテキトーに実装しちゃえば何とかなるぽ。 しばらく休日はこれで楽しめそうだ...
ちょっと前に、簡単な多相型推論プログラム作ったよ。
Haskellで書いたので、fresh variable生成のためにmonad使いまくりだった。
Prologで書いたやつも見たことあるなぁ。単一化機構が元から備わっているので
型付け規則を書くと、そのまま型検査・推論プログラムになるってのが面白い。
ttp://www.jaist.ac.jp/~kiyoshiy/writing/ ここも参考になる。
誰か型無しλからSystem Fへの型推論プログラムを作ってください。
決定不能です…って、しまった釣られた。
つっこみありがとう。いい人だ…
関数型言語未経験者に型推論が何なのか説明するとして、参考になるようなページとかってありますか?
「型推論とは何か」の前に「型とは何か」を説明すべきだろうけど,これが大変そう。 というか俺もよくわかってない。 今もイデアルを使ったモデルが主流なのだろうか。
理解してもらいたいのは,型推論を活用して書かれたMLプログラム? それとも型推論のアルゴリズム? (こっちはつい先日話題に出たけど)
C言語に型推論を導入するとして func(n) { int ac = n; return n; } これだけでfuncの引数nの型と戻り型はintって判断してもいいの? 少なくとも暗黙の型変換でintに出来る型ということは確定だよね?
C はコアーションがあるからなぁ。
subtyping relation 入れないといけない。
int <: double とか情報を失わないならともかく(32bit で)、
double から int にも変換できるしね。
その辺は明示的にキャストしてもらいたいところ。
>>850 とりあえず minimal typing として int -> int の型をつけるのは
まあいいんじゃない?
>>848 よく知らないけどMLだったら、
D 〜 Bool + Int + Float + D x D + (Label -> D) + (Label x D) + (D -> D)
の形の領域方程式を逆極限法で解いた解とかでいいんじゃないかなあ。
それでわかる人なら解説の必要もないと思われるわけですが
そもそもそれは意味領域の定義だし。 型はその上の部分同値関係として定義するのがいいのでは。
855 :
デフォルトの名無しさん :04/10/06 22:10:37
関数型を極めた人にとって副作用ってできるだけ少なければいい程度なのですか? それともおよそすべてのプログラムは副作用なしに書けるのですか?
型の表示にイデアルを用いる方法とPERを用いる方法の優劣についてはまだ結論がでてないような。 誰か詳しい人いませんか?
857 :
デフォルトの名無しさん :04/10/07 20:45:34
>>855 自分は極めた人ではないですが、なんとなくの感覚として、副作用っていうの
は C 言語でいえば goto 文みたいなもんだと思います。
その心は、なければないで困りはしないが、その方が綺麗に書ける場合に使う
ことをためらったりはしないというところ。
まあ純粋関数型言語である Haskell や Clean のスレの人はもっと厳しい目で
見てるかもしれないけど。 OCaml のライブラリなんて副作用だらけだしなあ。
副作用なしにかけるのはアルゴリズムだけ。 データを入力したり結果を表示するときには副作用は必須です。
>>857 ん?
副作用のある関数というのはC言語ではprintfのような返り値を返す以外に
何か他のことをする関数のことだよ。
例えば、printfの返り値はintだけれど、値を返す以外に、画面に文字を表示する
というのが副作用としてあるの。
>>859 >>857 は副作用の意味を分かった上で、
>その心は、なければないで困りはしないが、その方が綺麗に書ける場合に使う
>ことをためらったりはしないというところ。
という点で、関数型プログラミングにおける副作用を伴う関数の使用は、
Cでのプログラミングでgoto文を使用することと似ているのでは、
と言っているのではないかと。
出入力はともかく、OCaml のライブラリってそんなに副作用だらけかな? 普段使っている分にはそんなに副作用だらけって感じじゃないと思うけど。
>>855 Haskellは純粋関数型言語ですから全てのプログラムは副作用なしに書かれます。
その意味では入出力含め副作用は全く必要ありません。
しかし、これはMonadにより副作用をエミュレートしているからこそです。
# このエミュレートは実によくできているので、副作用が無いというよりは、
# 副作用を他の部分から分離しているという感覚です。
破壊的代入(副作用)を利用するアルゴリズムはたくさんあるので、
それが全く利用できないというのでは困ります。
>>860 その通りです。言葉が足りなすぎました。補足ありがとうございます。
>>861 よく使うので気になるのはBuffer、Stream、Hashtblの3つくらいですかね。ま
あ Buffer と Hashtbl はそういうものだと思えば気にならないけど、 Stream
は気になります。他にもデータ構造系だとQueue、Set、Stackあたりが副作用
的な利用をしますね。
あと、配布されてるライブラリでオブジェクトを使ってるやつは副作用をモロ
に使ってるやつが多い気がしました。具体例が出せないですが。
あとは Arg.parse_argv とかが参照型を使うことを想定しているとかかな。こ
れは仕方ないし、わかりやすいので良いとは思いますが。
それと入出力系ではあるけど、
http://ocaml-programming.de/rec/IO-Classes.html の I/O Octet の input を見たときは我が目を疑いました。引数に文字列を与
えて書き換えてもらうなんて、そんなのアリか。Cじゃあるまいし。
OCaml で string を書き換えられるようにしたのは最大のミスだ、再設計して
いいのなら string を書き換えられる様にはしないと INRIA のだれかが
言っていたような。
>>863 それは酷い仕様ですね。
全300ページぐらいのocamlの日本語マニュアルゲットしたぜ
本来ならばそういうズルはしないで 別のアプローチでCと同等以上の性能にするのが筋なんだろうが、 見つからなかったんだろう。
たしかに 866 の通りなんだと思いますが、 int -> string (引数に与えたの と同じ長さだけ読み込んで、その長さの文字列を返す)とかの方が、遅いけど ずっと綺麗にプログラムできると思うんですけどね。 その程度のわかりやすさよりも速さの方が重要っていう考え方なんでしょうが、 これは個人的には相容れない考え方ですね……。
さらなる発展に寄与できたかどうかは怪しいものだけど、とりあえず ML の項 をちょびっと書いてみたよ。あと OCaml も。 たぶんツッコミどころだらけだと思うので修正頼む。
870 :
デフォルトの名無しさん :04/10/10 00:15:12
OCamlで副作用を使うときはこうするほうがより好ましいみたいなのはありますか?
>>870 自分で気をつけるしかない気がする。たとえば入出力だったら、
let proc_file f fname =
let ch = open_in fname in
f ch;
close_in ch
;;
のようにして、チャネルの開いている範囲を限定するとか。
一意性型というか、複数の変数から同一の実体へ参照しないよう気をつける。
ハッシュテーブルなら、作成時に一気にドカンと作って、後は参照するだけに
するとか。バッファなら、ループで回す直前に作って、ループの最後で
content だけを返し、バッファが外から見えないようにするとか。
で、
>>863 のIOはML的にどう実装すればよかったんだ?
遅い事が判っているのにわざわざライブラリで遅い実装にするメリットってある?
逆に、MLの作法に従った速い実装はありえるだろうか。
例えばSchemeでは継続の抽出で脱出関係の構文が全て賄える事になってるが、
実用を前提とした処理系でbreakやreturn程度の構文に大真面目に継続を
組み込んで実装にするだろうか。
それをオーバーキルとは言わないのか。
867でも書いてますが、 input : string -> int -> int -> int ではなく、 input : int -> string であった方が良かったのではないか、ということです。 速度の差を問題にされていますが、この両者の速度差は僅差ではないでしょう か? というか、 input に与える前に自分で文字列を使うか、 input の側で 文字列を作るか、という差でしかありません。実際の運用を考えると、 input で読み込む前に文字列を作るのと、 input の側で生成された文字列を連結し ていくという差があるため、あらかじめ巨大な文字列を作成しておけば前者の 方がそれなりに効率的になることは確かですが、最近のプロセッサではほとん ど差はないだろうというのが私の意見です。 caml-list上での議論(やってる当時はちゃんと読んでなかった)を見直すと、 メソッド名をどうするかとか、文字ベースにするか文字列ベースにするか、と いった議論が主で、上のような問題はあんまり議論されていない気がするなぁ……。
>>873 OCamlをしらないで型だけみて書くが。
inputの中で毎回メモリを確保するのと外から与えて使いまわせる
のでは"絶大な"速度差がある。
通常、ファイル全体をstringのまま保持する必要があることはまれで、
なんらかの処理をして別の形にしていくので、固定長バッファがあれば十分だ。
外から与えて使い回すというのは、関数的な利用を全く想定していないと思い ます。 確かに、固定長バッファを使い回す方が効率は遥かに上でしょうが、昨今の計 算機の処理能力を考えると、その差が本当にシビアに効いてくる局面というの は多くはないのではないですか? それよりむしろ、 OCaml で使いやすい API を考えるべきではないかと思います。 ……と思ったんですが、シビアに効いてくる局面以外では文字ストリームとし て扱えば良く、そちらはそちらで存在するから、文字列としてまとめて扱う方 は完全に効率重視にするべきで、したがって文字列を渡してそれを書換えても らう仕様にする方がよい、という意見を今思いつきました。 それはそれで一理ある気もします。
>>872 > 例えばSchemeでは継続の抽出で脱出関係の構文が全て賄える事になってるが、
> 実用を前提とした処理系でbreakやreturn程度の構文に大真面目に継続を
ここにはSchemerだっているんだ.今後,暗い夜道では背後に気をつけな w
それはともかく
>>857 , 私は参照透明性なんてマクロな観点で成り立ってればいいと思うけどね.
局所的に破壊的代入を導入して効率が上がるんなら使えばいいのさ.
byterun/io.c の caml_input 見たら memmove(3) を使ってるんだね.そう思えば普通じゃん < input
どうしても嫌ならラッパ噛ませればいいし.
val my_input : in_channel -> int -> string
let my_input ic len =
let ofs = ref 0 in
ofs := !ofs + len;
input ic (String.create len) ofs len
だとまずいな... 別の ic で使っても ofs が単調増加だ w
まぁ「使い易い」 input_line : in_channel -> string があるんだし,
あなたは処理系でM論ゲトとかそういう人だろうから固定長入力って使わないでしょ?
ocamllexがあれば十分,みたいな(よく知らないけど
(* なお↑は超テキトーだけど input_line を真面目に真似れば多分できる. *)
>>869 乙
ML の「面白さ」を説明するのは難しいね
まあ Haskell の面白さを説明するのはもっと難しい気もするけど
関数型プログラミングより英語の方が難しいのかよ! w
>>881 それ前からあった京大の五十嵐先生の講義録じゃない?
829-830 って話があったから、 revise が完了したんだろうね。
OCaml の入門、というか関数型言語の入門としてはかなり良いと思うよ。
ML for working programmer は訳されるといいなあ。
MLをやってて本当によかったということがあればそんな事例をば
>>833 あるわけない。
童貞ガキのオナニー言語。
>>833 C/C++ をつかってても functional であることを意識した書き方が出来る
様になり、バグの数が減った。
ML そのものより、ほかの言語を使ったときに良い影響が出た。
言い訳のねたが増えた。 「いやあ、MLで書かせてくれるならすぐできるんですけど。Cだと面倒で」
「じゃあ君はMLで書く会社へ転職しなさい」
MLそのものよりも、C/C++でもコードを綺麗に書こうとするというのはあるか も。でもCとかは型推論してくれないんでむしろイラつくこともあるなあ……。 まあでも、MLを必要とされることはまずないと言っていいだろうし(OCaml使っ てる会社は海外にはあるみたいだけど)、ならば「本当に良かった」と断言で きることはそれほどないでしょうね。
890 :
デフォルトの名無しさん :04/11/05 00:55:20
論文書くためにでっち上げた糞ソフトはMLで実装されてることが多いyo〜 とりあえず動けばいいというのならMLが楽かもね 当然まともなプロジェクトは大抵javaかC++使ってる
MLで書くとき・読むとき、エディタが型推論してここでこれはこの型になってるはず というコメントを自動で行端に入れて欲しいと時々思う。 コンパイルのときにしか教えてくれないのはイヤン。
>>891 死ぬほど同意。
型が書いてないと他人のソースを読むのが大変だし、勘違いにも気付きにくい。
短くて一般的な識別子名が多いので、スコープ情報なしでは検索もしにくいし。
マウスオーバーで型情報がポップアップしてくれると最高なんだが。
SMLは知らんが…OCamlならemacsのcaml-mode使え。
Haskellでまさにそういう型シグネチャのポップアップするIDEがあった気がして探したんだが 見つからない... (* それどころかインタラクティブセッションの値の型も出た気が... *)
eclipse 使えば?
emacs の haskell-modeでも、ポップアップこそしないけどカーソルの位置の 関数の型をメッセージバッファに表示してくれますが。
ocamlはともかくhaskellのどこがMLなんだと(ry
899 :
デフォルトの名無しさん :04/11/06 18:10:10
ぜんぜんしてない。と、思う。 現在の配布物に OCaml 関係のものはない。
ですよね。
なんてよむの? パスカルみたいに人の名前なの? オッカムの剃刀のオッカムとは関係ないの?
>>903 OCaml の話だと思うけど「おかむる」とか「おきゃむる」とか読む。
Caml の部分は英語的には camel と同じ調子で読まれる。なのでロゴがラクダ
だったりするんだけど……この業界でラクダといえば perl だし。
OCaml = Objective-Caml で、Caml = Categorical Abstract Machine
Language なので、たぶん人名を意識してつけた名前ではないんじゃないかな。
OCamlプログラマはOCamler(おかむら)だね
エムエラーのおまいらが最も卑下するプログラム言語ってなに?
909 :
デフォルトの名無しさん :04/11/17 23:37:25
とりあえず、MLで売れるソフトつくらんとだめだろ?
>>909 売れなくてもいい。
研究用として価値があるじゃないか。
商売にするならOCamlの方が良くない?
>研究用として価値があるじゃないか。 ねーよ。蓮ケルで十分。
教育用言語ML
>>909 MLなんて頭でっかちな研究者しか使わんよ。
まともな研究者ならパッケージ配布する時はc, c++, javaを使う。
プロトタイプをMLで作るならまだしも、
それをそのままネットに置くなんて仕事してないに等しい。
ということは世の中の言語研究者の多くはまともな研究者ではないということですね ;P
915 :
デフォルトの名無しさん :04/11/18 23:52:28
ML使う研究者の方がCなんか使ってる研究者より研究まじめにしてるだろw
基礎研究だからいいんじゃない?
実際に使いものになる実装を作ることが目的なわけじゃないから、MLで書いたものを 公開しても全然問題ないと思うんだけどね。 Cで実装を作るのは宣伝の意味しかないよ。
MLコンパイラも一緒にパッケージに入れて配布すりゃいいじゃん
はぁ?
920 :
デフォルトの名無しさん :04/11/19 00:29:15
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ML
にはは、観鈴ちん強い子
が、がお・・・ 誤爆しちゃった
絶妙の流れだったな。
>>914 つーかほとんどいかれた香具師ジャン(笑い
925 :
デフォルトの名無しさん :04/11/22 14:47:40
3.08.2 release (* WinやMacのバイナリパッケージは、更新されないのかな… *)
927 :
デフォルトの名無しさん :04/11/25 20:42:54
928 :
デフォルトの名無しさん :04/12/02 21:41:52
大堀先生のSML#って何だかすごそうだ。
>>928 e-Societyシンポ行ってきたのですか?
930 :
デフォルトの名無しさん :04/12/02 22:03:10
>>928 もっと情報をきぼん
大堀先生のページに、論文とかあるかな?
配布視点の?
934 :
デフォルトの名無しさん :04/12/09 22:35:26
MLで書かれた有名なソフトとかってあります? graphic処理とかできるのかなあ。。。
935 :
デフォルトの名無しさん :04/12/11 18:29:37
>>934 OCamlだったらMLDonkey、Unison?
leditって日本語使えないの?
使える/使えないの基準がわからないが、とりあえず入力されたモノはとりあ えず通るみたい。 ただ、入力された日本語がちゃんと表示されないから(print_string などの結 果は問題ない)、そういう意味では使いづらい。
たしかに print_stringの結果は大丈夫ですね。 入力が化けてるから駄目なのかと思いました。
939 :
デフォルトの名無しさん :04/12/11 23:06:16
GODI 便利だーーーーーーーーーーーーー と、当たり前のことであげてみるテスト にはは、観鈴ちん強い子
Lispで書ける Memorize関数(同じ引数で同じ関数を呼ばないように配列に結果を記憶しておくやつ) を OCamlで書くことはできますか? let rec fib = mem (fun n -> match n with 0 -> 0 | 1 -> 1 | _ -> (fib (n - 1)) + (fib (n - 2)));; みたいな再帰定義ができないので無理なんでしょうか。 関数に外からアクセスされないstaticな配列を持たせられればいいんですけど。
ごめんなさい。まさにそのことが書いてあるページを発見してしまいました。 上のは無視してください。
>>942 やってみましょう。以下のようなエラーになります。
This kind of expression is not allowed as right-hand side of `let rec'
>>942 その理由が分かんないんです。
明示的に関数だって教えてあげないと再帰定義できないんでしょうか。
945 :
デフォルトの名無しさん :04/12/12 23:22:41
えーと、スタックオーバフローするけど、次は定義できる。 # let rec f x = g x + g x and g x = f x;; そして、g x = f x は、g = fun x -> f x の糖衣構文であることに注意する。 すると、f, g は共にラムダ抽象なので、評価が進まないことがわかる。 ところで、 # let rec f x = g x + g x and g = f;; は、g はこの時点ではラムダ抽象では*ない*(変数だと思え!)ので、この時点で 評価を進ませることが出来て、一歩進むと、 let rec f x = f x + f x のようになり、あきらかに定義できない。(let rec x = 1 + x が定義できないように。) このように、明らかに定義できない部分は蹴っている。 型ぐらいみろ、と思うかもしれないが、 f : 'a -> 'a は、f 1 とすると値だけど、f (fun x -> x) とすると、 ラムダ抽象。要するに、どっちも来うるので、安全側に倒しているのだろう。 私も良く分かっていませんが。
946 :
デフォルトの名無しさん :04/12/12 23:26:08
ようするに、あれだ。 値になってない部分は先をとりあえず見ているわけだ。 ラムダ計算的には、ラムダ抽象は「値」だから、ラムダの中身はみていない。
>>945 >型ぐらいみろ、と思うかもしれないが、
>f : 'a -> 'a は、f 1 とすると値だけど、f (fun x -> x) とすると、
>ラムダ抽象。要するに、どっちも来うるので、安全側に倒しているのだろう。
というのはどういう意味ですか?
単純に引数が足りないからラムダ抽象、というわけにはいかないんでしょうか?
>>940 がエラーになる理由はなんとなく分かったんですけど、
(ラムダ抽象だってことは分かっても再帰がからんでややこしい)
>>945 のが良く分かりません。 f = fun x -> f x が常に成り立つなら
片方が通って片方が駄目なのはおかしいような。
let rec x = 1 + x が定義できないのは xがラムダ抽象じゃないからではないですか?
let rec f x = f x + f x は定義できますよ。
> というのはどういう意味ですか? > 単純に引数が足りないからラムダ抽象、というわけにはいかないんでしょうか? 実際に値を入れてみるまで分からない、という意味です。 定義時点の型と syntax では判断できない。 上のが定義できたとしたら、定義できた後では、 f 1 も f (fun x -> x) も通らないといけないのです。 上のはたまたま関数が来ることが分かっていたからいいけど、 そうでない場合があるかもしれなくて、それが let rec x = 1 + x みたいな感じになることがあるので、だめ。 あー、ちゃんと説明できてない。 > let rec f x = f x + f x は定義できますよ。 let rec f x = f x + f x が定義できないというのは、 OCaml の関数として定義できないのではなくて、値が定まらないという 意味です。言葉足らず。
っていうか、例として不適切ですねえ。すまん。 だめぽ。
> 単純に引数が足りないからラムダ抽象、というわけにはいかないんでしょうか? これは絶対無理。 -rectypes でよろ。 let rec eater x = eater eater 1 2 3 4 5 6 7 ....
自分でもわけわかんなくなってきたけど、 let rec x = y + 1 and y = x + 1;; これを禁止したかったから、ラムダの中にいれずに値としてつかっちゃだめよ、 ということかな? エロい人補足よろ。
> 単純に引数が足りないからラムダ抽象、というわけにはいかないんでしょうか? そういえばη展開とかいうキーワードもありますな。 Haskell とは違うのだよ。
>>953 そうなんですか? fibまで貰った時点で多相じゃないような。
let rec は関数宣言にしか使えないので、
let rec f n = ... もしくは let rec f = fun n -> ... みたいな
形でしか宣言できないという説はどうでしょうか?
# let rec fib = (fun n -> match n with 0 -> 0 | 1 -> 1 | _ -> (fib (n - 1)) + (fib (n - 2)));;
当然OK
# let rec fib = (fun x -> x) (fun n -> match n with 0 -> 0 | 1 -> 1 | _ -> (fib (n - 1)) + (fib (n - 2)));;
右辺の第一項は 'a -> 'a 第二項は int -> int なので右辺は int -> int になりますが明示的でないのでNG
あのエラーメッセージはどうかと思いますが。
>>954 let rec x = 1 :: x;;
は通るよ。
> あのエラーメッセージはどうかと思いますが。
同感。何がだめなのかわからないよね。
>>955 >let rec x = 1 :: x;;
>は通るよ。
ほんとですね。
>>953 のとこに recが「有効なのは関数宣言のみである」って書いてあったので。
let rec x = 1;;
はダメだし
let f = (fun x -> x) (fun x -> x);;
はOKだけど
let rec f = (fun x -> x) (fun x -> x);;
はダメだから、このパターンなんじゃないですかね。
compilerのソースを読み解く勇者がいれば… MLで書かれているから読みやすいはず(関数型言語の宣伝文句によれば)
>>957 べつにコンパイラ全部読むわけじゃないから、そんなに物凄く大変てこともないだろう。
で、見てみたが、件のエラーは translcore.ml で吐かれてて、しかもそれが
実際に起きるのは check_recursive_lambda が呼ばれてる個所のみ。
ここで右辺の値を調べてチェックしてるみたい。
なので後は自分で調べてほしいんだけど、自分でちょっと見てみたので、激し
く既出の内容だが、書いてみる。
簡単に言うと、単なる値と関数値はチェック時には区別がされている。
たとえば、
fun n -> memoize cache fib n
は明確に関数だということがわかるが、
memoize cache fib
を関数値として見ているわけじゃない(型チェックなどの労は惜しんでいる)。
で、自分の値を計算するのに自分の値が必要となるような状況は避けているか
らエラーになるわけだ。
let rec f x = g x
and g x = f x
だと、g の右辺値は(内部的には g = fun x -> f x なので)関数値とみなされエラーにならないが、
let rec f x = g x
and g = f
だと右辺値は単なる値なのでエラーになる。これと同じじゃないかな。
自分で言いだしといてなんだけど、
let rec x = 1 :: x;;
の場合、右辺値はコンストラクタなので他と扱いが違うんだろう。
let rec x = `x x;;
とかもできるのと同じだろうね。
昔は rec は関数定義しか通らなかったと聞いた。 いつから通るようになったんだろ。Changes とか見ればいいんでしょうが。
そろそろ次スレかな?
>>958 >let rec x = `x x;;
ワラタ。その二個目のxはyでもXでもおんなじやん。
何となく「できるだけ分かりにくくしよう」という嫌がらせを感じなくもないw
963 :
sage :04/12/21 14:24:12
>>962 いやそんな意図を持って書いたわけじゃなかったんですが、たしかに見辛いですな。
ちなみにヘンな let rec といえばこんなのも。
# let rec x = lazy(Lazy.force x);;
val x : 'a lazy.t = <lazy>
# Lazy.force x;;
Exception: Lazy.Undefined.
OCamlで、相互に参照するクラス関係はどのように書けば良いのでしょうか?
GOFのObserver-patternを適用することで解決できましたが、もっと良い方法があれば教えていただきたく思います。
class A = object ... end and B = object ... end;; とかいうことではなくて?
>>967 相互依存関係のことなので、それだけではできませんでした。
exception Opnotsupported;; class ['test2] test1 = object (self) val mutable test2_ = ([] : 'test2 list) method add_test2 t = if test2_ = [] then test2_ <- t::test2_ else raise Opnotsupported method get = (List.hd test2_)#get end;; class test2 t1 = object (self) val str = "test2desu" val test1_ = t1 initializer test1_#add_test2 self method get () = str method print () = print_string (test1_#get ()) end;; let t1 = new test1 in let t2 = new test2 t1 in t2#print ();; 私は上記のようにしたのですが、test2のインスタンスは1つしか持たないのにリストとして保持しています。 あまり綺麗ではないので、もっと良い方法は無いものでしょうか。
>>969 問題点がどこにあるのかいまいち理解できないんだけど.
相互再帰うんぬんではなくて,単にこういうことではないの?
exception Opnotsupported;;
class ['test2] test1 =
object (self)
val mutable test2_ = (None: 'test2 option)
method add_test2 t =
match test2_ with
None -> test2_ <- Some t
| Some _ -> raise Opnotsupported
method get =
match test2_ with
None -> failwith "Wow!" (* ここは適当な処理に変えてね *)
| Some x -> x#get
end;;
class test2 t1 =
object (self)
val str = "test2desu"
val test1_ = t1
initializer test1_#add_test2 self
method get () = str
method print () = print_string (test1_#get ())
end;;
ブラザー、春だぜ。 今日OCaml初めて使いました。ところで、質問。 2重ループを書くとき、 let rec loop i j 結果 = if i = 10 && j = 10 then 結果 else if j = 10 then loop 0 (j+1) else loop (j+1) i 処理 in loop 0 0;; のように書くのか、for文をネストして書くのかどちらが一般的なのでしょうか? for文は手続き処理部分を含むので関数的ではありませんよね?
for の方が最適化されやすくて高速になる。後は趣味による。 個人的には末尾再帰の方が好みだけど、処理にもよる。
974 :
デフォルトの名無しさん :2005/03/31(木) 20:16:25
OCamlでは、string型でfold_rightのような関数が定義されていないのはどうしてですか?
訊く場所が間違っている
stringがすっげー不便なんだけど、char listで扱った方がよくないっすか? また、stringの代わりにchar listを使った場合にどんな問題が出る?
let recで名前付けないで再帰関数を作る方法はありますか?
979 :
976 :皇紀2665/04/01(金) 12:01:53
>>978 Haskellじゃ[Char]になっているのはちょっと効率悪いって事か。
OCamlの方が高速少メモリなのかな
980 :
977 :int 2ch =05/04/02(土) 03:00:18
>>978 ども。OCamlはじめたばかりだったんであっちは別スレとおもてたよ
目的がよくわからんレポートだったけど、factorial定義でやろうとしてることは
なんとなくわかったつもり。こういうことかな
まず再帰関数の定義を、自分を渡すパラメータとして定義する
let defFact = fun fact n -> if n = 0 then 1 else n * fact (n - 1)
で、これを直接つかうとしたらこんな感じになるんで
defFact (defFact (defFact .. (defFact dummy))) 10
つまり.不動点てのは、その関数を無限(必要な限り)に適用した感じものか
ただfixpointでなにやってるかはわからんかったが
981 :
977 :int 2ch =05/04/02(土) 03:47:15
理解できました type genDef = wrapGenDef -> (int -> int) and wrapGenDef = Wrap of genDef let unwrap = function Wrap(func) -> func let fixpoint = fun funDef -> let genFunc = fun wrapped -> funDef (fun n -> (unwrap wrapped) wrapped n) in let wrapped = Wrap(genFunc) in genFunc wrapped let factorial = fixpoint (fun fact n -> if n = 0 then 1 else n * fact (n - 1)) open Printf;; printf "%d\n" (factorial 5)
982 :
977 :int 2ch =05/04/02(土) 03:52:12
必要なときに取り出して使う感じに思った
ここまで来てなんだが、あんなにややこしいことをしなくても、 let rec fix f x = f (fix f) x と明示的に関数として定義してやれば可能なのを思い出した。スマソ。 fix (fun f x -> if x <=0 then 1 else x * f (x - 1)) ↑普通の階乗。 fix (fun f res n -> if n <= 0 then res else f (res * n) (n - 1)) 1 ↑末尾再帰な階乗。
let rec つかってるじゃん