1 名前:デフォルトの名無しさん mailto:sage [2009/06/15(月) 07:15:21 .net] 関数型言語MLについて語るスレッドです。 MLは、確固とした理論的背景を持つ言語でありながら、 現実的なソフトの開発にも使用できる実用性を備えた言語です。 また、プログラミングの初心者が最初に学習する言語としても優れています。 総本山 Standard ML www.smlnj.org/ Objective Caml caml.inria.fr/ocaml/ 前スレ 関数型言語ML(SML, OCaml, etc.), Part 5 pc12.2ch.net/test/read.cgi/tech/1186292994/
701 名前:デフォルトの名無しさん mailto:sage [2013/09/17(火) 01:27:30.95 .net] あー opam installで途中で止まるー もう寝る
702 名前:デフォルトの名無しさん mailto:sage [2013/09/17(火) 03:26:52.06 .net] アパーム!!
703 名前:デフォルトの名無しさん mailto:sage [2013/09/17(火) 09:53:15.37 .net] >>692 エラーメッセージはなんて出てますか? #opam
704 名前:デフォルトの名無しさん [2013/09/17(火) 12:09:35.38 .net] >>694 寝て起きたら終わってた エラーメッセージらしきものが出てたら まだググればなんとなく解決の糸口を探せるんだけど 止まったように見えるのは勘弁してほしい・・・
705 名前:デフォルトの名無しさん mailto:sage [2013/09/17(火) 12:15:30.59 .net] Ubuntuだと入ってるのかもしらんが Lubuntu入れたからm4ってのが足りなくて進まないのに難儀したわぁ
706 名前:デフォルトの名無しさん mailto:sage [2013/09/17(火) 12:36:12.34 .net] とりあえず opamからutopとcore入れたけど 他に入れといた方がいいってのある?
707 名前:デフォルトの名無しさん mailto:sage [2013/09/17(火) 14:31:45.87 .net] asyncとか?
708 名前:デフォルトの名無しさん [2013/09/17(火) 20:04:07.17 .net] open Core.Std しても ウンともスンとも言わないのはどうして?
709 名前:デフォルトの名無しさん mailto:sage [2013/09/17(火) 20:37:23.49 .net] toplevelなら最後に;;付けないと評価されないぞ。
710 名前:デフォルトの名無しさん mailto:sage [2013/09/17(火) 21:34:31.77 .net] 付けてもダメ
711 名前:デフォルトの名無しさん [2013/09/18(水) 10:24:04.40 .net] OSの問題か? UbuntuでbatteriesとかCore使えてる人いますか?
712 名前:デフォルトの名無しさん mailto:sage [2013/09/18(水) 10:42:31.06 .net] 違うと思うけど 標準のモジュールは使える? open List;;とか
713 名前:デフォルトの名無しさん mailto:sage [2013/09/18(水) 11:54:58.58 .net] open List;;も #load "nums.cma";; も行ける
714 名前:デフォルトの名無しさん [2013/09/18(水) 17:03:13.40 .net] #use "topfind";; #require "batteries";; open Batteries;; でバッテリーつかえたぁぁぁ 疲れた でもCoreはスーパーユーザーやないと使えないんだけど emacsからスーパーユーザーってどうするんだ?
715 名前:デフォルトの名無しさん mailto:sage [2013/09/18(水) 17:09:49.70 .net] su emacs # ?
716 名前:デフォルトの名無しさん mailto:sage [2013/09/18(水) 17:22:01.73 .net] ってかここで聞く事じゃないけど .emacsなんてなんだよ・・意味不明
717 名前:デフォルトの名無しさん mailto:sage [2013/09/19(木) 02:32:35.94 .net] 可能性1. Coreライブラリのパーミション指定がおかしいため、通常ユーザーでは読めない。(あまり現実的じゃない) 可能性2. opamをsudoで実行した。 可能性3. Ubuntuリポジトリにあるcoreパッケージをインストールした一方で、opam+findlibを個人権限で導入し、 そのため/usr/lib/ocaml/以下をfindlibが探していない。 可能性3なら、~/.opam/system/lib/findlib.confを編集することで解決する。
718 名前:デフォルトの名無しさん [2013/09/19(木) 09:33:14.80 .net] できた!ありがトン 端末たちあげたら先ず初めになんでも sudo -iしてたのがダメだったのかなぁ utopだと出来るけどemacsだと Error: Reference to undefined global Conditionsってでる うーん emacsの勉強が必要だなぁ core_kernelだと大丈夫なのはなぜなんだぜ? coreとcore_kernelって同じもの?だよね
719 名前:デフォルトの名無しさん mailto:sage [2013/09/19(木) 16:09:42.28 .net] >>709 /home/fuga/.opam/system/lib/findlib.conf ------------------------------------ destdir="/home/fuga/.opam/system/lib" path="/usr/lib/ocaml:/home/fuga/.opam/system/lib" ocamlc="ocamlc.opt" ocamlopt="ocamlopt.opt" ocamldep="ocamldep.opt" ------------------------------------ pathをちゃんとしてれば、Linuxディストリビューションが提供するocamlライブラリとopamで個人利用のライブラリが併用できる。 普通にopam導入したら/usr/lib/ocaml以下を無視して全部~/.opam以下に入れようとしてくる。 面倒だから俺もちゃんとしてない(findlibがシステムとユーザー両方にあって気持ち悪い)が、 OCAMLFIND_CONFを指定したり何だりすればいいらしい。気が向いたら試してみてください。
720 名前:デフォルトの名無しさん mailto:sage [2013/09/20(金) 02:37:57.07 .net] >>707 emacsの設定ファイルだよ。弄ってる間に学生生活が終わった。
721 名前:デフォルトの名無しさん mailto:sage [2013/09/21(土) 18:47:36.60 .net] opamの1.1.0betaが出てるね
722 名前:デフォルトの名無しさん mailto:sage [2013/09/25(水) 00:38:24.09 .net] https://twitter.com/cliffordbeshers/status/382505685084160001 ICFPの季節か
723 名前:デフォルトの名無しさん [2013/09/28(土) 08:17:20.19 .net] SML#の話題ってここでいいの?
724 名前:デフォルトの名無しさん mailto:sage [2013/09/28(土) 09:00:06.71 .net] いいよ
725 名前:デフォルトの名無しさん mailto:sage [2013/09/28(土) 18:49:36.94 .net] SML#のページにあったスライドより: SML# は,Cやデータベースとの連携を備えた「ふつうの言語」を目指すML系関数型言語です. SQLをそのまま使える「ふつうの言語」...こいつ頭がお詳しいぜ! C、SQL、MLっていうのは欲張りだな。polyglotは楽しめるのかもしれんが。
726 名前:667 [2013/09/30(月) 10:28:11.89 .net] let rec add_h a = function [] -> [] | h::t -> (a::h) :: add_h a t;; let rec powerset = function [] -> [[]] | h::t -> let pt = powerset t in pt @ add_h h pt;; let nedan_list list goukei = List.filter (fun xs -> List.fold_left (+) 0 xs = goukei) (powerset list);; nedan_list [100;350;620;705] 720;; 過去スレにいいヒントがあったのでそれを使って やりたい事を実現できました。 OCamlの素晴らしさを実感するとともに もっと良い方法があれば教えてください。
727 名前:667 [2013/09/30(月) 10:36:53.22 .net] あー 数がちょっと増えるとすぐオーバーフローしちゃう これはダメだぁ・・・
728 名前:667 mailto:sage [2013/09/30(月) 11:26:09.48 .net] let rec powerset = function | [] -> [[]] | h::t -> List.fold_left (fun xs t -> (h::t)::t::xs) [] (powerset t);; あ、自己解決 こうすれば20数個行ける
729 名前:デフォルトの名無しさん mailto:sage [2013/10/01(火) 17:56:59.75 .net] ごっちゃになってたけど print_string "hello"; print_newline ();; と print_endline "hello" が同じ意味なんだな print_string "hello\n" が普通の書き方?
730 名前:デフォルトの名無しさん mailto:sage [2013/10/04(金) 23:18:06.53 .net] その程度ならどれも意味がすぐ分かるから、特に伝統は無い。 改行コードはOS毎にLF+CRだったりLFだったりするけど、そこら辺はどう考慮されているんだろう。 Linuxだと\nで改行、\rで現在の行を消して先頭からやり直し、みたいだけど。他のOSでも統一
731 名前:されてんのかね? [] [ここ壊れてます]
732 名前:デフォルトの名無しさん [2013/10/05(土) 09:27:34.70 .net] 副作用にも色々表現方法があって迷うなぁ まぁOCamlはそれがいいんだろうけど
733 名前:デフォルトの名無しさん mailto:sage [2013/10/05(土) 14:18:01.03 .net] 文字列だけなら print_string とか print_endline とかでいいだろうけど、 数値とか含むのを出力するときはどうするのがスマートなんだろう? 俺はだいたい Printf.printf を使ってしまうのだけど。
734 名前:デフォルトの名無しさん mailto:sage [2013/10/05(土) 14:42:49.03 .net] >>721 間違ってる Windows は CR+LF すなわち現在行を消して先頭に戻してから改行するのだッ
735 名前:デフォルトの名無しさん mailto:sage [2013/10/05(土) 14:51:34.09 .net] > Linuxだと\nで改行、\rで現在の行を消して先頭からやり直し、 OSのアプリが, 慣習的に "\n" を論理改行文字として扱ってる(tty ドライバーも このように扱いやすく作ってある)だけで, 端末制御として使う CR だとか LF とは 分けて考えるべきだと思うよ. 実際に tty を raw モードに設定すると, CR - LF("\r\n") を "\n" にマップする 作業はアプリの仕事になる. 端末から見た, 各制御文字の役割は以下であってそれ以外の何者でもない CR: カーソルを行の先頭に戻す, LF: カーソルを次の行に移動する(カラムは移動しない)
736 名前:デフォルトの名無しさん [2013/10/05(土) 17:25:39.93 .net] ocamlのcryptokit使おうとしたら、エラーになるんだがなんでなんだぜ。 Fatal error: cannot load shared library dllcryptokit_stubs Reason: dllcryptokit_stubs.so: cannot open shared object file: No such file or directory
737 名前:デフォルトの名無しさん [2013/10/06(日) 08:19:42.15 .net] #ocaml #opam 自己解決したっす dllcryptokit_stubs.so はopamゆーざーなら以下の環境変数の設定が必要っぽい export CAML_LD_LIBRARY_PATH=~/.opam/system/lib/stublibs/
738 名前:デフォルトの名無しさん [2013/10/09(水) 00:18:05.42 .net] なんかopamも便利なんだか不便なんだかわからんな
739 名前:デフォルトの名無しさん [2013/10/10(木) 12:26:47.83 .net] フィボナッチ計算させるときに メモ化するのもアキュムレータ使うのも 同じ振る舞いな気がするんだが 何か違うのかな?
740 名前:デフォルトの名無しさん mailto:sage [2013/10/10(木) 13:44:52.77 .net] 複数回呼び出したら違うんじゃないの
741 名前:デフォルトの名無しさん [2013/10/10(木) 14:11:03.39 .net] それぞれの f(n)までの値をそれぞれ1回ずつ計算して テーブルに入れるかレコードに入れるかの違いだから 計算回数は同じじゃね?
742 名前:デフォルトの名無しさん mailto:sage [2013/10/10(木) 18:11:17.89 .net] fibを何回か呼ぶことを言ってるんじゃねぇの
743 名前:デフォルトの名無しさん [2013/10/10(木) 18:49:43.04 .net] 呼ぶ回数=計算回数じゃないの? どっちもO(n)っぽいんだけど
744 名前:デフォルトの名無しさん mailto:sage [2013/10/10(木) 19:24:41.41 .net] fib(n) = fib(n-1) + fib(n-2) fib(n-2)は呼ばれるが、計算済みだから新に計算はしないってことでしょ。
745 名前:デフォルトの名無しさん [2013/10/10(木) 21:27:14.82 .net] そういう二重再帰じゃない方のフィボナッチだよ
746 名前:デフォルトの名無しさん [2013/10/10(木) 21:50:36.16 .net] let fib x = let rec fib_sub (x, accumulator1, accumulator2) = if x = 0 then accumulator1 else fib_sub (x - 1, accumulator1 + accumulator2, accumulator1) in fib_sub (x, 1, 0) こういう感じでアキュムレータ使うようなフィボナッチ
747 名前:デフォルトの名無しさん mailto:sage [2013/10/10(木) 23:36:42.55 .net] 何が言いたいのかわからん 末尾再帰のアキュムレータだろうが、 fib nをm回呼び出す場合メモ化ならO(m+n)だろ
748 名前:デフォルトの名無しさん [2013/10/11(金) 01:37:05.82 .net] >>734 この 二重再帰の計算オーダーはそうじゃないだろ??
749 名前:デフォルトの名無しさん mailto:sage [2013/10/11(金) 02:57:20.14 .net] >>735 >>738 メモ化のコード書いてくれないとわからない。 あと計算オーダーはそうじゃないのそうって何?
750 名前:デフォルトの名無しさん mailto:sage [2013/10/11(金) 03:24:27.66 .net] >>738 >>734 の場合でも、f(n)はf(n-1), f(n-2)がメモ化されている場合常にO(1) メモ化していない場合(最初の一回目)は再帰計算だからO(n) これはわかるな? その後 再帰メモ化版のfib(n)は、 それまでn以上の値が呼び出されていたならO(1)であり、 fib nをm回呼び出すならO(m)、2つ合わせて O(m+n) アキュムレータだけの場合、fib(n)は "常に" O(n) つまりfib nをm回呼び出すならO(nm) わかったか?
751 名前:デフォルトの名無しさん mailto:sage [2013/10/11(金) 04:17:04.97 .net] HaMLet がまさかのニューバージョン。 www.mpi-sws.org/~rossberg/hamlet/
752 名前:デフォルトの名無しさん [2013/10/11(金) 10:20:41.62 .net] >>740 あー >>734 はメモ化の再帰バージョンの話ね 理解した とすると >>729 この違いは 使い捨てならアキュムバージョンは 簡潔に書けて早く 使いまわすならメモ化した方が 再呼び出しは早くていいって感じか
753 名前:デフォルトの名無しさん [2013/10/11(金) 19:30:47.32 .net] SMLも開発すすんでるんだな
754 名前:デフォルトの名無しさん mailto:sage [2013/10/14(月) 18:44:12.10 .net] www.pllab.riec.tohoku.ac.jp/smlsharp/docs/1.0/ja/Ch1.S1.xhtml SMLの開発って、もしかしてSML#のこと?
755 名前:デフォルトの名無しさん mailto:sage [2013/10/14(月) 18:45:23.58 .net] あ、上のhamletのことか。
756 名前:デフォルトの名無しさん [2013/10/14(月) 18:54:06.65 .net] SML#は64ビット対応せんのかな。結構期待してるんだけど。
757 名前:デフォルトの名無しさん [2013/10/15(火) 01:40:51.77 .net] SML/NJとかも
758 名前:デフォルトの名無しさん [2013/10/15(火) 01:52:43.43 .net] Standard SMLってなんだろ?
759 名前:デフォルトの名無しさん [2013/10/15(火) 15:17:19.69 .net] int型のmaxって1073741823ですよね これを超えたらBig_intに切り替えたいんですが int型の計算でmax_intを超えたかどうかの判定って どうやったらいいですか?
760 名前:デフォルトの名無しさん mailto:sage [2013/10/15(火) 17:14:51.41 .net] 無理じゃね 最初からBig_int使えばいいんじゃね
761 名前:デフォルトの名無しさん mailto:sage [2013/10/15(火) 18:42:26.56 .net] 大学の研究室のプロジェクトだと、パワーのある院生がいる時にどかっと 進んだりするんだよなぁ。
762 名前:デフォルトの名無しさん [2013/10/15(火) 22:18:09.71 .net] キャリーフラグを無視しない高級言語ってごくわずかしかないよね。
763 名前:デフォルトの名無しさん mailto:sage [2013/10/15(火) 23:25:06.01 .net] そもそも1bit分フラグに使ってるからキャリーフラグなんて役に立たんでしょ SML#はどうか知らんけど
764 名前:デフォルトの名無しさん mailto:sage [2013/10/16(水) 22:57:21.15 .net] C++ blog.regehr.org/archives/593 ocaml batteriesには、SafeIntというのがあるらしい。参考になるかもよ。 dutherenverseauborddelatable.wordpress.com/2008/08/27/whats-up-with-batteries/
765 名前:デフォルトの名無しさん [2013/10/18(金) 10:52:33.25 .net] オブジェクトがさっぱりわからん レコードと何が違うんだ・・・
766 名前:デフォルトの名無しさん [2013/10/18(金) 12:04:36.71 .net] Obj.magic使えば 型なんて関係無くなる?
767 名前:デフォルトの名無しさん [2013/10/18(金) 12:12:18.87 .net] [Obj.magic 'a'; Obj.magic "abc"; Obj.magic 123];; すげー リストに型が違っても入るぞ 何に使えるんだろ?
768 名前:デフォルトの名無しさん [2013/10/18(金) 12:52:31.16 .net] Obj.magic 'a' + 1 ;; すげー こんなのもできるんだwwww 関数型言語界のgotoやで
769 名前:デフォルトの名無しさん mailto:sage [2013/10/18(金) 14:08:58.82 .net] 奇跡も魔法もあるんだよ。
770 名前:デフォルトの名無しさん mailto:sage [2013/10/18(金) 18:35:29.49 .net] ただしよくわからんで使うと死ぬ
771 名前:デフォルトの名無しさん [2013/10/18(金) 18:46:15.03 .net] OCamlって最強の言語じゃね? なんでみんなやらないんだろ
772 名前:デフォルトの名無しさん mailto:sage [2013/10/18(金) 18:49:32.53 .net] 変なライセンスだから
773 名前:デフォルトの名無しさん mailto:sage [2013/10/18(金) 18:53:24.02 .net] intが1ビット少ないとか、モジュールの仕様上スマートリンクができないとか ファーストクラスモジュールでOCamlのOたるオブジェクトがゴミになりましたとか そのファーストクラスモジュールは後付けで構文がカオスですとか、あと+.(笑)とかGC遅いとか ケチを付けようと思ったらいくらでも付けられるからなあ
774 名前:デフォルトの名無しさん mailto:sage [2013/10/18(金) 19:13:13.78 .net] Windows版の更新サボってるのが一番の原因だな
775 名前:デフォルトの名無しさん mailto:sage [2013/10/18(金) 19:31:42.10 .net] みんなって誰だよ
776 名前:デフォルトの名無しさん mailto:sage [2013/10/18(金) 19:33:25.20 .net] 研究室ではよく使ってる
777 名前:デフォルトの名無しさん [2013/10/18(金) 20:02:22.74 .net] >>765 健常者の集合
778 名前:デフォルトの名無しさん mailto:sage [2013/10/18(金) 22:46:49.64 .net] 言語の素性はともかくマンパワーは全然足りてないしな
779 名前:デフォルトの名無しさん [2013/10/18(金) 23:43:15.36 .net] スマートリンクってなんぞ?
780 名前:デフォルトの名無しさん mailto:sage [2013/10/18(金) 23:50:11.98 .net] sageたら教えてやる
781 名前:sage [2013/10/18(金) 23:56:08.97 .net] 教えてください
782 名前:sega [2013/10/19(土) 19:03:49.62 .net] 俺にも教えて
783 名前:デフォルトの名無しさん mailto:sage [2013/10/19(土) 22:25:27.91 .net] じゃあおれも
784 名前:デフォルトの名無しさん [2013/10/28(月) 11:48:04.04 .net] 汎関数と高階関数って同じ意味ですか?
785 名前:デフォルトの名無しさん [2013/10/28(月) 13:22:54.90 .net] ちがいます
786 名前:デフォルトの名無しさん mailto:sage [2013/10/28(月) 13:38:38.58 .net] おなじです
787 名前:デフォルトの名無しさん [2013/10/28(月) 13:43:33.45 .net] どっちだよ・・・
788 名前:デフォルトの名無しさん mailto:sage [2013/10/28(月) 13:58:52.58 .net] >>774 関数を計算の対象とすること、いいかえると、関数を引数として受け付けたり 関数を返す関数のことを「高階の関数」または「高階関数」という さらに、高階関数の中で計算の対象が関数だけなものを「汎関数」という つまり高階関数は広い概念で、汎関数は狭い概念 たとえば関数 map や filter は高階関数であるけれど、リストも計算対象だから汎関数ではない それに対して、合成関数 o は高階関数であるし汎関数でもある
789 名前:デフォルトの名無しさん [2013/10/28(月) 14:26:11.39 .net] let foo f g x = g (f x) ;; val foo : ('a -> 'b) -> ('b -> 'c) -> 'a -> 'c = <fun> って合成関数があったとして 'aの引数は計算対象外になるの?
790 名前:デフォルトの名無しさん mailto:sage [2013/10/28(月) 15:17:35.72 .net] >>779 記法のせいでわかりにくいけど ('a -> 'b) -> ('b -> 'c) -> ('a -> 'c) って考えればいい
791 名前:デフォルトの名無しさん mailto:sage [2013/10/28(月) 15:25:02.71 .net] あと汎関数は量を返す物をいうはず。 だから合成関数は汎関数でなく、高階関数。
792 名前:デフォルトの名無しさん mailto:sage [2013/10/28(月) 15:27:39.31 .net] 間違えた 合成関数を"返す" 関数は汎関数でなく、高階関数。
793 名前:デフォルトの名無しさん mailto:sage [2013/10/28(月) 15:32:51.19 .net] >>779 まず 'a は型変数だから、「'a の引数は...」という用法は日本語として不適切 で、もし質問の意図が「関数 foo の定義における第三引数 x は、関数 foo の計算対象外か?」 であるならば、答えは Yes 引数 x は関数 f の計算対象であるけれど、汎関数 foo の計算対象ではない 汎関数を定義する場合、>>779 も決して間違いではないが、以下のように書いたほうが、 「x は(fooの引数ではなく)無名関数の引数である」という意図が理解しやすいだろう(言語はSML) - fun foo f g = fn x => g (f x); > val ('a, 'b, 'c) foo = fn : ('a -> 'b) -> ('b -> 'c) -> 'a -> 'c >>781 では、その量を返すという汎関数の具体例を挙げてみてくれないか?
794 名前:デフォルトの名無しさん [2013/10/28(月) 16:06:23.87 .net] 例えばmapをばらしたときに let rec map f ls = match ls with [] -> [] | x::xs -> f x :: map f xs ;; val : ('a -> 'b) -> 'a list -> 'b list = <fun> たぶんこんな感じで再帰になってるけど 無名関数は再帰で書けないから 無名関数で書けたら汎関数でよい?
795 名前:デフォルトの名無しさん mailto:sage [2013/10/28(月) 16:10:19.68 .net] >>783 >では、その量を返すという汎関数の具体例を挙げてみてくれないか? なんで? とりあえず、定義っぽいのは見つけたよ。 www.encyclopediaofmath.org/index.php/Functional
796 名前:デフォルトの名無しさん [2013/10/28(月) 16:41:42.96 .net] ん?schemeはYコンビネータを使って Y = (λf . (λx . f (x x)) (λx . f (x x))) 無名再帰ができると書いてあるな 何が違うんだろ?動的言語だと出来るとか?
797 名前:デフォルトの名無しさん mailto:sage [2013/10/28(月) 17:26:32.96 .net] >>784 汎関数の定義に無名関数を使うことは多いけど、 だからといって、すべての無名関数を用いた定義が汎関数となる訳ではない だから「無名関数で書けたら汎関数でよい?」という質問については No だ ただし「引数としてある関数を渡すとmapと同等な無名関数を返す」汎用的な関数が 定義できるのであれば、その関数は汎関数であるといえるだろう なお、再帰と汎関数は直交するから再帰を伴わない汎関数も存在する(たとえば合成関数 o) したがって「再帰で書けたら汎関数でよい?」という質問についても No となる >>785 数学における用語「汎関数」と計算機科学における「汎関数」をごっちゃにしているのでは? で、ここは(数学板ではなく)プログラム板だ
798 名前:デフォルトの名無しさん mailto:sage [2013/10/28(月) 17:37:07.70 .net] >>787 >数学における用語「汎関数」と計算機科学における「汎関数」をごっちゃにしているのでは? えええー!初耳だよそんなの。 計算機科学の汎関数の定義は?
799 名前:デフォルトの名無しさん [2013/10/28(月) 19:17:55.24 .net] 同値再帰型なんてのもあるんだね OCamlって最強言語じゃね?
800 名前:デフォルトの名無しさん [2013/10/30(水) 09:26:41.50 .net] 高階関数のままと 簡約した形と 評価までの速度に違いがあるのかな? 見やすさで選ばれてるだけ?