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/
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を使用したところ、うまく動作するようになりました。
259 名前:デフォルトの名無しさん [2008/02/15(金) 16:42:11 ] OCamlで共有ライブラリを作ったり、それと動的リンクするようなプログラムを作るには、 Makefileにどう書けばいい?
260 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 17:01:35 ] >>259 stublib のことなら ocaml のソースの otherlibs/graph などを参考に。 otherlibs/Makefile.shared を include してあるが、そこに大体書いてある。
261 名前:259 mailto:sage [2008/02/16(土) 16:35:26 ] >260 ごめん、説明不足だった。 OCamlで書かれたライブラリがあって、それを自分で書いたOCamlのコードから使いたいんだけど、 ライブラリの方がLGPLなのでできれば静的リンクしたくないんだ。
262 名前:デフォルトの名無しさん [2008/02/16(土) 16:59:23 ] >>261 3.10現在、無い。バイトコードだとstubを読みに行く方法があるけど。 OCamlのライブラリは多くの場合LGPLの例外事項が追加されていると思うんだけど、 そういうのはないの? 以下はsexplibの例。 As a special exception to the GNU Lesser General Public License, you may link, statically or dynamically, a "work that uses the Library" with a publicly distributed version of the Library to produce an executable file containing portions of the Library, and distribute that executable file under terms of your choice, without any of the additional requirements listed in clause 6 of the GNU Lesser General Public License.
263 名前:259 mailto:sage [2008/02/16(土) 17:31:46 ] >262 ありがとう!勉強になった。 調べてみたけど、例外事項は入ってないみたいだ。 ライブラリのメーリングリストを流し読みしたところ、 「オブジェクトファイルを添付すればいいだけなんだから別に問題なくね?」 という結論になった模様orz まぁ実際そのとおりだから、そうすることにするよ。
264 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 01:27:40 ] ttp://www.ocaml-tutorial.org/ja なんかつながんね
265 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 01:47:54 ] >>264 繋がるよ?
266 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 01:59:31 ] オレは繋がらない。
267 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 08:56:08 ] 俺も問題ない
268 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 12:11:08 ] Ocamlの入門者ですが、n重のリストの要素数を数えたいと思って ↓のように書いてみたのですがエラーになります。 型推論などまだよくわかってないのですが、Ocamlではこのような関数は書けないのでしょうか。 # let rec moredeeplen = function | [] -> 0 | (hd :: tl) :: rest -> 1 + moredeeplen tl + moredeeplen rest | _ :: rest -> 1 + moredeeplen rest;; This expression has type 'a list but is here used with type 'a list list
269 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 21:42:05 ] >>268 自分も勉強中だからはっきりとは言えないけどムリじゃないかな? まず、n重のリストを関数に適用しようにも、 n=1のリストは'a list n=2のリストは'a list list n=3のリストは'a list list list …ていう用にそれぞれ型が違うのでどんな入れ子リストにでも対応できる関数は書けない。 現実にそういうことがやりたいなら、バリアントとリストを組み合わせることになると思う。
270 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 21:51:43 ] >>268 O'Caml の気持ちを代弁すると、 moredeeplen の型は多分 'a list list -> int だと思うんだが、 再帰的に呼ぶ際に moredeeplen tl の所で 'a list -> int という違う型で 使っている。なのでアウト。 普通は 268 が書きたいような、型を利用した再帰関数は ML の多相型では 書けませんな。
271 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 21:59:39 ] > ocaml -rectypes Objective Caml version 3.09.3 # let rec len v = List.fold_left (fun s v -> s + (len v)) 0 v;; val len : ('a list as 'a) -> int = <fun> # len (let rec v = [v; v; v] in v);; Stack overflow during evaluation (looping recursion?). はっ、初学者を混乱させるだけか...。
272 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 10:12:55 ] >>271 その定義は常に 0 を返すのだが。 let rec len v = List.fold_left (fun s v -> s + (len v) + 1) 0 v;; # len [[[];[]]; []];; - : int = 4 面白いけど 268 がやりたいこととはちょっと違いますね。
273 名前:268 mailto:sage [2008/02/22(金) 11:03:06 ] 酷いコードを例示したのに色々考えてくださってありがとうございます。 簡単にはできないということで先に進もうと思います。
274 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 01:03:08 ] こちらのスレの方々はどうなのでしょう? pc11.2ch.net/test/read.cgi/tech/1186030985/244n
275 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 23:31:52 ] >>274 accumulator は後にするかなあ 複雑にならないなら fold とかで済ませたいと思っちゃうけど
276 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 01:59:47 ] すいません、↓の記事を見かけたのですが、結局yieldってどんな風に実装するんですか? itpro.nikkeibp.co.jp/article/COLUMN/20070612/274231/
277 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 02:33:33 ] >>276 π-calculusは俺も勉強中なんだが、 この本が役に立つぜ www.amazon.co.jp/Communicating-Mobile-Systems-Robin-Milner/dp/0521658691 質問ですが、 GUIライブラリが充実しているネイティブコンパイラ付きの関数型言語はありませんか? HaskellもOCamlもこれといってまともなGUIライブラリが存在しないので・・・
278 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 03:02:36 ] wxHaskellはまともなGUIライブラリに数えてくれないのか
279 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 09:13:48 ] yieldの中身の作り方の参考にはならんのでは>ミルナー本
280 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 10:02:42 ] wxHaskellは前回の公式リリースからだいぶ時間がたってるしなぁ。 その間にGHCも6.4から6.8になってるわけで…。 久しぶりにSourceforgeのほう見てみたら wxhaskell-0.10.3-rc1 ってのが出てた。 sourceforge.net/project/showfiles.php?group_id=73133
281 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 10:20:29 ] LablGTKは駄目なのか? wwwfun.kurims.kyoto-u.ac.jp/soft/olabl/lablgtk.html
282 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 11:18:21 ] >>276 ・グローバルなunit chan refを一個作る(qとする) ・yieldはqからのrecvとして実装 ・トップレベルのプロセスを生成した後に、qにsendし続けるプロセスを生成 という感じでどうだろう