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/
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の方が団地に早かったりするんですが どのようなプラットフォームでお仕事をしておいででしょうか?
364 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 17:12:28 ] windows。それ、最適化してんの?
365 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 17:24:49 ] >>36 qsort() の呼び出しでは関数ポインタの呼び出しが多いから、インラインで置換するコードには負けてしまうと思います。
366 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 18:25:41 ] >>363 プラットフォームって、インライン最適化もできない糞コンパイラを使えばって話か?
367 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 18:46:20 ] あるいはstd::sortに関数ポインタを渡してるとか
368 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 20:41:28 ] おもしろいな。 関数呼び出しコスト以上に速くなる?
369 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 07:57:36 ] >>361 qsort はただの例。ライブラリの形で別言語を実装しておいて関数型でございっ てのが気に入らないってだけ。関数ポインタを要求している所に渡したり、新 しい関数ポインタのインスタンスを実行時に作れないと。
370 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 08:58:50 ] > ライブラリの形で別言語を実装しておいて 言語内の機能で実装しているんだぜ?
371 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 21:49:06 ] クロージャはファーストクラスじゃないとね
372 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 22:47:50 ] >>370 それいうとあらゆる言語が関数型を名乗れるから。
373 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 23:02:44 ] >>370 それいったらアセンブラだって関数型だろwww
374 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 06:52:47 ] つまらんんこと言っとらんでコード書け。
375 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 08:27:19 ] C++のboost:lambdaみたいなのを、 言語の本来の機能で実装できるのってないんじゃねえ?
376 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 10:04:38 ] >>375 boost.lambda 見てないんだけど Lisp のマクロ、R6RS のマクロでも無理?
377 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 11:19:19 ] 関数型は最初からラムダ式があるから必要ないのでは。 zip(list1, list2, _1 + _2) //←こんな感じ。
378 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 17:44:55 ] Boostはポリシーによるプログラミングができる (lambda (lambda (funcname)) (funcname ...)) ↑こんなイメージ。これはLISPだったらマクロなしだと実現不可能じゃない? 型システムが閉じてないことが前提だから OcamlやF#ではこれ、実現不可能だと思う //ちら裏:自分はBoostが関数型言語やろうと思ったきっかけ
379 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 17:52:12 ] >>378 マクロ書けばええやん? 言語本来の機能でっせ、Lisp のマクロは…
380 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 18:56:16 ] >>378 >LISPだったらマクロなしだと その前提が間違い。何の為の S 式だか。
381 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 22:14:56 ] すまん、今の流れでマクロなしってのは間違ってるなw しかし、マクロありでもポリシーによるプログラミングはLISPでは不可能なんじゃね? ここでS式が出てくるのはなぜ? 静的な型を持つ言語じゃないとコンパイル時型チェックの利点はなくなるし 単なるダックタイピングになってしまう 現時点では閉じていない多態かつ静的な言語って 俺が知る限りC++ぐらいしかないけど他にあるのかな Template Haskellとかどうなんだろ
382 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 22:19:20 ] >>381 >ここでS式が出てくるのはなぜ? 興味無いくせに聞くなよ
383 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 22:26:20 ] >>381 declare すりゃいい話だし、元気があればコンパイラ書き換えれば OK 型推論でも何でもできるんじゃないか?
384 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 22:28:55 ] ああ、コンパイラ作るのか・・その発想はなかったわw
385 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 21:52:19 ] >>384 つか, 処理系自体にシンタックスパーサからコンパイラまで含んでて そいつらを自前の定義に書き換え可能な言語相手に何を戦ってるんだか
386 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 23:06:06 ] >>378 すまんが、このコードで何をしてるのか参考までに教えてくれ・・・ >>385 C++に脳を冒されて、そんな言語が存在することを知るよしもないんだろう
387 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 05:23:56 ] >>339 いや、セーフだろ
388 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 07:28:36 ] 職場で出た話題。 O'Caml で、v == v は真なのに v = v は偽な値 v は存在するか。
389 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 08:16:39 ] NaN
390 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 21:55:52 ] >>375 >静的な型を持つ言語じゃないとコンパイル時型チェックの利点はなくなるし OCamlは型推論で静的な型が付くからC++並にコンパイル時型チェック働くよ 型変換がらみのバグ出づらい分むしろ安全だと思うけど。 (* てかboost:lambdaコンパイル遅すぎ *)
391 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 23:38:28 ] >>390 OCAMLだとこれに相当することができない(STLC<U>が定義済みの場合だけOCamlでも可能) C++では定義済みかどうかは関係なく宣言できる STLライクなデータに対する探索コード template <template <typename T> class STLC,typename U,typename R> bool has_data(STLC<U>&data,const R&value){ typename STLC<U>::iterator it = std::find(data.begin(),data.end(),value); if(it!=data.end())return true; else return false; }
392 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 00:30:15 ] begin(data)がイテレータ関数を戻すなら find(b,v)はdataの型と関係なく定義出来る (イテレータ関数の型には影響をうける) クロージャ使えるって忘れてない?
393 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 01:10:33 ] >>391 > 宣言できる 「定義できる」かな? 宣言ももちろんできるけど。
394 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 01:17:03 ] 念のため言っておくけど、上はあくまでどうしてもイテレータ使いたいならの話 リストは、|でパターンマッチして再帰でグルグルが普通
395 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 01:22:07 ] 要は先に定義が必要だったりはしないので、391は間違ってると思われ
396 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 01:39:44 ] >>391 の例自体は不適切かもしれんが、C++のテンプレートにできて他の殆どの言語にできないことがあるのは事実だよ C++のテンプレートの顕著な特徴は ・型検査と名前解決の一部がインスタンス化まで遅延される ・特殊化(テンプレート引数に対するパターンマッチ)ができる で、メジャーな言語でこれを備えてるのはC++の他にはDくらいしかないはず