1 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 14:49:54 ] 関数型言語MLについて語るスレッドです。 MLは、確固とした理論的背景を持つ言語でありながら、 現実的なソフトの開発にも使用できる実用性を備えた言語です。 また、プログラミングの初心者が最初に学習する言語としても優れています。 総本山 Standard ML www.smlnj.org/ Objective Caml caml.inria.fr/ocaml/ 前スレ 関数型言語ML(SML, OCaml, etc.), Part 4 pc11.2ch.net/test/read.cgi/tech/1133003340/
158 名前:デフォルトの名無しさん mailto:sage [2007/12/17(月) 21:14:55 ] 俺も欲しいけど、エラーの扱いとかどうなるんだろ
159 名前:デフォルトの名無しさん [2007/12/18(火) 20:20:46 ] 中でfinallyつかえばいいんじゃないかな。
160 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 10:35:14 ] ocamlにfinallyなんてないだろ
161 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 16:22:00 ] Javaプログラマは夢見るSuccubus finally かなり 例外に依存して生きているの
162 名前:デフォルトの名無しさん mailto:sage [2007/12/22(土) 17:32:45 ] 何だ OCaml には finally があるのかと思った また OCaml 限定の話かよとスルーしてたのに
163 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 23:00:37 ] >>149 OCamlでは ('a -> 'a) -> 'a という型のY-combinatorは定義出来ません。 HaskeiiはLazy evaluationなので、例で書いているように出来るのですが、 OCamlはEager evaluationなので、argumentをすぐに評価しようとするので、それをお書きになったような形で避けるとにコンビネータではなくなってしまいます。 これを避けるにはLazy モジュールを使用してナンチャッテ遅延評価で解決します。そうすればコンビネータとして扱うことが出来ます。 同様のことはモナドにも言えて、ナンチャッテ・モジュールを使用すると解決することがあります。 MLのYコンビネータの書き方はLittle MLerの巻末に書いてあるのでご覧下さい。
164 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 17:21:19 ] >>149 >>163 factの実装方法を2通り紹介しておく。 チューリングの賢人鳥 let rec turing's_sage f x = f (turing f) x;; turing's_sage (fun f x -> if x = 0 then 1 else x * (f (x-1))) 5;; カリーの雲雀 let lark x (`M y) = x (fun z -> y (`M y) z);; let curry's_sage f x = lark f (`M (lark f)) x;; curry's_sage (fun f n -> if n = 0 then 1 else n * (f (n-1))) 5;; どっちの方法も - : int = 120 と返ってくる。
165 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 19:10:27 ] >>164 スマリヤンの「ものまね鳥」だね。SKIコンビネータ入門にいいよね。 ほかにもJAYとかOWLとか出てきた希ガス。
166 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 21:22:48 ] 論理学の問題ならCoqを使ってコードを作ればいいんじゃねえか? coq.inria.fr/
167 名前:デフォルトの名無しさん mailto:sage [2007/12/28(金) 21:39:17 ] (つд⊂)ゴシゴシ(;゚д゚) 論理学の問題
168 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 00:08:29 ] Coq is the specification language. Interactive Theorem Proving And Program Development by Coq'art: The Calculus Of Inductive Constructions これ系統の参考文献にこれもいいかも。 TAPL : Types and Programming Languages
169 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 00:24:27 ] >>167 数理論理学とコンピュータ・プログラムの間には深い関連性がある。 A.近代論理学の開祖であるフレーゲの概念記法を出発点とするゲンツェンの自然演繹 B.チャーチの型付きラムダ計算 2つのモデルはカリー・ハワード対応によって同型として対応付けられる。 つまり、論理学の問題と言っているのは、実はコンピュータ・プログラムの問題と言っているのと同じなのだ。 QED.
170 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 00:51:12 ] Coq見てみたけどワカランw OCaml-Nagoyaの次の本はCoqだな。決定。
171 名前:デフォルトの名無しさん mailto:sage [2007/12/29(土) 19:25:22 ] WindowsのCoqIDEが動かないな。固まったよw
172 名前:デフォルトの名無しさん mailto:sage [2007/12/30(日) 00:47:12 ] >>171 うごくよ。 てかProofGeneralが亡くなってる。
173 名前:デフォルトの名無しさん [2008/01/01(火) 02:06:59 ] >>169 その同型になるのは、1階の述語論理のこと?
174 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 13:37:59 ] カテゴリカル・コンビネータ理論
175 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 13:45:05 ] 一階述語論理にカリー・ハワード同型対応で対応するのは、一般の関数型言語で使われている型理論とはだいぶ異なる型理論です。
176 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 14:36:17 ] 高階述語論理をカリー・ハワード対応させるとどうなるんですか?
177 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 15:55:45 ] >>176 どうしたいん?
178 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 16:07:39 ] Curry-Howardの対応の依存型(dependent type)があると、 高階述語論理を表現することができる。 高階述語論理があれば、「∀f. --- 任意の関数 f について…」という扱いが可能になったり、「関数や述語に関する量化(∀∃)が可能な論理」を構成できる。
179 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 16:19:56 ] 型付きλ計算の世界では、「値の世界」と「型の世界」の間に明確な分離があり、型の定義中に値が出現するといったことはありません。 しかし、依存型(dependent type)を導入するとこの制限が取り払われて、型が値を持てるようになります。 依存型は単純な型付きλ計算よりもはるかに強力で、うまく使えばリストの長さや配列の境界チェックなどさまざまに応用できます。 しかし強力さの一方で型チェックは複雑になり、一般の依存型では型チェックが停止しない場合もあります。 例えば、基本的には型の部分で計算ができるので、そこに無限ループするような項を入れておけば止まらなくなります。 Curry-Howard Isomorphism により、依存型は述語論理と等価な記述力を持つことになります。 したがって、依存型をつけたλ計算の体系を考えることで、論理式の証明を記述したり、その正しさを検査することが可能になるわけです。 OCAMLのCoq では、単純なλ計算ではなく帰納的に定義された型(Inductive types)を使えるように拡張した Calculus of Inductive Construction というものに依存型を導入し、システムの根幹としています。
180 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 16:26:17 ] 最低でも、一階述語論理系を構成できる程度は理解し、その上で、 直観主義論理,Matin-Loefの型理論、依存型算譜言語 の3つをプログラムの基礎として最低限おさえておけ。
181 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 17:11:13 ] Curry-Howard Isomorphism をトポスの言葉で表現するとどうなるんですか?
182 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 17:37:52 ] >>181 おとなしくシミロン嫁
183 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 17:40:00 ] グロタンのEGA/SGA嫁
184 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 17:41:40 ] 知ってどしたいん?ん?
185 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 17:47:24 ] シミロンとは・・・ 圏論による論理学―高階論理とトポス 清水 義夫 www.amazon.co.jp/o/ASIN/4130120573/
186 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 18:09:02 ] >>182 シミロン読んでるんですが、高階論理をトポスに対応させて いるところを Curry-Howard 同型と考えていいわけですか?
187 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 18:26:11 ] >>186 まあそうなんだけど、関数に対応するものがトポスの射になってる。 普通の集合論では、「はじめに一者あり」である。存在論的な形になっていて、その一者(実は、空)から、すべての存在が生成される。 では、Mac Lane が指摘した、論理学ではどうなるか。 ところが関数型の場合、「はじめに働きあり」である。なんじゃそりゃ、と思うかもしれない。 普通の集合論では、関数は、集合の一種(つまり、グラフ)として定義される。 でもこちらは、逆に、関数から集合を定義しようということなのだ。 この関数概念を一般化したのがシミロンのトポスの射。
188 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 18:31:40 ] Grothendieckは位相空間 X より X 上 の層全体のなす圏(トポスになる) がより本質的だと考えた。 彼はこの考えを、エタールコホモロジーのアイデアとともに得た。
189 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 18:34:39 ] >>187 解説ありがとうございます。 ちょっと外出してきますのでまたのちほど。 すみませんです。
190 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 18:36:07 ] シミロンでやってるのはGrothendieckのオリジナルとは違って、 Kripke-Joyalの意味論での手続きによって集合論的論理式をトポスの対象と射についての言明として解釈したもの。
191 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 18:47:05 ] 実数の体系の持つ超越的な性格は集合論の初期から様々な数学者の嫌悪の的となった。 実数を定めるのに便利な集合論的定式化はやがて多くの数学者に受け入れられるようになったが、 20世紀初めに論理学者のブラウワーは直観主義とよばれる、具体的に構成できるようなものだけを認める論理の体系をつくった。 彼はそこで実数について通常の数学におけるものとは著しく異なった結論を導きだせることを示した。 これにはKripke-Joyalの層の意味論によって現代的な解釈が与えられる。 シミロンのやってることを実行するとこんな風に実数の扱いなどがもっとブラウワー的に出来るようになります。
192 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 18:49:58 ] ただしCoqではKripke-Joyalの意味論は扱えないのでこのスレの趣旨からは外れますね。 つづきは数学板で質問してください。
193 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 19:10:59 ] λ式は、どのプログラマにとっても役立つ新たなツールです。最近ではVisual Basic 2008にも実装されました。 元々、Visual Basic 2008 (以前のコード名は "Orcas") にλ式が追加されたのは 、LINQ (Language Integrated Queries) をサポートするためです。 これは、Visual Basic でのデータ プログラミングを可能にするものです。 λ式を使用すると、プログラムの柔軟性が向上することがわかります。 λ式は、関数内で定義される呼び出し可能なエンティティであり、何の制約もなく利用でき、 したがって、λ式を関数から返したり他の関数に渡したりできるからです。 λ計算(lambda calculus)は、理論計算機科学や数理論理学における、関数の定義と実行を抽象化した計算体系であるλ算法とも言う。 関数を文字λ)を使った式によって表記する。アロンゾ・チャーチとスティーヴン・コール・クリーネによって1930年代に考案されたものです。 1936年にチャーチはλ計算を用いて一階述語論理の決定可能性問題を否定的に解いた。 λ計算は「計算可能な関数」とはなにかを定義するために用いられることもある。 λ計算は1つの変換規則(変数置換)と1つの関数定義規則のみを持つ、最小の(ユニバーサルな)プログラミング言語であるということもできる。 ここでいう「ユニバーサルな」とは、全ての計算可能な関数が表現でき正しく評価されるという意味である。 これは、λ計算がチューリングマシンと等価な数理モデルであることを意味している。 チューリングマシンがハードウェア的なモデル化であるのに対し、λ計算はよりソフトウェア的なアプローチをとっている。 λ計算は計算の意味論や型理論など、計算機科学のいろいろなところで使われており、特にLisp、ML、Haskellといった関数型プログラミング言語の理論的基盤として、 その誕生に大きな役割を果たしたが、とうとうVisual Basicにまで搭載されたことで、今後、その重要性は益々増大するだろう。
194 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:43:42 ] いま帰りました。 つまり、空集合から始まる現代集合論はもう 終わりの時代を迎えた、ということですか? シミロンを読んでいて、ラムダ項もある種の 射に対応するのを知り目から鱗が落ちました。
195 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 21:53:13 ] >>192 そうですね。数学板にいきます。
196 名前:デフォルトの名無しさん mailto:sage [2008/01/02(水) 22:55:53 ] Lisp ⇒ Common Lisp Lisp ⇒ Scheme Lisp ⇒ ML ┌―――┘ ↓ ML ⇒ Miranda ⇒ Haskell ⇒ Erlang ML ⇒ Miranda ⇒ Clean ⇒ Concurrent Clean ML ⇒ SML ML ⇒ CAML ⇒ OCAML ⇒ (そろそろこないかなぁ?)
197 名前:デフォルトの名無しさん mailto:sage [2008/01/02(水) 23:38:37 ] Erlangは違くない?
198 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 04:13:52 ] ついついOCamlという字面を見ると『岡村』って読んじゃう。 SMLをSmileって読んじゃうみたいに。でも頭の中はSMのことでいっぱい。 EclipseやElispをエロリスプとか。
199 名前:デフォルトの名無しさん [2008/01/03(木) 14:03:05 ] >>196 Haskell→Erlangはおかしいでしょ
200 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 14:18:11 ] Clean ⇒ Concurrent Clean ⇒ Clean
201 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 23:11:56 ] OCamler ⇒ 岡村さん SMLer ⇒ 須村さん Schemer ⇒ 隙間さん
202 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 23:27:49 ] 数学わかる人がいなくなると急にレベル下がっちゃうね。
203 名前:デフォルトの名無しさん [2008/01/04(金) 01:21:28 ] Visual Basicやりたい放題なんだな。 VB.NET化であれだけ振り回した後だともう既存のユーザの移行コストとか考えないでいい空気なんだろうか。
204 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 10:14:36 ] 別にラムダ式を入れるのに後方互換を犠牲にする必要はないだろ
205 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 17:31:47 ] COMつかい放題なのに文法が残念だからカオスでOK
206 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 22:50:49 ] VBはスレチだから置いとくとして、F#は何度かアップデートされたら化ける可能性はある。 OCAMLが完全に止まってるだけにちょっと気になる。
207 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 00:06:15 ] q-lang.sourceforge.net/ これなんか面白そう
208 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 00:25:51 ] >>207 Q言語って音響・映像に特化してるのかな? これで作られた "Q+Faust+Pd" はかなり大規模な感じ。 関数型の特性を生かしてフィルターとかが多いみたいですね。
209 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 22:59:09 ] >>206 言語そのものの出来より、MSが力入れるかどうかだな。
210 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 01:19:39 ] >>209 現在のF#はfunctorが使えないからちょっとね。 でも今後のアップデートで何を追加するのかロードマップを示してくれると興味も湧くんだけどなぁ。 MSが力を入れてくれると期待したい。
211 名前:デフォルトの名無しさん [2008/01/06(日) 23:46:06 ] ttp://www.infoq.com/articles/pickering-fsharp-workflow ここ見た感じだと結構ちがう言語に見える yield とかあるんだね
212 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 23:58:10 ] >>211 F#の記事ですね。 記者は手続き型でしか考えられない人かな? forループ連発が意図的なのかよくわからなけど、あまり良い例じゃないなぁ。
213 名前:デフォルトの名無しさん [2008/01/07(月) 00:15:51 ] この記事のforは全部F#独自のシーケンス内包表記でしょ。 書いた人もFoundations of F#の人だし。
214 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 00:26:33 ] >>213 for使うと再帰より速度が出るとか?
215 名前:デフォルトの名無しさん [2008/01/12(土) 10:03:20 ] 3.10.1でたね。プレステ3でビルドできるみたい?
216 名前:デフォルトの名無しさん [2008/01/12(土) 18:38:12 ] >>215 何の?
217 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 02:37:14 ] caml.inria.fr/ocaml/release.en.html The most recent version of Objective Caml is 3.10.1. It was released on 2008-01-11. Some of the highlights in release 3.10 are: * Instance variables in classes can be declared virtual and implemented in subclasses. Syntax is val virtual v : t. * Printing of stack backtraces on uncaught exceptions, previously available only for bytecode-compiled programs, is now supported for native-code programs as well. (Supported on Intel/AMD and PPC, in 32 and 64 bits). * New ports: MacOS X, PowerPC, 64 bits; Microsoft Windows 64 bits (x64) using the Microsoft PSDK toolchain; Microsoft Windows 32 bits using the Visual Studio 2005 toolchain. * The Camlp4 preprocessor was partially reimplemented and offers a new, more modular API for syntax extensions. (Users of third-party syntax extensions may wish to stay with OCaml 3.09 until these extensions are ported to the new API.) * A new experimental tool, ocamlbuild: a compilation manager that automates the building of OCaml applications and libraries. See the draft documentation.
218 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 21:53:45 ] 流れをぶったぎっちゃうけれど、質問させてください SML#のページにあるSMLFormatってcamlp4みたいなものなの? 説明見てもちょっと理解できなかったので… サンプルも何か追加で入れないと動かないのもあるみたいなので使ったことある方とか居たら、どんなものか聞かせてください
219 名前:デフォルトの名無しさん [2008/01/13(日) 22:32:40 ] 使ったこと無いけど解説読むと普通のフォーマッタ/プリティプリンタじゃないかな。
220 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 21:14:36 ] F#版Parsec ttp://www.quanttec.com/fparsec/index.html F#版STM ttp://cs.hubfs.net/blogs/hell_is_other_languages/archive/2008/01/16/4565.aspx
221 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 22:41:00 ] schemeのiotaみたいなのってocamlにないですかね
222 名前:デフォルトの名無しさん [2008/01/17(木) 08:21:32 ] Arrayにはある。ListにはExtlibにある。
223 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 23:14:49 ] トン。
224 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 00:08:30 ] できたー。ライブラリインストールに手間取った;; ExtList.List.init 100 ((+)1);; 結構タイプ量おおいな;;
225 名前:デフォルトの名無しさん [2008/01/18(金) 00:27:11 ] Extlibは基本open ExtListとかして使うものだよ。 ListまでをopenしないのはOCaml流だと思ってあきらめるしかないけど。
226 名前:218 mailto:sage [2008/01/18(金) 22:06:57 ] >219 遅くなってごめんなさい ありがとう
227 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 20:16:22 ] >>225 遅くなったけど、ありがとう ばっちり使わせてもらいます。
228 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 17:31:49 ] windows用のexeファイルを作りたいのですがどうすればいいですか? VC++ expressインストールすればできますか?
229 名前:デフォルトの名無しさん [2008/01/23(水) 08:10:53 ] 同梱のドキュメントに書いてあるよ。
230 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 23:43:03 ] 同じint -> int = <fun>なのに、RandomではException: Invalid_argument "Random.int"がでます ○ExtLib.List.init 10 ((+)1);; ×ExtLib.List.init 10 Random.int;; 説明では、Invalid_argが出るのは初期値(↑だと10)が負の時とあるけど、これってもしかしてバグ?
231 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 23:46:44 ] ↑無視してくださいRandom.int 0がエラーでした。
232 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 23:02:51 ] 次スレのタイトルを「関数型言語ML(SML, OCaml, F#, etc.), Part 6」として「【.NET】F#について語れ【OCAML】」スレを合流させれば過疎らなくて済むかねぇ。 ML系過疎り杉w
233 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 23:03:20 ] たった今ハマりかけたのでちょっと書いとく。 Array.copyで新規作成されるのは一次元目の配列だけで、 二次元、三次元とかの値は前の値を差し続けてる。 まるごとコピーしたいときはその次元専用のcopyを作った方がいいみたい。
234 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 03:01:51 ] 228じゃないけどうまくいかないや。 masm32もVC++も入れたしmasmのINCLUDE、LIB、PATHも通したのに。 一応Visual StudioのVCのPATH入れたり masm32のbinにcl.exeやmspdb80.dll入れてみたりしたけど駄目だった。 う〜ん、masmとVC++アンインストしようかしらw
235 名前:デフォルトの名無しさん [2008/01/26(土) 00:34:24 ] エスパー能力を期待しないでくれよ
236 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 12:53:22 ] すみません,勉強し始めたばかりで,わからないことがあります. 指定した数だけランダムな数字を出力したいです. やってみたところ再帰が止まらないです... どうして>.<b # let rec print_random n = if n = 0 then 2 else begin print_int (Random.int 2); print_random n-1; end;;
237 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 12:59:31 ] >print_random n-1; これが(print_random n)-1;と解釈されるからだな print_random (n-1);とすればよろし
238 名前:sage [2008/01/30(水) 14:49:02 ] ocamlbuild はゴミ あれで便利便利って言って喜んでる奴はまだロクなもん書いてない さらなるゴミ p4 のビルドで必要なのがさらにゴミ ゴミのおかげで make world の時間がもったいない
239 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 17:18:38 ] >>237 ありがとうございます〜〜〜 少しずつ型チェックってなんのかわかってきました.いろいろ書いてみます! let rec cntRandom n zeroCnt oneCnt= if n = 0 then zeroCnt else ( if ((Random.int 2) = 0) then cntRandom (n-1) (zeroCnt+1) oneCnt else cntRandom (n-1) zeroCnt (oneCnt+1) );;
240 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 21:00:52 ] token listを受け取って整形式XMLなら(string,string) xmlを返すxml_of_tokensを作れ、という問題に 3日ぐらい挑んでいるのですが、わかりません。誰か助けて。 type token = PCDATA of string | Open of string | Close of string;; type ('a,'b) xml = XLf of 'b option | XBr of 'a * ('a,'b) xml list;; 入力: [Open "a"; Open "b"; Close "b"; Open "c"; PCDATA "Hello"; Close "c"; Close "a"] 出力: XBr ("a", [XBr ("b", []); XBr ("c", [XBr ("Hello", [])])]) 入力の型と出力の型が違うのでわけわかりません 閉じタグとか考えてると、スコープが足りないです。 スコップをください。
241 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 00:21:39 ] >>240 全然深く考えてないけど,スタック使えばいいんじゃないの?
242 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 10:32:25 ] >>240 PCDATAはXLfでなくて良いのか? exception ParseException of string let rec parse (xs : token list) (context : string list) (ks : ('a,'b) xml list list) : ('a,'b) xml = let add_child ks x = match ks with | [] -> raise (ParseException "internal error: add_child") | (k::ks1) -> (x::k)::ks1 in match xs with | [] -> if context <> [] then raise (ParseException ("some tags are not closed:" ^ (String.concat "," context))) else hd (hd ks) | (PCDATA str)::xs1 -> if context = [] then raise (ParseException ("toplevel PCDATA:" ^ str)) else parse xs1 context (add_child ks (XBr (str, []))) | (Open tag)::xs1 -> parse xs1 (tag::context) ([]::ks) | (Close tag)::xs1 -> if (hd context) <> tag then raise (ParseException ("close tag mismatch:" ^ tag ^ " appeared where " ^ (hd context) ^ " expected")) else parse xs1 (tl context) (add_child (tl ks) (XBr (tag, (rev (hd ks))))) let run_parse xs = parse xs [] [[]]
243 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 22:14:54 ] うおーありがとうございます! (Open tag)::xs1の箇所で、ひとつ先読みする再帰になるのかと思って ずっと考えてたけど、全然違った・・ あと、ご指摘のとおりPCDATAはXLfのほうが良さそうですね 上のadd_childみたいな関数が必要になるかどうかの判断って 自分には職人技の世界に思えるんですが 一般的なやり方みたいなのあるんですかね。 とりあえず、上記を参考に自分でも書けるよう頑張ってみます。
244 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 23:51:48 ] ねぇねぇ、OCamlでオブジェクトを使わないって人いる? そういう人ってレコードを拡張したい時どうしているの?
245 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 00:19:05 ] OCamlのクラスって副作用ありますか?
246 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 00:54:00 ] 副作用ありのオブジェクトも作れますし、なしのも作れますよ。 副作用あり # class point = object val mutable x : int = 0 method set_x v = x <- v end;; class point : object val mutable x : int method set_x : int -> unit end 副作用なし # class point' = object val x : int = 0 method set_x v = {< x = v >} end;; class point' : object ('a) val x : int method set_x : int -> 'a end
247 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 02:49:12 ] OCamlでlet _ = ... とlet () = ... 構文の違いがよくわかりません。 使い分けがあるのでしょうか?
248 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 21:32:35 ] let _ =... と let () =... とでは、使える状況が違う。 前者は名前の束縛を省略しただけで右式がどんな型になっても構わないけど、 後者は右式がunit型にならないとダメ。 どちらも print_string のような副作用が目的の式によく使うけど、 私は戻り値が要らないという意味で、let _ =...で統一している。 これだと let _ = Thread.create f () とかでも対応できる。
249 名前:247 mailto:sage [2008/02/06(水) 23:43:09 ] >>248 ありがとうございます。 # let () = true;; Characters 9-13: let () = true;; ^^^^ This expression has type bool but is here used with type unit やってみたら確かにそうです。 悩んでいたのでとても参考になります。
250 名前:デフォルトの名無しさん [2008/02/07(木) 10:23:25 ] 俺は戻り値がunit じゃない状況を区別するために let () = を使ってる let _ = は、 ignore @@ Unix.system "rm -rf hoge" とか
251 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 10:40:36 ] labelglutを使っていて GluMat.gluPerspective ~fovy:(45.0) ~aspect:(1.0) ~zNear:(0.1) ~zFar:(100.0) って書いてもUnbound value GluMat.gluPerspectiveって言われてちゃう wwwfun.kurims.kyoto-u.ac.jp/soft/lsl/lablgl.txt www.opengl.org/sdk/docs/man/xhtml/gluPerspective.xml を見て書いたのですがどこがいけないかわかりません>.<b
252 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 23:12:43 ] >>251 まさかライブラリの指定を忘れてるなんて落ちはないよな。 ocamlc -I +lablGL lablgl.cma lablglut.cma ... という感じでコンパイルしなきゃいけないはずだけど?
253 名前:247 mailto:sage [2008/02/08(金) 02:21:31 ] >>250 統一するか区別するかOCaml内のコードを調べてみます。 多いほうにしてみます。
254 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 09:33:48 ] >>252 大体原因がわかった exampleにあった GlMat.ortho ~x:(-1.0, 1.0) ~y:(-1.0, 1.0) ~z:(-1.0,1.0); を調べてみたら void glOrtho( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble nearVal, GLdouble farVal); でなっていてGLの引数と違う名前になっていたのね GluMat.perspective ~fovy:(45.0) ~aspect:(1.0) ~zNear:(0.1) ~zFar(100.0); GluMat.perspective ~fovy:(45.0) ~aspect:(1.0) ~z(0.1, 100.0); 見たく試してみてもダメだったw どっかに引数に関してマニュアルないわけ?
255 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 21:25:54 ] >> 254 .mli 見ろや: val perspective : fovy:float -> aspect:float -> z:float * float -> unit
256 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 01:59:10 ] cygwin 3.10で実行しています。 while true do print_string "debug1\n"; ignore (Unix.recv sock buf 0 (String.length buf) []); print_string buf; print_string "debug2\n"; done;; を実行したのですが、 print_string "debug1\n"; が実行されず、プログラムが停止して、動きません。 コンパイル時にエラーはありませんでした。 何がいけないのでしょうか?
257 名前:デフォルトの名無しさん [2008/02/14(木) 06:49:29 ] >>256 システムに関係なく print_string は buffering されているので flush stdout が必要。 デバッグには stderr に出力 + flush の prerr_endline をおすすめする。 次の pervasives.mli のコメントをよく読んでくれ: val print_string : string -> unit (** Print a string on standard output. *) val print_endline : string -> unit (** Print a string, followed by a newline character, on standard output and flush standard output. *) val prerr_endline : string -> unit (** Print a string, followed by a newline character on standard error and flush standard error. *) こういう細かいことって日本語の O'Caml の本には書いてないのかな?
258 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 20:34:46 ] >257 ありがとうございます。 prerr_endlineを使用したところ、うまく動作するようになりました。