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/
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し続けるプロセスを生成 という感じでどうだろう
283 名前:デフォルトの名無しさん mailto:sage [2008/03/18(火) 01:11:13 ] >>282 うぅぅ入門 Ocaml 片手の私には動作がイメージできません・・・ recvしてもすぐsendされて別のに切り替わらないとかになりませんか? とりあえず挑戦してみます。
284 名前:デフォルトの名無しさん [2008/04/12(土) 21:49:11 ] 引く手あまたのプログラミング言語は? slashdot.jp/developers/article.pl?sid=08/04/06/2313251 --- Java(16479件)、C++(8080件)、C#(7780件)、JavaScript(6749件)、 Perl(5710件)、PHP(2641件)、Python(1408件)、COBOL(1207件)、 Ruby(769件)、Lisp(33件)といった感じらしい。 とりあえずJavaとC/C++/C#、あとJavaScriptを覚えれば、 当分仕事には困らないようである。COBOLのしぶとさも目立つ。 ちなみにHaskellやOCamlの求人は10以下だったそうだ。 ---
285 名前:デフォルトの名無しさん [2008/04/12(土) 23:05:22 ] 10もあったのか。
286 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 23:50:30 ] 1000ならbrainf*ckの求人をだす
287 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 23:54:05 ] 0 じゃないのか・・・。 冒険してる会社もあるもんだな。
288 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 00:36:55 ] 10以下に0は含まれるがなw
289 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 10:37:39 ] 理屈上はそうだが、記事として書くなら、 0なら0と書くか話題にも上らないかのどっちかだろう
290 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 10:56:58 ] ちなみにCとMLは省かれてます。 検索結果を加工した統計なので。
291 名前:デフォルトの名無しさん [2008/04/20(日) 15:48:14 ] >> 171 Debian or Ubuntuなら、 # apt-get install coqide でok
292 名前:デフォルトの名無しさん mailto:sage [2008/04/20(日) 16:30:04 ] どちらかが10件あったから、わざわざ10以下と書く場合もあるってことね。
293 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 21:40:54 ] 関数型言語は、変数への代入もforループも使わずにプログラムできるって聞いたけど どういうこと??? ここにきても全然わからん。
294 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 21:42:19 ] 再帰すればループできるじゃん。
295 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 22:03:38 ] SML#0.40マダー?チンチン(AA略
296 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 13:36:36 ] >>154 # let ( *.. ) a b = range a b;; val ( *.. ) : int -> int -> int list = <fun> # 1 *.. 10;; - : int list = [1; 2; 3; 4; 5; 6; 7; 8; 9; 10]
297 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 21:59:44 ] >>293 関数の戻り値を次の関数へ放り込んだり、戻り値の一部だけ次の関数に放り込んで、残りをさらに次の関数に放り込んだりするのだ。
298 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 22:40:38 ] >>293 ちょっと富豪的だが、ループは>>296 のようなリストで置き換えると 最初は考えやすいと思う。 大雑把な説明だが for(int i=1;i<=10;++i){printf("%d\n",i);}は 高階関数mapを使ってこう。 List.map print_endline (1 *.. 10)
299 名前:デフォルトの名無しさん [2008/04/24(木) 23:05:54 ] えーintとstringの型あってないし、そこはmapじゃなくてiterじゃないの用途的に
300 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 23:39:18 ] うは、俺あほw
301 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 23:49:18 ] ちゃんと書いとこう。今Ocamlの処理系ないから部分的にF#で試したコードだけども。 List.iter (fun x -> print_endline (string_of_int x)) (1 *.. 10)
302 名前:デフォルトの名無しさん [2008/04/25(金) 00:35:19 ] 書籍の質問いいですか? プログラミングinOcaml(初版1刷)を読んでるんですが P65のNewton-Raphson法のとこでベージ下部の式変形が y = f'(x_i) * x - {f'(x_i) * x_i - f(x_i)} x軸と交わる点がx_i+1なのでy=0としてxについて解くと x_i+1 = x_i - {f(x_i)/f'(x_i)} * x_i が得られます となってるんですが x_i+1 = x_i - {f(x_i)/f'(x_i)} じゃないですかね?
303 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 21:29:32 ] JavaのThread.sleepみたいな関数を探しています。 OCamlで「n秒待つ」関数みたいなのは、何ですか? 次のようなプログラムを書いています。 let rec loop count = print_endline (print_int count); (* ここで1秒待ちたい *) loop (count + 1) let main = loop 0
304 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 21:41:38 ] Unix.sleepかThread.delay
305 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 22:00:51 ] >>302 とりあえず正誤表にはなかったよ。もっかいコード見直したら? ttp://www.sato.kuis.kyoto-u.ac.jp/~igarashi/OCaml/
306 名前:デフォルトの名無しさん mailto:sage [2008/04/25(金) 22:23:27 ] >> 304 できました! どうもありがとうございます!!
307 名前:デフォルトの名無しさん mailto:sage [2008/04/26(土) 01:07:52 ] >>293 ループは再帰のときに引数を変えれば良い。 してifやパターンマッチで止める。 let rec loop i = if i<0 then () else (print_int i; loop (i-1));; 代入なくても書けるというのは lambdaの引数を利用する。 代入がこんな感じなら let i = 1 in i + i;; こう書ける。 (fun i -> i+i) 1;;
308 名前:デフォルトの名無しさん [2008/04/27(日) 01:10:46 ] letの方はそれ代入じゃない
309 名前:デフォルトの名無しさん mailto:sage [2008/04/27(日) 08:38:49 ] refでやればいいのかよう
310 名前:sakura [2008/04/27(日) 11:45:53 ] こうなんというか深夜亀頭から白濁色の液が滲み ぷっつん。
311 名前:デフォルトの名無しさん mailto:sage [2008/04/28(月) 00:36:21 ] >>302 誰がどう見ても誤植です。どうもありがとうございました。
312 名前:デフォルトの名無しさん mailto:sage [2008/04/29(火) 16:34:33 ] HaMLet v1.3.1 www.ps.uni-sb.de/hamlet/CHANGES.txt SML#にも対応 ベンチマーク用のSML実装としての、あるべき姿か 誰ぞ、SML#をNJ、MLtonとベンチしてたもう
313 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 13:29:42 ] 関数型言語F#をわかりやすく解説した動画とかないの??
314 名前:[Power of Scala] mailto:sage [2008/05/03(土) 16:42:43 ] >>313 関数型言語Scalaの動画 ttp://d.hatena.ne.jp/video/youtube/SCl0pkrQn1A
315 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 18:03:03 ] >>314 関数型言語というよりもオブジェクト指向型の印象が強い言語だな。 カリー化すら出来ないし、代数的データ型すらないじゃないか。 関数型言語の特徴というべき代表的な機能が欠如しているのは関数型言語として致命的。 だから、Scalaはオブジェクト指向型言語だ。
316 名前:デフォルトの名無しさん mailto:sage [2008/05/03(土) 19:28:52 ] 制限時間関係なくこの人早口っぽいな〜。
317 名前:Objective Caml mailto:sage [2008/05/03(土) 20:11:11 ] >>313 F#じゃないけど OCamlの動画 - YouTube ttp://www.youtube.com/watch?v=3A8lEraqGzQ
318 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 00:18:19 ] OCamlをすこしかじってF#にも興味もったんだけど、 F#って.NETのライブラリが使えるのと、オブジェクトが使えないの以外にどんな点がF#と違うの? 文法面はほぼ同じだと聞いたんだけど。
319 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 00:28:24 ] F#はHaskell.NET同様その内サポートされなくなるところが違う。 MSの単なるデモンストレーションだから。
320 名前:デフォルトの名無しさん mailto:sage [2008/05/04(日) 01:26:50 ] >>318 データの型が.NET互換になってて、演算子がオーバーロードされる。 例えば +. 演算子はなくなってて実数の足し算でも + 演算子を使う。 クラスは.NETのクラスになるので、クラス定義まわりの文法にだいぶ変更がある。
321 名前:デフォルトの名無しさん [2008/05/04(日) 23:20:06 ] Jane Street Capital謹製のcoreが公開されたね。 Extlibでもcoreでもいいから標準ライブラリに取り込んでくれないかなあ。
322 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 01:08:14 ] >>315 いや、あるよ>カリー化&代数的データ型 単に紹介されてないだけ
323 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 01:13:40 ] ちゃんと説明するとScalaには代数的データ型そのものは無いけど、 case classという機能をつかってほぼ同等(以上)のことができる。こんな感じ /* 代数的データ型 */ abstract sealed class Exp case class Add(a :Exp, b :Exp) extends Exp case class Num(v :Int) extends Exp def eval(e :Exp) :Int = e match {//パターンマッチ case Add(l, r) => eval(l) + eval(r) case Num(v) => v } eval(Add(Num(1), Num(2))) まあ、MLの代数的データ型の定義に比べて記述が冗長だけど、機能的には 問題ない。
324 名前:デフォルトの名無しさん mailto:sage [2008/05/10(土) 10:05:39 ] >>323 つまりScalaは関数型言語であるっていうこと??
325 名前:デフォルトの名無しさん mailto:sage [2008/05/11(日) 22:57:45 ] >>324 定義によるけど、たぶん言って良いと思う。MLが関数型言語であるというのと 同じ程度には。
326 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 06:56:30 ] >>325 どうも
327 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 13:01:46 ] 代数データ型があるかどうかは、関数型かどうかを左右しない。 ただ今時の関数型言語に代数データ型を持っているのが多いというだけ。
328 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 17:48:27 ] 関数型言語という言葉に明確な定義が無い以上、ある言語が関数型かどうかは 「典型的な関数型言語」にどれくらい似ているかという尺度で測る他無いんじゃね?
329 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 19:25:20 ] あなたがそう思うものが関数型言語です。 ただし、他人の同意を得られるとはかぎりません。
330 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 20:02:47 ] 無意味なレスしてんなよ noob
331 名前:デフォルトの名無しさん mailto:sage [2008/05/12(月) 23:17:55 ] >>319 逆だよ。 F#は製品化が決まって現在仕様の取りまとめ中。
332 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 08:09:27 ] >>328 そんなわけないだろw 代数的データ型があるかどうかは、関数型言語かどうかの尺度にはならない。 >>331 あそこは仕様=実装って会社でしょ。 V0.9的な仕様作ってそれでおしまい。
333 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 09:58:17 ] もともと仕様と実装が同じ言語から派生した言語に何を求めるのか.
334 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 14:55:39 ] >>332 じゃあ、何が尺度になるの?もちろん、代数的データ型*さえあれば*関数型言語 だとは言うつもりは無いけど、関数型言語の定義なんて人によってかなり曖昧な わけだ。MLとかHaskellとかのまず間違いなく関数型言語だと認定してもらえる言語と どれだけ同じ機能を持っているかで比較するしか無いんじゃない?
335 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 16:08:24 ] プログラムが参照の透明性のある関数だけで構成されていること でいいんじゃない?
336 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 16:54:44 ] stateがないってんじゃ駄目なの? monadでstateは扱えるけど、 stateがあるわけじゃないよね。 stateがないってことを厳密にいうと、 「ある時にy=f(x)ならば、どんな時でもy=f(x)」ってことでいいのかな?
337 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 17:17:45 ] > プログラムが参照の透明性のある関数だけで構成されていること じゃあ、MLやOCamlはNGじゃん。ref型があるわけだから。
338 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 17:54:46 ] >>337 関数だけで構成されていること でいいんじゃない?
339 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 20:49:17 ] >>338 それだとHaskellすらNGだな
340 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 20:56:34 ] C++ だって関数型言語なのに!
341 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 21:44:13 ] >>340 ないないそれはない
342 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 21:47:37 ] それ有名なネタだよ
343 名前:デフォルトの名無しさん mailto:sage [2008/05/13(火) 21:49:08 ] マクロとテンプレートを思いっきり使えば それらしいコードは書けるかもしれない。
344 名前:デフォルトの名無しさん [2008/05/14(水) 07:36:28 ] omake はええぞ。omake -P を知ったらやめられん。
345 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 11:58:34 ] Boost おそるべし
346 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 19:10:58 ] でもないw
347 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 09:53:43 ] 今日職場で出た話題。 以下のOCamlコードが最終行でエラーには * ならなさそうで、 * でもなりそうで、 * でもやっぱりならない理由と、 この問題の意図を考えなさい。 let id x = x let unify x y = if true then x else y let v = id `A let _ = unify v `B let _ = match v with | `A -> ()
348 名前:デフォルトの名無しさん [2008/05/17(土) 10:31:08 ] なんでエラーになりそうなのかわからない。
349 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 11:19:41 ] >| `A -> () なんかAAぽい
350 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 13:48:50 ] >>349 怒ってため息をついてるね。w
351 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 15:38:52 ] 標準で関数型プログラミングをサポートする言語=関数型言語じゃね 標準のSTLだけだと関数型プログラミングは厳しいのでC++は入らないと思う
352 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 17:10:34 ] Q. 関数型プログラミングとは? A. 関数型言語が標準でサポートしているプログラミング
353 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 21:04:26 ] 相互再帰ですか
354 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 21:44:22 ] >>353 無限に再帰してて、止まらないわけですね、わかります。
355 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 22:08:01 ] 再帰なんて簡単だお。
356 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 22:32:21 ] >>347 >今日職場で出た話題。 どこの職場ですか?日本ですか?
357 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 00:30:58 ] let id x = xと let v = id `Aと let _ = match v with | `A -> () だけみれば`Aと`Aだからエラーにならなそうで let unify x y = if true then x else y let _ = unify v `B もみるとxとyが同じ型じゃないとエラーで`Aと`Bだからエラーになりそう でも多相バリアントだからエラーにならないみたいな。 なんか問題がわるいな
358 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 00:32:16 ] 357は>>347 へのレス 書き忘れたorz
359 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 01:16:05 ] type 'a 関数型言語 = { 変数 : 参照透過; 関数 : 高階; 型 : 代数的; } constraint 'a = 多相
360 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 08:22:31 ] >>351 個人的にはSTLがどれほど充実しようが、後付けのクロージャが qsort に渡せ ない時点で除外したい。箱庭の中だけで関数プログラミングをサポートしても、 その言語が関数型とは言い難い。どんな言語でも関数型言語を「実装」する事 は出来るので。
361 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 12:09:28 ] std::sort に渡せりゃそれで十分じゃん。
362 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 16:41:50 ] qsortのほうがずいぶん遅いしね
363 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 16:49:38 ] >>362 プラットフォームによるとqsortの方が団地に早かったりするんですが どのようなプラットフォームでお仕事をしておいででしょうか?