関数型言語ML(SML, OCaml, etc.), Part 4
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2005/11/26(土) 20:09:00MLは、確固とした理論的背景を持つ言語でありながら、
現実的なソフトの開発にも使用できる実用性を備えた言語です。
また、プログラミングの初心者が最初に学習する言語としても優れています。
総本山
Standard ML http://www.smlnj.org/
Objective Caml http://caml.inria.fr/ocaml/
前スレ
関数型言語ML(SML, OCaml, etc.), Part 3
http://pc8.2ch.net/test/read.cgi/tech/1103606223/
過去ログ、関連リンクは>>2-4あたり
0002デフォルトの名無しさん
2005/11/26(土) 20:09:31http://lang.x0.com/func/ml/
■チュートリアル
Standard ML
http://www-2.cs.cmu.edu/afs/cs/usr/rwh/public/www/introsml/
http://www.dcs.napier.ac.uk/course-notes/sml/manual.html
http://www.dcs.ed.ac.uk/home/stg/NOTES/
http://yk.i.hosei.ac.jp/smlbook/smlbook.pdf
http://www.summa.jp/tutorial/plain/mlkouza.txt
Objective Caml
http://www.csc.vill.edu/~dmatusze/resources/ocaml/ocaml.html
http://www.sato.kuis.kyoto-u.ac.jp/~igarashi/class/isle4/mltext/ocaml.html
http://www.biocaml.org/~bannai/ocaml-intro/
http://www.ocaml.jp/archive/document/
■過去スレ
関数型言語ML(SML, OCaml, etc.), Part 3
http://pc8.2ch.net/test/read.cgi/tech/1103606223/
let t = 関数型プログラミング言語ML 2
http://pc5.2ch.net/test/read.cgi/tech/1058630709/
関数型プログラミング言語ML
http://pc5.2ch.net/tech/kako/1012/10124/1012445015.html
ML!!!!!!
http://pc.2ch.net/tech/kako/1002/10021/1002111468.html
0003デフォルトの名無しさん
2005/11/26(土) 22:15:190004デフォルトの名無しさん
2005/11/27(日) 12:17:13ヽ-───i===i─-}ァ' ノ ゲロ以下のにおいが
、` ー-===-゚---゚==‐' / プンプンするぜッ─ッ!!
、`¨フ>;''ニニゞ,;アニニY´; ) こんなクソスレには出会ったことが
_、;;)¨´,ニ=゚='" ,.ヘ=゚:く {ッリ' ねえほどなァ─ッ
i1(リ r;:ドヽ K
ヾ=、 に二ニヽ `|; )
_,ノ| i. {⌒゙'^ヽ.{ i;; ヽ
_,ノ!i ヽ、 ヾ二ニソ ,';;; ;;冫=:、
_;(|.!. \ ‐っ /!;;; ;;/ 、''"\__ お前は生まれついてのヒキヲタだッ!
'ト、\. ,ゝ、.二..イリ\ / ー1\'ニゝヽ_
:ヽ `ニア ,. -┴‐‐' ー-:l :=ゞ=ソ」=ヽ ム板の皆さん
:::::\ ニ=ト、.i___`ー-┴-、ノ . l __l| ,ニト、くヽ
l::::::::::\ー:ト __}/ト、゙ ー-‐| ,ニ|ゞ=ハ `¨´ー- 早えとこ
;ニ=ー:::::::ヾト、._  ̄ ノ|::ヽ ニ._‐-ゞ=' .ノ ::|::::::::::: 隔離しちまいな!
0005デフォルトの名無しさん
2005/11/27(日) 15:34:26だったらお願いですけど、関数型言語を習熟している中の人たちは
もう少しWebアプリの方向に手を広げてくれないでしょうか?
多くの人たちが救われるのではないかと思います。
0006デフォルトの名無しさん
2005/11/27(日) 16:46:290007デフォルトの名無しさん
2005/11/27(日) 18:01:58OCaml には ocamlnet や mod-caml、 as/xcaml なんかがあって、実際に運用
されているわけだがそれでは不満?
ライブラリが未整備ということなのか、(日本語の)ドキュメントが不足してるっ
てことなのか、webアプリケーションフレームワークが欲しいってことなのか。
それとも単に実例が見てみたいとかそういうこと?
0008デフォルトの名無しさん
2005/11/27(日) 18:24:17たぶん実例にそったプロジェクトXな話が聞きたいものと思われ。
0009デフォルトの名無しさん
2005/11/27(日) 20:35:180010デフォルトの名無しさん
2005/11/27(日) 22:18:00軒並みビルドに失敗するんですけど・・・
ocamlfind 自体のインストールはうまくいってると思うんだけど
(ocamlfind --list とかはきちんと動いてるっぽい)
ocamlfind ocamlc -c ... -package ...
系の実行が全て失敗する
同じようなことでトラぶった人います?最悪Makefile手で書き換えるしか
ないんだろうか
0011デフォルトの名無しさん
2005/11/27(日) 22:46:540012デフォルトの名無しさん
2005/11/27(日) 22:54:25なっているしなぁ
でもこんなの使わないで素直に書いてもそんなに
大変じゃないのにね
0013デフォルトの名無しさん
2005/11/28(月) 00:46:36トラブル起きたことないなぁ。 ocamlfind query とかの結果はどうなるの? 環境は?
list は上手く行くのに ocamlc -c すら失敗するというのは、 META ファイル
の内容がおかしいんじゃないの?
ひょっとして、たとえば camomile を使うのに pcre とか unix を -package で呼んでないとかいうオチはない?
依存関係とかは追ってくれないから自分で指定しないとダメだよ。これにやられたことはある。
0014デフォルトの名無しさん
2005/11/29(火) 04:09:48SML#
0015デフォルトの名無しさん
2005/11/29(火) 08:55:10扱えない場合、たとえば Haskelとかではスレッド間の共有メモリを
どうやって実現するのだろうか
0016デフォルトの名無しさん
2005/11/29(火) 10:36:280017デフォルトの名無しさん
2005/11/29(火) 14:19:20訳もわからず Monad と言ってみるテスト
0018デフォルトの名無しさん
2005/11/29(火) 22:22:230019デフォルトの名無しさん
2005/11/30(水) 10:04:25http://www.strangelights.com/fsharp/ChineseChess.aspx
.NET との連携を学ぶ良いサンプルだと思う
0020デフォルトの名無しさん
2005/11/30(水) 13:03:24Haskellとスレッドという概念がマッチしないような気がする。
スレッドプールから起動するHaskell Servletなんてのを想像しても
どういう実行モデルになるのかイメージすら湧かない。
0021デフォルトの名無しさん
2005/11/30(水) 13:55:34GHC にも Hugs にも普通に Concurrent っつーライブラリがあります。
並列計算を抽象化した STM モナドってのもあります。
また、最初から Concurrent を意識して設計された
Concurrent Clean っつー純粋関数型言語もあります。
つーかスレ違いです。
0022デフォルトの名無しさん
2005/12/01(木) 07:22:510023デフォルトの名無しさん
2005/12/01(木) 07:46:580024デフォルトの名無しさん
2005/12/01(木) 07:51:360025デフォルトの名無しさん
2005/12/01(木) 16:52:310026デフォルトの名無しさん
2005/12/01(木) 19:39:29おいおい、逆だろ・・・
0027デフォルトの名無しさん
2005/12/01(木) 22:09:330028デフォルトの名無しさん
2005/12/02(金) 21:24:510029デフォルトの名無しさん
2005/12/03(土) 00:35:03現実をみつめないとJavaのすごさはわからないだろうねw
0030デフォルトの名無しさん
2005/12/03(土) 01:07:00言語でなく、ライブラリやフレームワークだからな…
あの資産を、MLから利用したい気はする
# MLj とかいわないでね
0031デフォルトの名無しさん
2005/12/03(土) 03:05:390032デフォルトの名無しさん
2005/12/03(土) 10:55:53MLの人はへたればかりですか?
0033デフォルトの名無しさん
2005/12/03(土) 11:40:20神様なんざ、その時その時で都合の良いヤツを拝んどきゃ良いんであって、
何でもかんでも一つの神様で片付けようなんてナンセンスだってことに気付けよ。
コンピュータの世界ってのは日本と同じで八百万の神様の国なの。
全知全能の神なんてものは存在しない。
0034デフォルトの名無しさん
2005/12/03(土) 12:44:49なぜなら、一つを習熟し品質を高めれば似たような事をする場合に
早く高品質の物を作れるからだ。
大規模で複雑なプログラムを作る場合にも複雑な言語仕様に似た特性がでてくる。
そのため、一つの言語でやることでメリットが発生する。
しかし…
0035デフォルトの名無しさん
2005/12/03(土) 15:22:530036デフォルトの名無しさん
2005/12/03(土) 15:27:53Java --- セルシオ
ML ----- ミニ四駆w
ってかんじだよ、実際の話さ。
0037デフォルトの名無しさん
2005/12/03(土) 15:40:26MLってそれを指向した言語なんでしょ?
0038デフォルトの名無しさん
2005/12/03(土) 16:38:17多神教:物の区別ができない人
0039デフォルトの名無しさん
2005/12/03(土) 16:54:280040デフォルトの名無しさん
2005/12/03(土) 20:46:480041デフォルトの名無しさん
2005/12/04(日) 00:53:500042デフォルトの名無しさん
2005/12/04(日) 17:49:060043デフォルトの名無しさん
2005/12/04(日) 20:16:430044デフォルトの名無しさん
2005/12/06(火) 18:00:01GUIライブラリくれとまではとか言わないけど、最低限Windowだすくらいまではなんとかならんものか。
SDL for OCamlはなんかインストール失敗したし。
0045デフォルトの名無しさん
2005/12/06(火) 18:11:010046デフォルトの名無しさん
2005/12/06(火) 23:32:380047デフォルトの名無しさん
2005/12/07(水) 01:09:53本質的なところだけに集中できます。
0048osiire
2005/12/07(水) 13:28:46Window出すぐらいなら、なんとかなるぞ。ほんとにそれだけだけど。
ttp://www.h2.dion.ne.jp/~pana/downdown/downdown.html
0049デフォルトの名無しさん
2005/12/07(水) 16:59:48×JAVA
○Java
0050デフォルトの名無しさん
2005/12/08(木) 20:12:430051デフォルトの名無しさん
2005/12/10(土) 03:11:33経験者談キボン
0052デフォルトの名無しさん
2005/12/11(日) 13:07:580053デフォルトの名無しさん
2005/12/14(水) 06:55:260054デフォルトの名無しさん
2005/12/16(金) 09:45:150055デフォルトの名無しさん
2005/12/18(日) 23:22:59http://www.ps.uni-sb.de/hamlet/README-succ.txt
Successor ML とかいうSMLの拡張があるんだな。
0056デフォルトの名無しさん
2005/12/23(金) 16:13:01ボトムアップ的に拡張していけるのは理解できました。
type basic = [`Bool of bool | `Int of int]
module Props(X : sig type t = private [> basic] end) =
struct
let to_string (v : X.t) = match v with
`Bool b -> if b then "true" else "false"
| `Int n -> string_of_int n
| _ -> "other"
end
type extended = [basic | `Float of float]
module MyProps = Props(struct type t = extended end)
let to_string (v : extended) = match v with
`Float f -> string_of_float f
| #basic -> MyProps.to_string v
ところで、この MyProps.to_string を"上書き"して、`Float を含む
to_string に置き換えらるとさらに嬉しいのですが、スマートな方法って
ありますでしょうか?
0057デフォルトの名無しさん
2005/12/24(土) 16:10:52> MLは利用が研究室や個人で閉じているためか、
> コミュニティの存在を確認することはできませんでした。
> 住井英二郎さんのMinCaml(美しい日本のMLコンパイラ)が公開されていますが、
> これについても同様です。
0058デフォルトの名無しさん
2005/12/24(土) 19:20:27言語を使って作るものよりも言語そのものに興味のあるコミュニティじゃあね。
0059デフォルトの名無しさん
2005/12/25(日) 12:03:26ocam.jpは無視ですか。そうですか。
0060デフォルトの名無しさん
2005/12/25(日) 12:07:240061デフォルトの名無しさん
2005/12/25(日) 14:52:59# #load "graphics.cma" ;;
# Graphics.open_graph "" ;;
- : unit = ()
ただの標準のOCamlでな。
0062デフォルトの名無しさん
2005/12/25(日) 18:58:26l が抜けてるし。
0063デフォルトの名無しさん
2005/12/31(土) 18:09:280064デフォルトの名無しさん
2005/12/31(土) 20:03:160065デフォルトの名無しさん
2006/01/04(水) 16:59:50| length (x::xs) = 1 + (length xs)
0066デフォルトの名無しさん
2006/01/06(金) 17:04:560067デフォルトの名無しさん
2006/01/07(土) 00:36:31http://www.kecl.ntt.co.jp/icl/kpro/isozaki/standardml.html
0068デフォルトの名無しさん
2006/01/15(日) 13:01:53このページで「Objective CamlとOCamlを比較してやるぜ」と、
レイトレーシング・プログラムで速度比較してるんですが、
正直なところそのふたつの言語の違いが分かりません。
OCamlってObjective Camlの略だと思っていたんですが・・・?
0069デフォルトの名無しさん
2006/01/15(日) 20:48:19プログラミング言語基礎論のような専門的話題について理解がないと
MLでなくとも出来ることに限られてくると思います。
また専門的話題をネットだけで勉強するのはやはり無理というか
限界があるのでは…。
「田舎の学問より京の昼寝」というか、やはり(英語の)成書や大学なり
(国際)学会なりで、ちゃんと見聞きするのに比べると…。
0070デフォルトの名無しさん
2006/01/15(日) 21:09:05誰に言ってるの?
0071デフォルトの名無しさん
2006/01/16(月) 02:14:56学会論文も英語の良書もネット公開されてたりするし、
ネットだけでアカデミックな勉強をするのも可能だと思うよ。
学会参加による顔と顔をつきあわせた議論のようなものは難しいけど、
メールのやりとりだってできるし、なんとかなるんじゃない?
0072デフォルトの名無しさん
2006/01/16(月) 11:28:10>>71みたいなことも出来ると思う。
0073デフォルトの名無しさん
2006/01/16(月) 11:34:11# Unix.getcwd();;
Reference to undefined global `Unix'
とかって出ちゃって、
# #load "E:\\Program Files\\Objective Caml\\lib\\unix.cma";;
これを打っておくと使えるようになるんだけどこういうもんなの?
0074デフォルトの名無しさん
2006/01/16(月) 12:08:210075デフォルトの名無しさん
2006/01/16(月) 14:48:27Linux版でもそうなります.
これはデフォルトのトップレベル(ocaml)に unix ライブラリが
リンクされてないから(だと思います).
unix ライブラリをリンクしたトップレベルを作るには
$ ocamlmktop -custom unix.cma -o unixtop
みたいな感じで出来ます(Linux版の場合です.Windows版は詳しくないので…).
後は
$ ./unixtop
で,いちいち#loadしなくてもUnixモジュールが使えます.
0076デフォルトの名無しさん
2006/01/16(月) 14:58:52で宵と思われ
0077デフォルトの名無しさん
2006/01/16(月) 15:23:27stdlib: 全てのアーキテクチャで実装されている、はず
otherlibs: されていない可能性がある
例えば Unix モジュールは昔の mac os には実装されていなかったはず。
その代わり、最低限のファイル操作は Pervasives と Sys を通して
提供されている。
そういう経緯のためか unix はデフォルトでリンクされません。
0078デフォルトの名無しさん
2006/01/16(月) 15:37:46とりあえず76のやり方でWindowsでもできた。どうもありがとう。
0079デフォルトの名無しさん
2006/01/16(月) 16:44:31http://caml.inria.fr/pub/docs/manual-ocaml/manual035.html
には Windows における対応状況が記載されてる。
けど、今どれくらい動くかについては知らないので何とも言えません。
0080デフォルトの名無しさん
2006/01/16(月) 22:08:230081デフォルトの名無しさん
2006/01/17(火) 15:28:280082デフォルトの名無しさん
2006/01/18(水) 15:40:08できれば何が不満か詳しく。
0083デフォルトの名無しさん
2006/01/18(水) 23:32:480084デフォルトの名無しさん
2006/01/18(水) 23:51:400085デフォルトの名無しさん
2006/01/19(木) 00:38:25いまさら変える必要はないと思うが。あ、HaskellはPosixだね。
0086デフォルトの名無しさん
2006/01/19(木) 00:49:04しかしどうでもいい。
0087デフォルトの名無しさん
2006/01/20(金) 12:59:010088デフォルトの名無しさん
2006/01/21(土) 13:41:400089デフォルトの名無しさん
2006/01/22(日) 02:58:440090デフォルトの名無しさん
2006/01/22(日) 12:01:420091デフォルトの名無しさん
2006/01/22(日) 12:03:490092デフォルトの名無しさん
2006/01/22(日) 12:05:280093デフォルトの名無しさん
2006/01/22(日) 23:25:440094デフォルトの名無しさん
2006/01/23(月) 04:35:530095デフォルトの名無しさん
2006/01/26(木) 21:12:560096デフォルトの名無しさん
2006/01/27(金) 00:46:31なにこの言語、がんじがらめって感じ。
型推論とかいろんなお節介機能でコンパイルを妨害しまくるし。
cとかjavaの方が1000倍生産性高いわ。
なんの為に存在すんの?
売りはなに?
0097デフォルトの名無しさん
2006/01/27(金) 00:57:36これがいいんじゃないか
>cとかjavaの方が1000倍生産性高いわ。
動いてからが地獄だけどね
0098デフォルトの名無しさん
2006/01/27(金) 01:00:08志村、多分クマ。
0099デフォルトの名無しさん
2006/01/27(金) 01:31:21じゃあ動きだしたら天国なのか?
0100デフォルトの名無しさん
2006/01/27(金) 02:09:22???
>>99
天国とまでは・・・微妙
けどコンパイル通すまでにした苦労はむくわれるぞよ
コンパイル通った時点で少なくともCのコードよりはバグが少ないはず
0101デフォルトの名無しさん
2006/01/27(金) 11:52:460102デフォルトの名無しさん
2006/01/27(金) 16:18:31思っているスーパー墓ーがいるスレはここですか?
0103デフォルトの名無しさん
2006/01/27(金) 16:31:06確かに地獄の門番が嫌がらせの用にコンパイルを阻んでくる分、
いざコンパイル通ったら信頼性は期待できますね。
でもそれでも同じ型だけど意図以外に書けてコンパイルも通ってしまう事例とか
結構ありそうなもんだが。
まあ大規模システム構築を将来しようと思った時の為に学んでおく価値があるんですかね。
SMLofNJって教育用でしたっけ?
実践用にはどれをやればいいですか?
0104デフォルトの名無しさん
2006/01/27(金) 16:37:02なんかリスト処理とか得意でしたよね。
でもあんまこみいった処理は期待できないな。
骨組みをMLで作って細部はcとかですか?
明後日の方向行っちゃいましたか?
0105デフォルトの名無しさん
2006/01/27(金) 16:41:54なにこの言語、道が一本しかないって感じ。
型推論とかいろんな親切機能で正しくないプログラムのコンパイルを妨害しまくるし。
cとかjavaの方が1000倍バグの生産性高いわ。
なんの為に存在すんの?
売りはなに?
0106デフォルトの名無しさん
2006/01/27(金) 17:07:33スーパーハカーが仰天超速コードを書ける事
(除Java)
責任の取れる人には自由を与えるべき
0107デフォルトの名無しさん
2006/01/27(金) 17:19:26ML type system で表現しきれないデータの invariance を壊せる
プログラムが書けてしまうという意味で 103 の指摘は正しい。
それは invariance を保つような constructer や access function
をちゃんと書いてから実装を隠蔽するとかやればかなり解決できる。
ただ、同じ問題は C, C++, Java にもあるし、同様に解決できるはず
だが、Java はともかく、 C や C++ はそれ以前の問題が多すぎ。
他人が書いた意味不明な seg fault を吐くコードのメンテしたいかい?
SML でも Caml でも Haskell でも、いちいちあげないが非常に複雑な
ソフトウェアシステムはいろいろ開発されているはず。
授業でやらされたからといって教育用の言語と言うわけではないよ。
ML 系のプログラムを学ぶ価値があるかだけど、今しばらくの内に
日本国内で企業で大規模プログラムを書く仕事につきたいのであれば、
逆に学ばないほうがいいかもしれんな。よりよい言語があるって
わかってるのに C でプログラムを書かされるのは正直辛そうだ。(w
自分で起業するか、既に ML に目覚めた開発をしている会社(海外とか
には幾つかある)に就職するとか、会社内で意識変革を起こす気概がある、
というのであれば別だけど…
私の見聞きした範囲では、プログラム開発グループ長ぐらいまでで、
新プロジェクトを C ではなく、 ML での開発とするということに理解を
示す人は、見識の広い人ならば十分いる。問題はそこから先、技術とか
わからん管理職が具体的な数字を示さんと動いてくれないのが問題だ
そうな。そうなると見切って spin-out するって手もあるが、日本では、
難しいか?
0108デフォルトの名無しさん
2006/01/27(金) 17:35:41SMLofNJで培った常識で他にも容易に参入できますか?
0109デフォルトの名無しさん
2006/01/27(金) 18:03:05のところで笑ってしまった
0110デフォルトの名無しさん
2006/01/27(金) 19:44:47下手すると角が立ちそうだなー。
色々好嫌いはあるだろうけど
言語間の参入はまたく問題ないっしょ。
0111デフォルトの名無しさん
2006/01/27(金) 20:42:04特徴解説きぼん
0112デフォルトの名無しさん
2006/01/27(金) 21:55:49いずれも関数型言語。以上
0113デフォルトの名無しさん
2006/01/27(金) 22:40:030114デフォルトの名無しさん
2006/01/27(金) 22:48:57持って言える人はいないのではないか。
0115デフォルトの名無しさん
2006/01/27(金) 23:21:10どっちも触ったが、わりと好みの方を使えばいいんじゃね?と思った。
SML/NJ は let 式に end がいるのがちょっと面倒なのだが、end を書きたいこともあるし。
0116デフォルトの名無しさん
2006/01/27(金) 23:22:060117デフォルトの名無しさん
2006/01/27(金) 23:58:34http://www.ps.uni-sb.de/~rossberg/SMLvsOcaml.html
SML の方が余計な記号が少なくて好き。スッキリしてる。
0118デフォルトの名無しさん
2006/01/28(土) 00:51:25ML を使う時は大抵ばりばりプログラム書くときだから小奇麗さは気にしない。
0119デフォルトの名無しさん
2006/01/28(土) 00:55:160120デフォルトの名無しさん
2006/01/28(土) 12:16:050121デフォルトの名無しさん
2006/01/28(土) 12:40:000122デフォルトの名無しさん
2006/01/28(土) 13:09:520123デフォルトの名無しさん
2006/01/28(土) 19:25:200124デフォルトの名無しさん
2006/01/28(土) 20:58:230125デフォルトの名無しさん
2006/01/28(土) 21:13:400126デフォルトの名無しさん
2006/01/28(土) 21:17:130127デフォルトの名無しさん
2006/01/28(土) 21:17:410128デフォルトの名無しさん
2006/01/28(土) 22:07:11んで、そのコンパイラを自分で使うのだろうか、、、
かなり自虐的だね。
0129デフォルトの名無しさん
2006/01/29(日) 00:41:310130デフォルトの名無しさん
2006/01/29(日) 02:09:52ML は ML コンパイラを作るための言語であると揶揄されることさえあるのに。
0131デフォルトの名無しさん
2006/01/29(日) 07:07:43やっぱバグの疑いを拭いされないんじゃね?
ML的に完璧に正しくコーディングできても。
0132デフォルトの名無しさん
2006/01/29(日) 07:44:14言語や処理系のパワーの証明となっているのですな。
だからMLもMLコンパイラでコンパイルすればいい。
gccがCで書かれてるのと同じようなもんだ。
0133デフォルトの名無しさん
2006/01/29(日) 08:38:47自己記述?はその後でしょ?
0134デフォルトの名無しさん
2006/01/29(日) 09:05:14でもMLみたいに言語記述に向いている言語なら
プリミティブな言語は使わないで、
最初からML自身で処理系を書けばいいんじゃないの?
という >131 へのコメントでした。
すでにいくつもMLコンパイラは出ているし、
それで困らないと思うんだけど。
0135デフォルトの名無しさん
2006/01/29(日) 09:55:45とは言え、バグの疑いを拭いされる日は多分永遠に来ないですね。
0136デフォルトの名無しさん
2006/01/29(日) 09:58:500137デフォルトの名無しさん
2006/01/29(日) 10:08:29ttp://www.amazon.co.jp/exec/obidos/ASIN/052156543X/
0138デフォルトの名無しさん
2006/01/29(日) 11:51:21JAVAなら安全性もあって、まともな言語だし、
所詮おもちゃのMLとはおおちがいだよ。
0139134
2006/01/29(日) 11:53:03バグの疑いを払拭できる日・・・それはどの言語、どの処理系を使っても無理ですねぇ。
0140デフォルトの名無しさん
2006/01/29(日) 11:55:410141デフォルトの名無しさん
2006/01/29(日) 11:56:52即席であなたのカスタマレビューをつけたまえ。
0142デフォルトの名無しさん
2006/01/29(日) 11:59:120143デフォルトの名無しさん
2006/01/29(日) 14:06:060144デフォルトの名無しさん
2006/01/29(日) 14:16:37アプリ制作において。
エディタとか2chブラウザとか、アクションゲームとか
ライブラリは貧弱なの?
0145デフォルトの名無しさん
2006/01/29(日) 14:35:490146デフォルトの名無しさん
2006/01/29(日) 17:57:49マジで!?OCamlでゲーム作ってる人いるの?
0147デフォルトの名無しさん
2006/01/29(日) 18:20:12ttp://freetennis.sf.net/
ttp://www.rashitoul.net/fr/htm/index.html
ttp://www.cs.ubc.ca/~rbridson/personal/spiff/
ttp://francois.pessaux.neuf.fr/creations.html
0148デフォルトの名無しさん
2006/01/29(日) 20:42:07即席レビュー
2冊とも良かったです。以上
0149デフォルトの名無しさん
2006/01/29(日) 21:20:320150デフォルトの名無しさん
2006/01/29(日) 21:21:321人中0人が参考になったと言っています。
0151デフォルトの名無しさん
2006/01/29(日) 21:26:10残念ながらない
0152デフォルトの名無しさん
2006/01/29(日) 22:14:180153デフォルトの名無しさん
2006/01/29(日) 22:35:250154デフォルトの名無しさん
2006/01/30(月) 01:28:490155デフォルトの名無しさん
2006/01/30(月) 09:08:300156デフォルトの名無しさん
2006/01/30(月) 09:34:42100% ではないと思うが Caml でゲームの開発をしている。
0157デフォルトの名無しさん
2006/01/30(月) 10:28:270158デフォルトの名無しさん
2006/01/30(月) 16:06:44骨組みを手っ取り早く作れるって言語じゃないの?
仕様的に、込み入った処理ができるとは思えない。
0159デフォルトの名無しさん
2006/01/30(月) 16:15:460160デフォルトの名無しさん
2006/01/30(月) 16:21:27「間違ったコードに対してエラーを出すコンパイラは糞だ」とおっしゃりたいのですね?
0161デフォルトの名無しさん
2006/01/30(月) 16:25:25込み入った処理ってどんなの?
0162デフォルトの名無しさん
2006/01/30(月) 17:16:46- val hd2 = fn x:int list => hd x;
val hd2 = fn : int list -> int
は問題なく動作も予想通りなのですが, 同じものを fun で定義しようとすると
- fun hd2 x:int list = hd x;
val hd2 = fn : int list list -> int list
list が一段深くなってしまいます.
型の指定を int とだけすると
- fun hd2 x:int = hd x;
val hd2 = fn : int list -> int
のようになります.
型全体を ( ) で囲んでも
- fun hd2 x:(int list) = hd x;
val hd2 = fn : int list list -> int list
結果は変わらず, 引数を含めて ( ) で囲むと
- fun hd2 (x:int list) = hd x;
val hd2 = fn : int list -> int list
ようやく期待通りの結果となります.
- fun hd2 x:int = hd x;
- fun hd2 x:int list = hd x;
はどのように解釈されているのでしょうか?
0163デフォルトの名無しさん
2006/01/30(月) 17:20:280164デフォルトの名無しさん
2006/01/30(月) 17:29:530165デフォルトの名無しさん
2006/01/30(月) 17:40:22厳密には間違っているけど、動作上意図に完璧に沿う時
Cはコンパイル通してくれるが、MLは駄目だ許さんのいってんばり。
学者のように融通がきかん。
0166デフォルトの名無しさん
2006/01/30(月) 17:43:360167デフォルトの名無しさん
2006/01/30(月) 17:43:430168デフォルトの名無しさん
2006/01/30(月) 17:46:56動作上意図に沿わない時にも通してくれちゃうのが問題。
あと、Cにも「直感的には大丈夫なのにだめだしされる場合」はあるよ。
同一メモリを互換性のない複数の型でアクセスするのはだめ、とかね。
0169デフォルトの名無しさん
2006/01/30(月) 21:50:26コンパイル時チェックで保証できたほうがいいし、
MLの言語設計の他の部分とも考え方が合わないかな?
0170デフォルトの名無しさん
2006/01/30(月) 21:59:030171デフォルトの名無しさん
2006/01/30(月) 22:14:56無駄な勉強やるくらいならHaskellやった方がましだろ。
0172デフォルトの名無しさん
2006/01/31(火) 01:07:40つーか、string が mutable なこと自体が間違い。
Xavier 自身も「OCaml を書き直すことがあったら immutable にするだろう」って言ってる。
>>171
そういうやつは Haskell も理解できないと思われ。
0173デフォルトの名無しさん
2006/02/01(水) 09:46:29option と Some の使い方がイマイチわかりませぬ
0174デフォルトの名無しさん
2006/02/01(水) 11:16:20値がない状態を None、値がある状態を Some value に統一しとくのさ。
値がない状態を意味するのに 0 とか -1 とか負の数とか "" とか null とか
Nothing とか DBNull とか色々あると面倒でしょ?
0175デフォルトの名無しさん
2006/02/01(水) 16:58:22let equal_one x = if x = 1 then (Some("ok")) else None;;
とか定義すると
val equal_one : int -> string option = <fun>
とかなって、上の option の意味するニュアンスは、
「値があるなら戻り値は string 型を内包する Some だお」
「値がないなら一律で None だお」
と言っているわけですね?
0176デフォルトの名無しさん
2006/02/01(水) 18:13:32その通りでつ。
option 型にすることで、意味のない値を返さなくてすむのさ。
関数が失敗したら null を返すとかではなくて、None を返せば、いみのない値を間違って
使ってしまう危険性もなくなるわけだな。option 型だと match させないと値を
とりだせないわけだから。
0177デフォルトの名無しさん
2006/02/01(水) 22:55:310178デフォルトの名無しさん
2006/02/01(水) 23:49:22よくないのは分ってるんだけどね。
0179デフォルトの名無しさん
2006/02/01(水) 23:57:56http://ocaml-lib.sourceforge.net/doc/Option.html
0180デフォルトの名無しさん
2006/02/01(水) 23:59:140181デフォルトの名無しさん
2006/02/02(木) 01:50:130182デフォルトの名無しさん
2006/02/02(木) 04:04:18それ俺も思った
まさに鬼
0183デフォルトの名無しさん
2006/02/02(木) 08:43:041 + "0"
もコンパイルエラーにしないほうがいい?
0184デフォルトの名無しさん
2006/02/02(木) 10:00:32例題がいまいちだなー。equal_one だと int -> bool と思えてしまう。
例えば、環境変数HOMEの内容を読み込むとしよう。
let get_home () =
try
Some (Sys.getenv "HOME")
with
Not_found -> None
環境変数は定義されているかどうか不明だから、値がない場合は None, それ
以外は Some になる訳だ。
0185175
2006/02/02(木) 11:28:41確かに漏れのは、よくなかったね
環境変数とかのサンプルの方が使いどころがわかっていい感じでつ
なんだかんだでサンプルコードを見るのが一番近道であると
0186デフォルトの名無しさん
2006/02/02(木) 11:42:44落ち着け。 1 + 0.1 は SML でもエラー。
もちろん 1.0 + 0.1 なら SML は OK。Caml は×。
はぁ。どこの大学の授業で O'Caml/SML 教えているか知らんけど、
(+) についてはもっときちんと解説するべきでは?
初学者が去っていく第一関門に成りかねないだけに TA には
是非頑張ってほしいと思います。
個人的には今の SML 方式が現実的かと思う。
これなら Caml で実装するのも簡単なんだけどな。改造するか。
0187デフォルトの名無しさん
2006/02/02(木) 11:50:330188デフォルトの名無しさん
2006/02/02(木) 11:57:45あ、ごめ。>>180に言ってるのだと勘違いした。
OCamlだけ叩いてると勘違いしたのが>>181か。
0189デフォルトの名無しさん
2006/02/02(木) 12:03:460190デフォルトの名無しさん
2006/02/02(木) 13:50:46本当にありがとうございました。
0191デフォルトの名無しさん
2006/02/02(木) 21:42:500192デフォルトの名無しさん
2006/02/03(金) 12:41:19ライセンス文読んだけどよくわからん。
基本LGPLだけど静的リンクでもライブラリに変更が無ければ縛られない?
0193デフォルトの名無しさん
2006/02/03(金) 14:22:03配布ライブラリに変更を加えていなければクローズドソース開発可能。
配布ライブラリを改造した場合でも基本的に同様だけど、
ライブラリの改造部分に関してだけは成果をコミュニティーに
バックしてね、ということ。
コンパイラ部分が QPL なのは Caml-Light 時代にパクリ事件があったため。
0194デフォルトの名無しさん
2006/02/05(日) 05:37:52いったん配列にして破壊的に編集するのがいいのかな。
0195デフォルトの名無しさん
2006/02/05(日) 17:39:450196デフォルトの名無しさん
2006/02/05(日) 20:04:320197デフォルトの名無しさん
2006/02/05(日) 20:45:360198デフォルトの名無しさん
2006/02/05(日) 20:58:0510年以上 Caml 使ってるけど、、、知らんかった。
どうするの?わくわく。
0200デフォルトの名無しさん
2006/02/06(月) 03:38:410201デフォルトの名無しさん
2006/02/06(月) 10:11:30Zipper で解決できそうだ。結構便利だぞ。
ただし、解こうとしている問題に対して、本当に「リストの一部を変えたリス
トを作ったり間に挿入したりする」操作がベターなアルゴリズムなのか、再考
してからね。
0202デフォルトの名無しさん
2006/02/06(月) 10:21:41とかやってもhoge.ml がコンパイルされない・・・なぜ?
エラーが出るとかそういうこともなく、ただコンパイル処理にならない。
これが動かないので ocamlfind 使ったMakefile が失敗します。。。
誰が、同じようなトラブルになった人いませんか?
ちなみに ocamlfind list は動作します。
0203202
2006/02/06(月) 10:47:15/usr/local/etc/findlib.conf
で、ocamlc="ocamlc.opt" → ocamlc = "ocamlc"
と変更したら上手くいった・・・なんで?
0204202
2006/02/06(月) 11:21:30ときたま、ocamlfind list としてもバージョンが変わってないときあるよね?
これってパッケージ作成者の作業抜け?
自分でsite-lib/packagename 内の META ファイル書き換えなきゃいけないの?
0205デフォルトの名無しさん
2006/02/06(月) 12:21:120206デフォルトの名無しさん
2006/02/06(月) 14:14:17作業抜けだろう。
0207デフォルトの名無しさん
2006/02/06(月) 15:06:43と、
O'Caml native な配列が拡張可能であるかどうか、
は全く違う。
ちなみに、 Obj.truncate を使えばブロックの短縮は出来る。
詳細は byterun/obj.c を参照。でも、実際に使われているのを
見たことは無い。Planar 専用機能という専らの噂。
0208デフォルトの名無しさん
2006/02/06(月) 18:50:26ocamlc.opt を作り忘れてた! なんて事はないですよね?
0209デフォルトの名無しさん
2006/02/07(火) 12:59:53誤字(誤植?)っぽいのが多くて何を信じたらいいか分かんないよ・・・(´・ω・`)
0210デフォルトの名無しさん
2006/02/07(火) 22:15:160211デフォルトの名無しさん
2006/02/07(火) 22:42:22F#でもパーサの問題で日本語は表示できんよ。
0212デフォルトの名無しさん
2006/02/08(水) 00:54:03コレって FastCGI 対応してるんだよね?
本家サイトの説明見る限りじゃかなり期待できそうなんだが
0213212
2006/02/09(木) 19:22:18ui のパーサが駄目駄目
凝ったページが書けねえ
や〜めた
0214デフォルトの名無しさん
2006/02/11(土) 19:53:230215デフォルトの名無しさん
2006/02/12(日) 11:16:480216デフォルトの名無しさん
2006/02/13(月) 16:03:41let a = `a;;
とかすると
val a : [> `a] = `a
とかなりますよね?
これってどういう意味なんですか?
0217デフォルトの名無しさん
2006/02/13(月) 16:09:55http://ocaml.jp/archive/document/intro4.html
0218デフォルトの名無しさん
2006/02/13(月) 16:49:35有難うございました!
0219デフォルトの名無しさん
2006/02/13(月) 22:49:18わかりません
open Camomile
let str = "あいうえお" (* UTF8 *)
let utext = UText.of_string str (* string -> utext *)
let utext_sub = UText.sub utext 0 1 (* utext_sub = "あ"? *)
ここで、utext_sub を string 型に変換したいんだけど・・・
わかる人いませんか?
0220219
2006/02/13(月) 23:54:44SubText モジュール使えばいいんだ。
module Sub = SubText.Make(UTF8)
let str = "あいうえお"
let s1 = Sub.refer str 0 1
let _ = print_string (Sub.excerpt s1)
とすると無事に "あ" が出力される
こんなんでいいのかな?
0221219
2006/02/14(火) 23:10:00自己解決かと思いきや、
let s1 = Sub.refer str 0 2
としても”あ”が出力されてしまふ
これってバグなんだろうか?
0222デフォルトの名無しさん
2006/02/15(水) 00:01:29let s1 = Sub.refer str 0 4
で”あい”となる見たい
スレ汚しすまんです・・・
0223デフォルトの名無しさん
2006/02/16(木) 13:17:44発生してしまう。
Event モジュールとシグナルって一緒に使うとまずいんですかね?
open Event
let mput ch =
while true do
sync (send ch 1);
Thread.delay 0.1
done
let mget ch =
while true do
sync (receive ch);
Thread.delay 0.1
done
let interrupt n =
Printf.printf "i am %d\n" (Thread.id (Thread.self ()));
flush stdout
let _ =
let _ = Sys.set_signal Sys.sighup (Sys.Signal_handle interrupt) in
let ch = new_channel () in
(* Fire up the compute thread: *)
let t1 = Thread.create mput ch in
let t2 = Thread.create mget ch in
while true do
Thread.delay 1.0
done
0224デフォルトの名無しさん
2006/02/16(木) 19:41:54おんなじことやってみたけど、問題なかったよ
sig_test.ml とかを
ocamlc -thread unix.cma threads.cma -o test sig_test.ml
とかコンパイルしてみた。環境は Ocaml 3.09
0225224
2006/02/16(木) 20:08:35threads の方をリンクしたら
Unix.Unix_error(11, "select", "")
とかなったなあ
0226デフォルトの名無しさん
2006/02/17(金) 01:00:17上のコードの Thread.delay を外したら例外が出なくなったので delay のせ
いかと思いきや、下のコードでも -HUP で例外発生。むー。デーモン君を作り
たかっただけなんだけど、素直に equeue ライブラリ使えってことか?
open Event
let (@@) f x = f x
let wait_accept () =
let socket = Unix.socket Unix.PF_INET Unix.SOCK_STREAM 0 in
let _ =
Unix.bind socket @@ Unix.ADDR_INET (Unix.inet_addr_any, 1025);
Unix.listen socket 10
in
let make_accept socket =
let ac_channel = new_channel () in
let accept_send () = sync @@ send ac_channel @@ Unix.accept socket in
let _ = Thread.create accept_send () in
receive ac_channel
in
sync (make_accept socket)
let interrupt n =
Printf.printf "i am %d\n" (Thread.id (Thread.self ()));
flush stdout
let _ =
let _ = Sys.set_signal Sys.sighup (Sys.Signal_handle interrupt) in
wait_accept ()
0227デフォルトの名無しさん
2006/02/17(金) 01:46:32socket を nonblock にして返事が戻ってくるまでループさせるようにしたら、
無事シグナルが使えた。
let rec loop () =
try
Unix.accept socket
with
_ -> loop ()
in
sync @@ send ac_channel @@ loop ()
ちょと調べてみると、otherlib/unix/accept.c を見る限りでは、
enter_blocking_section();
retcode = accept(Int_val(sock), &addr.s_gen, &addr_len);
leave_blocking_section();
なので、本来は accept 中はブロックされるみたい。シグナルで無理に起こし
ちゃまずいのかも。
# Cコード呼び出しは全部該当する気がしてきた...--;
0228デフォルトの名無しさん
2006/02/17(金) 14:31:27コレ、いいね。
漏れも使おう
0229デフォルトの名無しさん
2006/02/18(土) 21:37:18わざわざInt32を使うのもなんか納得いかない。
0230デフォルトの名無しさん
2006/02/18(土) 21:47:560231デフォルトの名無しさん
2006/02/18(土) 21:58:270232デフォルトの名無しさん
2006/02/18(土) 22:00:15char 使いなよ。
0233デフォルトの名無しさん
2006/02/18(土) 23:22:270234デフォルトの名無しさん
2006/02/19(日) 02:16:130235デフォルトの名無しさん
2006/02/19(日) 02:34:53Cスレッドで聞くと、普通に教えてくれる
JAVAスレッドで聞いても結局は教えてくれる。
でMLすれっどできくとこれかよw
そんなんじゃ、MLユーザー増えないよ。
0236デフォルトの名無しさん
2006/02/19(日) 07:44:310237デフォルトの名無しさん
2006/02/19(日) 08:36:57char でよいとおも
0238デフォルトの名無しさん
2006/02/19(日) 09:03:130239デフォルトの名無しさん
2006/02/19(日) 09:43:280240デフォルトの名無しさん
2006/02/19(日) 13:25:03>>237
バイナリファイル上で32ビット整数があってOcamlでInt32で表現して計算をしたい場合
*put_binary_intは使えないから*put_byteを4回繰り返してビット演算でInt32に対応させるしかないじゃない。
なんでこんなことしなきゃならんのと思わないかい。
0241デフォルトの名無しさん
2006/02/19(日) 14:57:02MLを使うのが間違い
0242デフォルトの名無しさん
2006/02/19(日) 15:11:46バイト単位の読み込みで良いじゃんよ。
0243デフォルトの名無しさん
2006/02/19(日) 16:13:47let regexp_str = "\[aaa\]"
とかすると、コンパイル時に
Warning : illegal backslash escape in string.
とか出てしまう。
プログラム本体はこれで上手く動いてるからいいっちゃいいんだけど。
この辺の警告はしょうがないんだろうか。
0244デフォルトの名無しさん
2006/02/19(日) 17:04:08\が正規表現上のエスケープではなく文字列リテラル表現上の
エスケープと解釈されてるのではないか。
\[aaa\] という正規表現ならば"\\[aaa\\]"と書くべし。
0245デフォルトの名無しさん
2006/02/19(日) 18:17:56あわわ
本当だ、ボケまくりでした
�dクスです
0246デフォルトの名無しさん
2006/02/19(日) 18:42:010247デフォルトの名無しさん
2006/02/19(日) 18:46:29天下のMicrosoftが関わるとこんなすごい物が出来上がるんだな。
研究者がコソコソオナニー開発したところでこのレベルには一生たどり着けないだろwww
0248デフォルトの名無しさん
2006/02/19(日) 19:09:54再び同じ台詞を言うことを期待。
0249デフォルトの名無しさん
2006/02/19(日) 19:11:21痛々しいなあ。w
0250デフォルトの名無しさん
2006/02/19(日) 19:11:400251デフォルトの名無しさん
2006/02/20(月) 09:44:23また事故れす。
Unix.set_signal じゃなくて Thread.wait_signal が正解でした。
お騒がせしました。
0252デフォルトの名無しさん
2006/02/20(月) 14:21:50OCaml でマルチスレッドなプログラムを作る場合、二通りのスタイルがある。
1) Thread,Mutex,Conditionモジュールを駆使して、従来の pthread ライブラ
リを叩くような感覚で事を進めるスタイル。pthread を使った事がある人
やマルチスレッドプログラミングをかじった事がある人は難なく使える。
ディープな人には物足りない。
2) Thread,Eventモジュールを駆使してお気楽にマルチスレッドを扱える、
concurrent プログラミングと呼ばれるスタイル。concurrent プログラミ
ングに初挑戦の場合、最初は意味が分からない。でも、分かってくれば便
利。基本的に一対多の同期はできないので、やっぱりディープな人には物
足りない。
どちらかというと、2)をお薦め。せっかくOCamlでやるのだから。
0253デフォルトの名無しさん
2006/02/20(月) 14:32:48するプログラムを作ってみよう。
open Event
let compute_mul ch = sync (send ch (7 * 8))
let compute_add ch = sync (send ch (7 + 8))
let _ =
let mul_ch = new_channel () in
let add_ch = new_channel () in
ignore (Thread.create compute_mul mul_ch);
ignore (Thread.create compute_add add_ch);
Printf.printf "mul %d\n" (sync (receive mul_ch));
Printf.printf "add %d\n" (sync (receive add_ch))
これを th.ml として保存しコンパイル。
$ocamlc -thread -o test unix.cma threads.cma th.ml
$./test
mul 56
add 15
となるはず。これができれば第一歩ですな。
0254デフォルトの名無しさん
2006/02/20(月) 14:42:30を返すというスタイルが基本。
open Event
let compute_mul () =
let ch = new_channel () in
ignore (Thread.create (fun () -> sync (send ch (7 * 8))) ());
ch
let compute_add () =
let ch = new_channel () in
ignore (Thread.create (fun () -> sync (send ch (7 + 8))) ());
ch
let _ =
let mul_ch = compute_mul () in
let add_ch = compute_add () in
Printf.printf "mul %d\n" (sync (receive mul_ch));
Printf.printf "add %d\n" (sync (receive add_ch))
0255デフォルトの名無しさん
2006/02/20(月) 15:05:23横槍ですまんですが、「一対多の同期はできない」とはどういう意味?
Mutex だと、スレッドが一つのリソースをロックしている間に
その他のスレッド全部をブロックできるけど、concurrent を使うと
それができないってこと?
0256デフォルトの名無しさん
2006/02/20(月) 15:39:010257デフォルトの名無しさん
2006/02/20(月) 16:08:47send, receive, sync という操作はチャネルを通じて、そのチャネルの両端に
いるスレッド同士の一対一の同期を実現しています。
一方で、一対多の同期(例えば receive 一発で複数の計算の終了を待つ)は
Event モジュールでは扱えません、という意味です。
# もしかして間違ってる? 識者の方コメントよろしく。
もちろん複数の計算結果を取りまとめるスレッドを作って、そのスレッド経由
で同期を図れば、一対多の同期もすぐにできます。あくまで Event モジュー
ルの話なので。
0258デフォルトの名無しさん
2006/02/20(月) 16:15:24pthread で スレッドハンドルを配列でまとめて join するようなのと
同じ様な操作は Event.sync では実現できない、という
ようなことでしょうか?
0259デフォルトの名無しさん
2006/02/20(月) 16:51:08exactly. ちなみに、共有リソースはこんな感じで。
open Event
type 'a mvar = { takeCh : 'a channel; putCh : 'a channel; ackCh : bool channel }
exception Put
let mVar () =
let takeCh = new_channel () and putCh = new_channel () and ackCh = new_channel () in
let rec empty () =
let x = sync (receive putCh) in
sync (send ackCh true);
full x
and full x =
select [
wrap (send takeCh x) empty;
wrap (receive putCh) (fun _ -> sync (send ackCh false); full x)
]
in
ignore(Thread.create empty ());
{ takeCh = takeCh; putCh = putCh; ackCh = ackCh }
let take { takeCh = takeCh } = receive takeCh
let put { putCh = putCh; ackCh = ackCh } x =
sync (send putCh x);
if sync (receive ackCh) then ()
else raise Put
0260デフォルトの名無しさん
2006/02/20(月) 18:22:090261デフォルトの名無しさん
2006/02/22(水) 07:41:420262デフォルトの名無しさん
2006/02/26(日) 00:25:26ムズカシス (´・ω・`)
0263233
2006/02/26(日) 00:26:440264デフォルトの名無しさん
2006/02/26(日) 10:46:21けど、それ以外はそうでもないと思うに一票
0265sage
2006/02/27(月) 02:10:33じゃー、マルチスレッド状態で、複数のスレッドから読み書きできてかつ安全な変数"cell"を定義してみよう。
open Event
type 'a cell = { getCh : 'a channel; putCh : 'a channel }
let get { getCh = getCh } = sync (receive getCh)
let put { putCh = putCh } x = sync (send putCh x)
let cell x =
let getCh = new_channel () in
let putCh = new_channel () in
let rec loop x = select [
wrap (send getCh x) (fun () -> loop x);
wrap (receive putCh) loop
]
in
ignore (Thread.create loop x);
{ getCh = getCh; putCh = putCh }
let _ =
let c = cell 10 in
put c 20;
Printf.printf "v=%d\n" (get c)
0266デフォルトの名無しさん
2006/02/28(火) 12:12:22う〜む、select は、リストされたイベントがそれぞれアトミックに
処理されるための処理ですよね?だけど、そこから先がよくわからない
特に以下の部分
let rec loop x = select [
wrap (send getCh x) (fun () -> loop x);
wrap (receive putCh) loop
]
が難しい
event.mli で、wrap はヘッダの説明だと
val wrap : 'a event -> ('a -> 'b) -> 'b event
(** [wrap ev fn] returns the event that performs the same communications
as [ev], then applies the post-processing function [fn]
on the return value. *)
とあるけど、 例えば、 wrap a fn とあった場合は
a というイベントが起きたとき、処理された結果に対して fn を適用する?
みたいな意味なんでしょうか?英語が上手く理解できないかも
select [wrap....] の部分は具体的にはどういうことをしているのでしょうか?
0267デフォルトの名無しさん
2006/03/01(水) 12:12:12select の部分は、[...] のリストの中に有るイベントの内、最初に発生した
イベントを選んで実行せよ、という意味。アトミックという言葉が適切かどう
か判りませんが、他のイベントは破棄されるという意味で排他的です。
send getCh ... は、getCh というチャネルに x を送信するイベントですが、
受け取る相手が確定するまで待つイベント。
wrap (send getCh...) (fun () ...) は、(send getCh...) イベントが発生し
たらその後に、(fun () -> ...) を実行せよというイベント。
receive putCh は、putCh というチャネルからデータを得るイベント。もちろ
ん putCh にデータが流れてくるまで待ちます。
wrap (receive putCh) loop は、(receive ..) イベントが発生したらその後
に、受け取ったデータを loop に渡して loop を実行せよというイベント。受
け取ったデータはループを回りながら保持されているので、破壊的代入は一切
行われません。
ちなみに、イベントが発生した後に特定の関数を呼び出すのが、wrap。イベン
トが発生する前に特定の関数を呼び出すのが guard です。
0268デフォルトの名無しさん
2006/03/01(水) 18:48:08う〜ん・・・
wrap,sellect に関する意味合いは何となくわかりましたが・・・
以下の点がまだよくわからないです
cell を利用する外部のスレッドは、
getCh から受信して、
putCh に送信しますよね?
でも、cell が起動したスレッドでは
getCh に対する「送信」イベントをフックして (fun () -> loop x)
putCh に対する「受信」イベントをフックして loop
送信と受信がcell の内部と外部(この言い方でいいのかわからないですが)
で逆ですよね?これがよくわからないです。
例えば、外部のスレッドが cell から受信するとき、
(すなわち getCh から受信しようとするとき)、
cell 内部ではgetCh に対する送信イベントが起こる?のでしょうか?
また、cell に送信するとき、
(すなわち putCh へそうしんしようとするとき)、
cell 内部では putCh に対する受信イベントが起こる?のでしょうか?
2つのスレッドが相互にチャンネルに対して送受信の要求をしたとき、
もし片方のスレッドが受信を試みたら、もう片方のスレッドがそのチャネルに
対して送信するようなイベントが発生する?のでしょうか?
そういうものなのでしょうか?
0269268
2006/03/01(水) 18:56:34片方のスレッドが受信しようとすると
もう片方のスレッドでは送信イベントが起こるってことか
ひょっとして考えて見リャ当たり前なのかな?
0270デフォルトの名無しさん
2006/03/01(水) 22:10:01そうです、チャネルの片方で送信すれば、もう片方では受信しなければいけま
せん。
これは、ネットワーク越しの通信でも、サーバがデータを送信すれば、クライ
アントはデータを受信しなくてはいけないのと全く同じです。
0271デフォルトの名無しさん
2006/03/01(水) 23:41:00よっしゃ!ようやく理解した!
師匠、ありがとうございますた!
0272デフォルトの名無しさん
2006/03/02(木) 17:25:29では、早速ですが、応用課題ですw 興味のある方はどんどん答えてください。
Q. cell は複数のスレッドから読み書きできる変数として使用できるものでし
た。では cell を改造して、「一度誰かが書き込んだら、二度と書き込めず、
読み込みだけは何度でも出来る変数」を作ってください。
0273デフォルトの名無しさん
2006/03/02(木) 19:28:33P2(x) := read(x).P2(x)
P := ΣP1(x)
0274271
2006/03/02(木) 20:07:55let getCh = new_channel () in
let putCh = new_channel () in
let rec loop_ex fix x =
select [
wrap (send getCh fix) (fun () -> loop_ex fix x);
wrap (receive putCh) (loop_ex fix)
] in
let rec loop x =
select [
wrap (send getCh x) (fun () -> loop x);
wrap (receive putCh) (fun fix-> loop_ex fix fix)
] in
ignore (Thread.create loop x);
{ getCh = getCh; putCh = putCh }
let _ =
let c = cell 10 in
Printf.printf "v=%d\n" (get c) ;
put c 20;
Printf.printf "v=%d\n" (get c) ;
put c 10;
Printf.printf "v=%d\n" (get c) ;
一応、結果は10,20,20と出る
>>273
よくわからないけれど正解なんだろうね・・・
数学ワカンネ
0275デフォルトの名無しさん
2006/03/02(木) 21:49:40MLの並行processもこんな風に簡潔に書ければいいね。
0277デフォルトの名無しさん
2006/03/02(木) 22:52:390278デフォルトの名無しさん
2006/03/03(金) 10:25:29すばらしい。これも一つの答です。
ただ、put が常に成功するので、本当に書き込めたのかどうか判りづらいのが
難点ですね。2回目以降 put しようとすると例外が発生するなどすると、より
使い易いでしょう。
0279デフォルトの名無しさん
2006/03/03(金) 10:26:530280デフォルトの名無しさん
2006/03/05(日) 00:14:39MLor関数型を否定してきても、相手するのは一番後回しでいいんじゃね?
0281デフォルトの名無しさん
2006/03/05(日) 01:27:14・最初に書き込まれるまでは receive しかしない
・書き込まれたら send できるようになる
っていう方式ということ?
259 はさらに、いったん書き込まれたあとでもまた上書きできるようになって
いますね。
0282デフォルトの名無しさん
2006/03/05(日) 01:31:37それがあなた、スレが停滞したときに限って現れるので、
思わず相手をしてしまうのですよ。
0283デフォルトの名無しさん
2006/03/05(日) 03:51:29278です。おっしゃる通り。empty状態とput時の例外を採用すると殆どmVarになります。
mVarを一気に理解するのは難しいので、cell -> 272 -> mVar と発展させる予定でした。
0284274
2006/03/05(日) 10:44:09mVar は、利用者が mVar へ書き込んだ後 full 状態に遷移して
利用者が読み込む前に書き込もうとすると Ack false で例外が出るけど
仮に利用者が読み込まないと full 状態にとどまり続けますよね?
つまり、put mVar したあと、誰も take mVar しないと、永遠に put mVar が
失敗しますよね? 例えば、shareVar を mVar として、
let old = take shareVar in
let _ = put shareVar (old + 100) in
let new = take shareVar
見たいな処理は、無数のスレッドから呼ばれても整合性を保つけれど
let old = take shareVar in
let _ = put shareVar (old + 100)
だと、shareVar はずっと full で書き込み禁止になってしまいませんか?
あるいは、共有リソースは、更新したらその更新した値を参照するのが当たり前と
言うことなのでしょうか?う〜ん、こんがらがってきた・・・
0285デフォルトの名無しさん
2006/03/06(月) 10:50:59>失敗しますよね? 例えば、shareVar を mVar として、
それはその通りです。
おそらく、疑問の出発点は、mVarって何が嬉しいねん? という事でしょう。
mVar は「値を参照・それを元に新しい値の生成・それを書き込む」という一
連の手順を保証するのに適しています。あるスレッドが変数 m に対して
sync $$ mVar.put m $$ calc_new_value $$ sync $$ mVar.take m
したとします。仮に他のスレッドがこの処理の途中で同じような処理をしよう
としても、値が無いので、新しい値が書き込まれるまで待たされます。つまり、
「値を参照・それを元に新しい値の生成・それを書き込む」という一連の手順
は、必ず順番に行われるよう保証されます。
要は mVar は参照したら必ず更新する変数を意図しているのです。ちなみに、
272で示した「一度書き込んだら参照だけ何度も可能で、二度と書き込めない」
変数は iVar と呼ばれ、データの受渡しやStreamの実装など、幅広く使える変
数です。
0286デフォルトの名無しさん
2006/03/06(月) 11:20:08sync $$ mVar.put m $$ calc_new_value $$ sync $$ mVar.take m
じゃなくて、
mVar.put m @@ calc_new_value @@ sync @@ mVar.take m
でした。ちなみに、@@ は、let (@@) f x = f x です。
0287デフォルトの名無しさん
2006/03/06(月) 11:28:55えてください ToT
0288デフォルトの名無しさん
2006/03/06(月) 18:01:150289デフォルトの名無しさん
2006/03/06(月) 20:55:40なるほど、一連の手順がスレッドセーフになることを保証する
変数を抽象化しているわけですね
ところで、mVar、iVar の それぞれ i、m って何の略なんでしょうか?
0290デフォルトの名無しさん
2006/03/06(月) 21:13:030291デフォルトの名無しさん
2006/03/06(月) 21:22:05あ、なるほど、THXです
0292デフォルトの名無しさん
2006/03/13(月) 22:21:09O'Camlで互いに呼び出し合っている様な大域で束縛された2つの関数を作りたい場合、
let rec f1 x =
if (x <= 1) then 1
else x * f2 (x-1)
let rec f2 x =
if (x <= 1) then 1
else x * f1 (x-1)
みたいに書くと「束縛されてない"f2"」を呼び出そうとしているので怒られます。
でどうしようかと悩んだのですが、
let rec f0 f1 x =
if (x <= 1) then 1
else x * f1 (x-1)
let rec f1 x =
if (x <= 1) then 1
else x * f0 f1 (x-1)
let f2 = f0 f1
みたいな書き方しか思い付きませんでした ('A`)
普通はどう書くものなのでしょうか?
0293デフォルトの名無しさん
2006/03/13(月) 22:58:23if (x <= 1) then 1
else x * f2 (x-1)
and f2 x =
if (x <= 1) then 1
else x * f1 (x-1)
0294デフォルトの名無しさん
2006/03/13(月) 23:41:09"and"の意味を思いっきり誤解しておりますた ('A`)
てっきり「同時に束縛される=束縛の式記述内でもう一方の束縛は使えない」と思っておりますた
「評価」されなければいい、ということでしょうか?
もう一つ似たような問題に悩んでいまして、互いに参照(?)しあう型定義をしたい時
type type_a = int * type_b
type type_b = int * type_a
とか出来ないので、
type 'a type_ = int * 'a
type type_a = int * type_a type_
type type_b = int * type_a
とか考えたのですが、これももっと良い書き方があるのでしょうか?
0295デフォルトの名無しさん
2006/03/14(火) 00:26:41type type_a = ACons of int * type_b
and type_b =BCons of int * type_a ;;
ていうかこの型、終端がないじゃないか! 無限リスト?
0296デフォルトの名無しさん
2006/03/14(火) 01:13:54やっぱり綺麗な書き方があるんですね orz
バリアント型をちゃんと理解できてないようなのでもう少し勉強しまつ
ちなみに上のコードは問題箇所だけに単純化して書いたので、
実際に考えていたコードは片方をバリアント型として定義して
終端させる所で終端データを束縛させています
厨な質問に相手をして戴き、ありがとうございました。
おかげでとても勉強になりました m( _ _ )m
0297デフォルトの名無しさん
2006/03/14(火) 12:13:53-rectypes オプションつけるという逃げ方もあるよん
0298デフォルトの名無しさん
2006/03/14(火) 20:37:110299デフォルトの名無しさん
2006/03/15(水) 00:42:170300デフォルトの名無しさん
2006/03/16(木) 10:16:47意味論とか詳しいことは判りませんが、let name p = p#name みたいな事がで
きるという意味では、正に多相レコードと同じですねー。
# ad-hoc とか subtype とかと言えばいいのでしょうか?
# あと、両方 parametric pol. 出来ますねー。
object で言うところの val と method の違いは mutable かどうかに対応す
るのでしょうか?
あと、object では initializer とか inherit とか便利な構文がありますが、
これは多相レコードには無さそう...?
0301デフォルトの名無しさん
2006/03/16(木) 19:38:42か?
ねー。
か?
う...?
0302デフォルトの名無しさん
2006/03/17(金) 04:17:090303デフォルトの名無しさん
2006/03/17(金) 10:30:10OCamlとSML、どちらの方が人気があるんでしょうか?
また、よりいろんなことができるのはどちらになるんでしょうか?
このスレではほぼOCamlの話題で埋まってるみたいですけど…
0304デフォルトの名無しさん
2006/03/17(金) 11:44:09type atype = { name : string; desc : string }
type btype = { name : string; point : int }
とか宣言して、
let get_name (x : atype) = x.name
とかすると、
This expression has type atype but is here used with type btype
とかでてしまい、atype として使えないのですが、これを
回避する方法ってないのでしょうか?
0305304
2006/03/17(金) 13:34:300306デフォルトの名無しさん
2006/03/17(金) 14:18:09ているのが原因。そういう宣言のときには atype の name にさわることはで
きない。
実際の利用局面にもよるがバリアントはレコードと違う(双対の関係にある)の
でたぶん関係ない。
多相的なレコードを OCaml でやろうと思ったら、とりあえずオブジェクトを
使えということです。
class atype (n:string) (d:string) = object
method name = n
method desc = d
end
class btype (n:string) (p:int) = object
method name = n
method point = p
end
let get_name (x : atype) = x#name
0307デフォルトの名無しさん
2006/03/17(金) 14:19:57let get_name x = x#name
とすると、 get_name の型は < name : 'a; .. > -> 'a になる。つまり name
というメソッドのあるオブジェクトならオーケーなので、 atype でも btype
でも get_name に適用できる。
0308304
2006/03/17(金) 20:05:21ありがとうございますた。
0309デフォルトの名無しさん
2006/03/17(金) 20:18:30let x = object method name = "taro" end;;
で直接オブジェクトが作れたりする。。
けど、これ camlp4r の改訂版構文(?)だと使えないんだよな。
ガリグさんの polymap みたいに
let x = `{ name = "taro" };;
で上の宣言に変換されるようなマクロを書こうと思ったんだが…。
なんか解決策あったら教えてくれ。
0310デフォルトの名無しさん
2006/03/17(金) 22:48:42今時SML/NJの110.07なんて公式サイトをだいぶ探さないと
見つからないから難儀したぜ。
0311http://www.vector.co.jp/soft/win95/util/se072729.html
2006/03/18(土) 19:17:48もしくは64bitにネイティブ対応したテキスト置換ソフトありますか?
0312デフォルトの名無しさん
2006/03/20(月) 23:20:49SML# を体験してみた感想はいかが?
レコード多相やランク1多相もいいけど、Cとの連携がいけてるらしいけど、ど
んなもんかな。
IEEE 854(マージされた754でもいいけど)とかに対応してると、とっても実用
的って感じ。
0313デフォルトの名無しさん
2006/03/23(木) 00:44:38型の観点からは多相レコードと一緒。
大堀先生の多相レコードとまったく同じだと思えばいい。
>>300
細かいことだけど、多相レコードの型つけはsubtypingとは違う。
< name : 'a; .. > -> 'a
は、
∀ρ . < name : 'a; ρ > -> 'a
で、ρが適当に代入される。
多分、意味的にはParametric Polymorphismと一緒。
>>304
オブジェクト使うのも手だけど、OCamlの標準ライブラリを見た感じだと、
レコードのラベルには型名のprefixをつけてるみたいだね。
0314デフォルトの名無しさん
2006/03/23(木) 13:31:04オキャメル?ハスケル?
0315デフォルトの名無しさん
2006/03/23(木) 13:37:480316デフォルトの名無しさん
2006/03/29(水) 02:33:44Visual Studioのインテリセンスのように、
コード補完や、型名の表示をしてくれるエディタが
激しく欲しいと思うのですが、みなさんはどうでしょうか。
0317デフォルトの名無しさん
2006/03/29(水) 02:42:24何故自分で創らない!?
0318デフォルトの名無しさん
2006/03/29(水) 04:52:58つ F#
0319デフォルトの名無しさん
2006/03/29(水) 06:19:480320sage
2006/03/29(水) 10:36:37.NETのメソッドやなんかはカリー化できない。
結局、やっぱり.NETではC#を使おうと思った。
0321デフォルトの名無しさん
2006/03/29(水) 13:33:03ガーン
0322sage
2006/03/30(木) 02:01:03どなたか教えてくださいまし
0323デフォルトの名無しさん
2006/03/32(土) 00:04:35今までエムエルトンって言ってたぜぃ。
0324デフォルトの名無しさん
2006/03/32(土) 00:27:59まりがとん
0325デフォルトの名無しさん
2006/03/32(土) 12:50:430326デフォルトの名無しさん
2006/04/02(日) 12:17:02とりあえずおれに
1.ランク1多層性
2.多層型レコード演算
について、従来のMLとの違いがわかるようにおしえてくれ。
ちなみにSMLってオブジェクトはつかえるの?
0327デフォルトの名無しさん
2006/04/02(日) 12:31:220328ad
2006/04/02(日) 12:42:32~~~~~~~~~~~~~~~~~~~~~~~~~~~~
あなたの今後のネット収益を倍増するスキルがあります。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
それを知りたい方は、他にいませんか?
アフィリエイトを使わずにホームページとEメールだけで3,000万以上稼いだ
インターネット・マーケッターの宮川さんが、
巨大な現金の山を作り出す門外不出の一生涯使えるノウハウを
下記のサイトで公開しています。
その内容をお知りになりたい方は、下記をクリックしてください。
【たったの24時間で あなたの今後のネット収益を倍増するスキルとは? 】
http://infostore.jp/dp.do?af=moneyclick&ip=successpreneur&pd=01
0329デフォルトの名無しさん
2006/04/02(日) 18:04:06従来のMLの多相は、多相の限量子が型式の一番外側にしか来られないが、
これを直和型(バリアント)、直積型(ペア、レコード)、関数型の値域(矢印の右側)に
一段分だけ入れ子になって表れてもいい体系がランク1多相。
ところで、MLには参照型があり、こいつを多相型と一緒にすると色々具合が悪い。
例)
val x = ref (fn x => x); (* 'a -> 'a 型な関数への参照x *)
x := (fn x => x + 1); (* int -> int 型の関数をxに代入 *)
(!x) "string"; (* 型エラー *)
こうならないように、MLでは多相型になれる式を、定数・変数・関数式(fn x => ...)、および
これらをペアやデータコンストラクタで組み合わせた式に制限している。
しかし、この制限によって、明らかに多相型を与えても問題無いような式も制限されて
しまうことがある。
例)
fun f x y = (x, ref y); (* 'a -> 'b -> 'a * 'b ref *)
f 1; (* 'b -> int * 'b ref になりそうな気がするが (f 1) には多相型がつけられない *)
ランク1多相ならば、 f に∀'a.'a -> (∀'b.'b -> 'a * 'b ref)、(f 1) に∀'a .'a -> int * 'a ref
みたいな型をつけることができ、この制限を大幅に緩和することができる。
0330デフォルトの名無しさん
2006/04/02(日) 18:28:31普通のMLのレコードは、#name などとすると、レコードからnameフィールドの値が取り出せるわけだが、
このレコードの型はコンパイル時に完全に決まっていなくてはならず、nameフィールドを持つレコード型なら
何でもOKというものではない。
多相レコードでは、例えば fun name x = #name x みたいな関数を定義すると、{ name=3, ... } だろうが
{ ... , name=1.5, ... } だろうが { ..., name="hoge" } だろうが、nameフィールドを持つレコード型全てに使える。
しかも、レコードの何番目のフィールドを取り出せばよいかは、コンパイル時における型の単一化プロセスで
静的に決定するので、実行時にサーチするオーバーヘッドもない。
0331デフォルトの名無しさん
2006/04/02(日) 20:15:480332デフォルトの名無しさん
2006/04/03(月) 06:51:58じゃ、
∀'a.'a -> (∀'b.'b -> ∀'c.'a * 'b ref * 'c) みたいなのはランク1じゃなくなるってこと?
0333デフォルトの名無しさん
2006/04/03(月) 07:36:06Haskell
0334デフォルトの名無しさん
2006/04/03(月) 07:49:51総括する言語として作られた、という意味に置いては。
0335デフォルトの名無しさん
2006/04/07(金) 21:21:56を実装するとして、みなさんはどうやって実装しますか?
fold_left_count (fun a b->a+b) 0 [1;2;3;4] 3
としたら3回だけ畳み込んで、1+2+3を計算してくれる、みたいな
そもそもそんな関数作らずに〜しろ、とかそういうのでもいいです
0336デフォルトの名無しさん
2006/04/07(金) 23:38:54fold_left_count f a xs n = foldl f a (take n xs)
0337デフォルトの名無しさん
2006/04/08(土) 00:04:35ExtLib 入れないとない気がする。
自分で定義してもさほど面倒ではないが……。
あと (fun a b -> a + b) は (+) と書く方が普通じゃないかな。
0338デフォルトの名無しさん
2006/04/09(日) 08:52:10take っていうのは、呼ばれた回数をどこかで管理しなくちゃいけないよね
なんか、裏で副作用を伴うカウンタを持たせてるって事?
0339デフォルトの名無しさん
2006/04/09(日) 10:13:29let rec take n xs = match n, xs with
| 0, _ | _, [] -> []
| n, _ when n < 0 -> []
| n, x::xs -> x :: take (n-1) xs
とかいう風にやるのが普通だと思う。
0340デフォルトの名無しさん
2006/04/09(日) 10:19:02やばい、俺頭固いわ
ありがとう >>339
0341デフォルトの名無しさん
2006/04/09(日) 15:35:32外部関数よんで実現しているが。
0342デフォルトの名無しさん
2006/04/09(日) 17:04:48lazy listとの直観的な対応として>>339みたいにやるのが一番おさまりがいいのだ。
ExtLibのtakeは頭から取っていった要素を中間リストに破壊的appendすることによって
末尾再帰にしている。
Schemeのset-cdr!みたいなのを外部関数使わなきゃ実現できないってのがかっこわるいが。
0343デフォルトの名無しさん
2006/04/09(日) 18:53:260344デフォルトの名無しさん
2006/04/09(日) 19:16:340345デフォルトの名無しさん
2006/04/09(日) 19:33:35いわゆるStream というものと同じですね
0346デフォルトの名無しさん
2006/04/10(月) 05:18:29ファーストクラスの継続があるとまずいよ。
0347デフォルトの名無しさん
2006/04/10(月) 09:53:17よく分からんけど、マルチスレッドでも問題になる?
0348デフォルトの名無しさん
2006/04/10(月) 17:18:34いや、一回しか再開しないなら問題ない。複数回再開する場合
前回の実行でローカルな状態に加えた変更が影響することがある。
0349デフォルトの名無しさん
2006/04/15(土) 17:22:06では、
(fun x->x)
はなんて書いたらいい?
0350デフォルトの名無しさん
2006/04/15(土) 22:36:42そのままじゃ
0351349
2006/04/15(土) 23:23:16自分でも何でこんな質問したのか思い出せないw
なにを疑問に思ったのだろう?
0352デフォルトの名無しさん
2006/04/16(日) 13:25:530353デフォルトの名無しさん
2006/04/16(日) 17:48:26何回もコピペされてはるけど、closer じゃなくて closure じゃないの。
0354デフォルトの名無しさん
2006/04/20(木) 22:01:49# let (@@) f x = f x;;
val ( @@ ) : ('a -> 'b) -> 'a -> 'b = <fun>
# List.iter @@ (fun _ -> ()) @@ [];;
This expression has type unit but is here used with type 'a -> unit
とうように
(List.iter @@ (fun _ -> ()) @@ []
でなくて、
List.iter @@ ( (fun _ -> ()) @@ [])
となってしまうのはどうして?
0355デフォルトの名無しさん
2006/04/21(金) 00:10:29どこのどのマニュアルの話?
http://caml.inria.fr/pub/docs/manual-ocaml/manual015.html
の表を見ればわかるが、中置記号は先頭あたりの記号の種類で結合方向が決ま
る。 @ から始まる記号は右結合。
0356デフォルトの名無しさん
2006/04/21(金) 00:58:13orz そのとおりでした。
0357デフォルトの名無しさん
2006/04/22(土) 08:38:56そこで、OCamlとHaskellとを比較したページとかはありませんか。
自分で調べた限りではこんな感じでした。
OCaml - 非純粋関数型、遅延評価なし、
Haskell - 純粋関数型、遅延評価あり、モナド?
どなたか、より詳しい比較(使い勝手とか速度とかメモリ使用量とかライブラリとか)をしてないでしょうか。
0358デフォルトの名無しさん
2006/04/22(土) 08:52:52それ、自分も知りたい。
Haskellは純粋関数型だから副作用のある関数が作れないんじゃない?
だとしたらけっこう実用になるプログラムを書くのが難しそう。
どうなの?そこんとこ。
0359デフォルトの名無しさん
2006/04/22(土) 10:22:02それって2chだけの話だろ?ww(俺は元OCaml工作員)
前からHaskellの方が人気だよ
0360デフォルトの名無しさん
2006/04/22(土) 11:29:41話。 OCaml で遅延評価ばりばりのコードを書くのはちと大変。
また、 Haskell だって副作用のある関数が書ける。しかしふつうの関数とは
違うので、実際のコードでやるのは面倒くさい。
ふつうに書くなら、 OCaml の方が速い。ライブラリは、 Haskell の方が汎用
的なデータ構造ライブラリは揃っている気がするが、一般的によく使うライブ
ラリは OCaml の方が若干、揃っている。メモリ使用量は比べたことないな。
0361デフォルトの名無しさん
2006/04/22(土) 12:16:040362デフォルトの名無しさん
2006/04/22(土) 12:34:24ここによると一文字20バイトだそうだ。
0363357
2006/04/22(土) 18:44:43>>358さんがかいているように、実用になるプログラムが書きやすいかどうかは非常に興味あります。
関数型言語の本を読むとたいがい数学チックな例題ばかりで、例えばWebアプリのようなものは見受けられません。
数学チックなものはたしかに関数型言語では書きやすいのですが、
ファイルやネットワークのような入出力、あるいはデータベース処理とかいったところが
どうなのかなと思っています。
そこらへんでの、OCamlとHaskellとの比較があればうれしいですねー。
>>360-362
なるほど。メモリ使用量はHaskellのほうが多いみたいですね。
Webアプリだと数値計算はほとんどなくて文字列処理ばかりなのですが、
それだとHaskellの富豪ぶりはちょっと問題ですね。
参考になりました。ありがとうございます。
0364デフォルトの名無しさん
2006/04/22(土) 18:51:05っ ttp://www.informatik.uni-freiburg.de/~thiemann/WASH/
関数型言語「懐疑派」は、実用的なサンプルが示されないと
ひとしきり文句言って、示されたら示されたで、「それは他の言語でもできる」だの
「そのシステムを作った人間の能力が高いのあって、関数型言語の能力の高さを
証明するものではない」だの
って、なんでここでHaskellの話になってんだ。
0365デフォルトの名無しさん
2006/04/22(土) 18:53:240366デフォルトの名無しさん
2006/04/22(土) 18:59:15MLとかHaskellとかLispとかetc..を分ける必要はあるのかな・・
0367デフォルトの名無しさん
2006/04/22(土) 19:16:550368デフォルトの名無しさん
2006/04/22(土) 19:20:56いちよ、統合スレはあるんだけどね...
関数型言語Part IV
http://pc8.2ch.net/test/read.cgi/tech/1083649982/
0369デフォルトの名無しさん
2006/04/22(土) 19:50:42どちらが速度面、メモリ面で好ましいのですか?
前から疑問に思ってたもので・・・
�@ 「::」で繋いで、最後に逆さまにする
let hoge f list =
let rec iter = function
| h :: tl -> (f h) :: (iter tl)
| [] -> []
in
List.rev (iter list)
�A 「@」で即座に後ろに繋げていく
let hoge f list =
let rec iter = functoin
| h :: tl -> [f h] @ (iter tl)
| [] -> []
in
iter list
0370デフォルトの名無しさん
2006/04/22(土) 19:56:031はO(n)、2はO(n^2)
0371369
2006/04/22(土) 20:14:470372デフォルトの名無しさん
2006/04/22(土) 20:19:33実際にどれだけ時間がかかるかは色んな細かい条件に依存するけど、確かな事として、
・1はおおまかに入力の長さに比例する時間がかかる
・2はおおまかに入力の長さの2乗に比例する時間がかかる
よって、入力が十分大きい場合、1の方が速い。
0373369
2006/04/22(土) 20:22:46n^2 見たいな事でしょうか?こっちはなんとなくわかります。
でも1の、リストの反転って、すばやくできるんでしょうか?
0374デフォルトの名無しさん
2006/04/22(土) 21:23:55リストの反転はO(n)で出来る
let reverse ls =
let rec rev ls = function
| [] -> ls
| x::xs -> rev (x::ls) xs
in rev [] ls
0375369
2006/04/22(土) 21:32:50そうか、リストの反転がO(n)ということなんですね
「::」はO(1)なんですね、ただつなげるだけですもんね
すこし恥ずかしい勘違いをしてました。
O(n) という言葉を最近覚えたことがバレてしまうorz
スレ汚しすみません
0376デフォルトの名無しさん
2006/04/22(土) 21:43:44つ List.map
というか(1)のやつ最後に反転させる必要が無いような気が。
0377369
2006/04/22(土) 21:57:18う!!!
その通りですた・・・
今回のは、例えば末尾再帰にして、
結果を引数にストックしていくような処理を書くときに
let rec hoge f ret list =
let rec iter ret = function
| h :: tl -> iter ((f h) :: ret) tl
| [] -> ret in iter [] list
こんなときに、リストのそれぞれに処理した結果を元のリストの順で
並べたいとき、上の例だと ret を反転させないといけないじゃないっすか
でも確かに map というのがそのためにあるんですねorz
いや、知らないって怖いです、本当に・・・
0378デフォルトの名無しさん
2006/04/23(日) 02:09:20Haskellって文字列がばかでかいみたいだけど遅延評価があるからなんとかなっているんでしょ?
0379デフォルトの名無しさん
2006/04/23(日) 02:26:08そのそばからキャッシュしていってメモリを食う。
foldl系の関数を作って値をまとめてるつもりでも、その演算すら遅延されるから
簡約グラフがリストと同じような形で残り続ける。
0380デフォルトの名無しさん
2006/05/04(木) 13:13:02まあ、言語には向き不向きがあって、
関数型言語は実用的なアプリケーションの作成には、不向きってことでいいの?
OCamlがコンパイラ書くのに使う以外みたことなかったりするのも、
それが原因ですか?
0381デフォルトの名無しさん
2006/05/04(木) 18:43:32大部分のアプリケーションは、CやJavaで書くのも、関数型言語で書くのも大差ない。
それより、ライブラリや、ネイティブコードを吐けるコンパイラなど、
開発環境が整っていないのが大きいと思う。
0382デフォルトの名無しさん
2006/05/07(日) 14:02:47それを防ぐために`seq`があるわけだが
0383デフォルトの名無しさん
2006/05/07(日) 14:31:51しかなく、関数型で簡単に書けるところは関数型で書き、命令型で簡単に書けるところは
命令型で書くというのがいいんじゃないかなと、最近思う。
言語としては、この両者を自然に行き来できるものが最高だろうと思う。
0384デフォルトの名無しさん
2006/05/07(日) 14:34:320385デフォルトの名無しさん
2006/05/07(日) 14:39:400386デフォルトの名無しさん
2006/05/07(日) 15:40:39Haskellは命令型で自然に書けない
Scheme(Lisp)はCurry化が無い
0387デフォルトの名無しさん
2006/05/07(日) 16:09:06>>385は>>383へのレス
>Haskellは命令型で自然に書けない
よくわからん。Haskellではdo記法のおかげで
MLと大差なく自然に命令型のプログラミングができると思うんだが。
>Scheme(Lisp)はCurry化が無い
カリー化と命令型プログラミングにどういう関係がある?
0388デフォルトの名無しさん
2006/05/07(日) 16:31:44Haskellは副作用を自由に使えないよね.
両方使ってみた実感としてHaskellよりML(Ocaml)の方が
はるかに命令型プログラミングは楽.
あとSchemeの方は,Curry化がないので関数型プログラミング
しにくいってことね
0389デフォルトの名無しさん
2006/05/07(日) 16:37:44なるほど、回答ありがとう。
0390デフォルトの名無しさん
2006/05/07(日) 17:03:140391デフォルトの名無しさん
2006/05/08(月) 19:52:470392デフォルトの名無しさん
2006/05/12(金) 13:41:24その中で、タプルを
(e1,e2) = λc.c e1 e2
と表現できて、
match e1 with
(f,s) -> e2
が
e1(λf.λs.e2)
を表しているそうなのですが、なぜこうなるのか、これが何を意味するのかが???です。
参考にしたのは、
ttp://www.kb.ecei.tohoku.ac.jp/~sumii/class/keisanki-software-kougaku-2005/lambda.pdf
です。
識者の人 智恵を貸して下さい。
0393デフォルトの名無しさん
2006/05/12(金) 19:16:48実際に簡約してみればすぐわかる。
(λc.c e1 e2) (λf.λs.e3) -> (λf.λs.e3) e1 e2
0394391
2006/05/12(金) 21:45:04ありがとうゴザイマス。何となくわかったような気がするんですが
一応、勘違いしていないか確認させてください
x = (e1,e2) として、
match x with (f,s) -> e3
が
(λc.c e1 e2)(λf.λs.e3)
-> (λf.λs.e3) e1 e2
-> e3
ということなんですか?
0395デフォルトの名無しさん
2006/05/13(土) 21:20:11それが最強だということジャン。
0396デフォルトの名無しさん
2006/05/13(土) 23:08:160397デフォルトの名無しさん
2006/05/13(土) 23:14:170398デフォルトの名無しさん
2006/05/13(土) 23:49:48(たとえば
func [1;2;3] [1;2;3]
=> [(1,1);(1,2);(1,3);(2,1);(2,2);(2,3);(3,1);(3,2);(3,3)]
のようなの)
を作ったら、どういう名前をつけるのが適当でしょうか?
0399デフォルトの名無しさん
2006/05/13(土) 23:59:28だね。
0400デフォルトの名無しさん
2006/05/14(日) 00:51:56日本語だと総当たりみたいな。
full_combine ぐらいかなあ。
0401デフォルトの名無しさん
2006/05/14(日) 01:07:190402デフォルトの名無しさん
2006/05/14(日) 01:20:24cartesianProduct。
0403デフォルトの名無しさん
2006/05/14(日) 01:21:33クラス名・変数名に迷ったら書き込むスレ。Part7
http://pc8.2ch.net/test/read.cgi/tech/1144978008/
0404デフォルトの名無しさん
2006/05/14(日) 01:25:140405デフォルトの名無しさん
2006/05/14(日) 14:12:380406デフォルトの名無しさん
2006/05/14(日) 14:53:300407デフォルトの名無しさん
2006/05/14(日) 16:59:030408デフォルトの名無しさん
2006/05/15(月) 10:12:16permutation
0409デフォルトの名無しさん
2006/05/15(月) 14:13:340410デフォルトの名無しさん
2006/05/16(火) 00:18:37スナップショットが持ち運べると便利かなぁと
0411デフォルトの名無しさん
2006/05/16(火) 14:45:410412デフォルトの名無しさん
2006/05/17(水) 02:34:47tuareg-run-ocamlのHistoryを纏めて保存する機能とかないのかなぁ…
0413デフォルトの名無しさん
2006/05/17(水) 21:56:18#!/usr/bin/perl
open OUT, "> temp" or die "Cannot create file";
$| = 1;
while (<STDIN>) {
if (/\s*\#quit\s*;;/) { last; }
print OUT $_;
print;
}
close OUT;
とか適当に入力を記録するスクリプト書けば、入力したものはファイルに残せる。
エラーが起こる入力も含めてだけど。
0414デフォルトの名無しさん
2006/05/17(水) 22:06:180415デフォルトの名無しさん
2006/05/17(水) 22:35:12は必要なん?
0416デフォルトの名無しさん
2006/05/17(水) 23:10:46tuareg-mode の run-ocaml を使ってるなら、バッファの内容を全選択→コピー
→適当に編集して保存、てのはだめ? っていうかそれが面倒という話?
0417デフォルトの名無しさん
2006/05/18(木) 23:24:39参考にさせて頂きます m( _ _ )m
>416
おっしゃる通りで、それも検討致しました。
結局は非対話的部分をファイルに書いて、対話環境で「#use "hoge.ml";;」てな感じで反映させてます。
なんかもっと良い方法がないものかと思いまして質問致した次第です。
0418デフォルトの名無しさん
2006/05/21(日) 23:12:19苦労させすぎ
0419デフォルトの名無しさん
2006/05/22(月) 00:46:460420デフォルトの名無しさん
2006/05/22(月) 01:04:540421418
2006/05/22(月) 05:28:13SDLとOpenGLを同時に使おうとするとビルドできない
それぞれ単体だといけるのに
0422デフォルトの名無しさん
2006/05/22(月) 19:18:36関係ないけど、OS何?Windows?
だとしたら、手順をまとめてくれるとうれしいな
0423418
2006/05/22(月) 21:32:25手順はだいたいINSTALL.win32のとおり。
それとは違う、工夫が必要だった点は、
〜ビルド時〜
・makefile.config.msvcの下のほうにある、
MKCMXA = $(OCAMLOPT) -a -o $(1).cma〜 を
MKCMXA = $(OCAMLOPT) -a -o $(1).cmxa〜 に変更する。
・makefile.config.msvcの下のほうにある、
MKCLIB = lib /out:lib$(2).$(A) $(3) を
MKCLIB = link /lib /out:lib$(2).$(A) $(3) に変更する。
INSTALL.win32にはlib.batを作れとあるが、代わりにこうする。
(続く)
0424418
2006/05/22(月) 21:34:15・libsdlloaderstub.lib、libsdlmixerstub.lib、libsdlstub.lib、
libsdlttfstub.libをリネームする。
どのように変えるかはコンパイルエラーを参考にすべし。
・DLLの方のSDL.libとocamlsdlのSDL.libがかち合うので、DLLの方の
ライブラリパスを先に書く。
・デフォルトライブラリがかち合うので、
-cclib "/link /NODEFAULTLIB:msvcrt.lib"
を指定する。
これで、ttp://shinh.skr.jp/testsprite/ のOCaml用ソースが
コンパイルできて動いた。
と、ここまではよかったのだが、ocamlglと併用しようとすると
ビルドがうまくいかない。
どうにもならなかったので、Cygwin + MinGW 用のOCamlで挑戦してみたが、
こっちはライブラリのビルドすらうまくいかなかった。
こちらの現状をこんなところ。あともうちょいのところでうまくいってない。
0425デフォルトの名無しさん
2006/05/23(火) 10:06:370426デフォルトの名無しさん
2006/05/23(火) 13:39:090427デフォルトの名無しさん
2006/05/23(火) 16:07:300428デフォルトの名無しさん
2006/05/23(火) 18:15:22MLはバグが出にくいのがとりえだと思ったんだが・・
0429デフォルトの名無しさん
2006/05/26(金) 13:16:36makefile.config.msvc の MKCMXA の所で .cma と typo したまま
リリースしている時点で、 ocamlsdl の作者は windows でのテストは
まじめにやってないんじゃないかと、、、
こういう外部ライブラリインターフェース系はほとんど linux で開発が
行われていて、windows へのポートはあまりサポートされておらず、
サポートされているように見えても、実は地雷原になっているという
一般的印象があります。開発者が windows に興味を持ってない場合
どうしようもないけど。
とりあえず linux で ocamlgl + ocamlsdl をやってみて動いたら
windows へ、というのはどうですか?
0430デフォルトの名無しさん
2006/05/27(土) 08:18:260431デフォルトの名無しさん
2006/05/27(土) 09:11:000432デフォルトの名無しさん
2006/05/27(土) 18:23:17THX!!
camlp4 ってのはなんだか凄そうですね
pa_ifdef ってのがあるみたいですけど、これ使えばいいのかな
でも何となく使い方はわかった
けど camlp4 の書き方とかは難しそうだな
0433デフォルトの名無しさん
2006/05/27(土) 20:06:150434デフォルトの名無しさん
2006/05/27(土) 22:09:040435デフォルトの名無しさん
2006/05/27(土) 23:55:440436デフォルトの名無しさん
2006/05/28(日) 00:31:296文字分の新規領域を作って、そこに6文字コピーするってこと?
でっかい文字列を効率よく連結したいときは、Buffer とか使うの?
0437デフォルトの名無しさん
2006/05/28(日) 01:10:56一回の連結の時どちらが早いかは自分で調べてくれ!
0438デフォルトの名無しさん
2006/05/28(日) 01:24:59> そこに6文字コピーするってこと?
それは実装による。
0439デフォルトの名無しさん
2006/05/28(日) 01:31:59今でっかい文字列を扱う処理を書いていて、色々と切り取った文字列を
リストに貯めておいて最後に連結、みたいな処理書いていたんだけど
これってBufferつかったら速くなりそうだ。
0440デフォルトの名無しさん
2006/05/28(日) 02:03:22どうやってやればいいのですか?
0441デフォルトの名無しさん
2006/05/28(日) 19:05:430442デフォルトの名無しさん
2006/05/28(日) 19:39:59ttp://caml.inria.fr/pub/docs/oreilly-book/
など。
0443デフォルトの名無しさん
2006/05/29(月) 06:56:270444デフォルトの名無しさん
2006/05/29(月) 08:14:54>442
0445デフォルトの名無しさん
2006/05/29(月) 08:40:14数学的にもOcaml 的にも。
ズバっと理解できる単純な説明はありませんか?
0446デフォルトの名無しさん
2006/05/29(月) 08:46:350447デフォルトの名無しさん
2006/05/29(月) 11:59:270448デフォルトの名無しさん
2006/05/29(月) 17:21:200449デフォルトの名無しさん
2006/05/29(月) 18:03:500450デフォルトの名無しさん
2006/05/31(水) 00:52:34ファンクターってモジュールを返す引数付きのモジュールでそ。
モジュール関数みたいなもの?
んで、引数にはモジュールもファンクターも取れるので、高階らしい。
そういえば、第一級のモジュールを実装って話はどうなったんだろう。
0451デフォルトの名無しさん
2006/05/31(水) 16:21:40なるほど。かなりスッキリしますた。
0452デフォルトの名無しさん
2006/05/31(水) 16:34:31ttp://www.math.kochi-u.ac.jp/katsumi/kenkyu-ama.html
カテゴリーとして「日本国民」があって、これから別のカテゴリー「日本の人口」
を対応させるために選ぶファンクターが「国勢調査」なのだそうです
なんとなくわかったような
0453デフォルトの名無しさん
2006/05/31(水) 18:43:20その説明だと関数とファンクターの差がわからない気がする。
準同型写像になる良い例があるといいのだが。
0454デフォルトの名無しさん
2006/05/31(水) 19:55:27準同型写像になる良い例、というのを漏れにもわかる喩え話しでキボンヌ
それと、Ocaml でファンクターっていうときに、
モジュールに与える引数をファンクターっていうのか
あるいはそういう引数を取れるモジュールをファンクターっていうのか
どうにも混乱するのだが実際はどっちなの?
0455デフォルトの名無しさん
2006/05/31(水) 21:50:04キボンヌw
0456デフォルトの名無しさん
2006/05/31(水) 23:43:38後者でしょ。で、前者の引数にファンクターも指定できる。
0457デフォルトの名無しさん
2006/06/01(木) 00:12:350458デフォルトの名無しさん
2006/06/04(日) 17:06:04SML/NJで遅延評価ってできますか?
Webで読める資料とかあったら教えてください。
0459デフォルトの名無しさん
2006/06/04(日) 17:20:11SMLは遅延評価してません
0460デフォルトの名無しさん
2006/06/04(日) 17:41:50ttp://wiki.ocaml.jp/index.php?%B4%D8%BF%F4%B7%BF%B8%C0%B8%EC%A4%CE%C8%E6%B3%D3%2F%C3%D9%B1%E4%C9%BE%B2%C1
ここの記述を読んで期待したんですが、無理ですか…
OCamlでも試してみようかな。
0461デフォルトの名無しさん
2006/06/04(日) 17:48:030462デフォルトの名無しさん
2006/06/04(日) 18:22:27少なくともSMLとは違うのものではないでしょうか。
0463デフォルトの名無しさん
2006/06/04(日) 18:32:400465デフォルトの名無しさん
2006/06/04(日) 23:01:46>>458は相当の素人だと推測できる。
0466デフォルトの名無しさん
2006/06/05(月) 03:15:05type 'a susp
val delay : (unit -> 'a) -> 'a susp
val force : 'a susp -> 'a
(*
['a susp] is the type of lazily evaluated expressions with result
type 'a.
[delay (fn () => e)] creates a suspension for the expression e.
The first time the suspension is forced, the expression e will be
evaluated, and the result stored in the suspension. All subsequent
forcing of the suspension will just return this result, so e is
evaluated at most once. If the suspension is never forced, then e
is never evaluated.
[force su] forces the suspension su and returns the result of the
expression e stored in the suspension.
*)
0467デフォルトの名無しさん
2006/06/10(土) 22:29:12ここの無限リストについて、
「ヴァリアント型をわざわざ使わずに,要素と関数の組で表現することも原理的に可能である」
ってあるんですけど、実際にヴァリアント型を使わずに書くにはどう書いたらいいんですかね。
0468デフォルトの名無しさん
2006/06/11(日) 00:01:18# let rec from n = (n, fun () -> from (n + 1));;
# let head (x, _) = x;;
# let tail (_, f) = f ();;
単にこうゆうことじゃない?
0469デフォルトの名無しさん
2006/06/11(日) 00:48:47# let rec from n = (n, fun () -> from (n + 1));;
Characters 17-44:
let rec from n = (n, fun () -> from (n + 1));;
^^^^^^^^^^^^^^^^^^^^^^^^^^^
This expression has type int * (unit -> int * (unit -> 'a))
but is here used with type int * (unit -> 'a)
0471デフォルトの名無しさん
2006/06/11(日) 07:09:24>-rectypes
> 型チェックの際、任意の再帰的な型を許します。デフォルトでは、オブジェクト型を経由する再帰による再帰的な型しかサポートされません。
0472デフォルトの名無しさん
2006/06/12(月) 11:52:07手続き型言語で十分だと言ってる奴はキリギリス
0473デフォルトの名無しさん
2006/06/12(月) 11:55:180474デフォルトの名無しさん
2006/06/12(月) 13:16:170475デフォルトの名無しさん
2006/06/12(月) 18:33:29手続き型言語で十分だと言ってる奴は猫
0476デフォルトの名無しさん
2006/06/12(月) 19:02:55手続き型言語で十分だと言ってるやつは淫売
0477デフォルトの名無しさん
2006/06/12(月) 21:10:020478デフォルトの名無しさん
2006/06/12(月) 22:31:21サンダルの愛し方で犬だろう←関数型
0479デフォルトの名無しさん
2006/06/13(火) 01:30:43とかやると、
val f : int list = [1; 1; 1; 1; 1 ...]
っていう無限リストができるけどこれって何に使えるんでしょうか?
0480デフォルトの名無しさん
2006/06/13(火) 04:36:35無限リストだと、takeとかnthで簡単に取り出せる
とか言ってみるテスト
0481デフォルトの名無しさん
2006/06/13(火) 08:24:20let rec f x = 1 :: f (x + 1);;
これが[1; 2; 3; ...]っていう無限リストになるんなら使い道はありそうだけど
Ocamlで普通のリスト(takeとかが使える形の)で無限リストができるって>>479みたいなものだけですよね。
0482デフォルトの名無しさん
2006/06/13(火) 08:37:100483480
2006/06/13(火) 19:52:43少し勘違いしてた。確かに、
> let rec f x = 1 :: f (x + 1);;
このタイプの無限リストは使えない。
でもlazyを使えば、遅延リストとして無限リストが実装できて、
そっちの方が頭の中にあった。
ttp://www.jmuk.org/d/?path=2005/03/24
ここにLazyListというのがあって、それを使えばフィボナッチ数列のコードが
let fib () =
let rec loop a b =
LazyList.lcons a (lazy (loop b (a + b)))
in
loop 0 1
let _ =
print_int (LazyList.nth (fib ()) 25)
というように書ける。
0484480
2006/06/13(火) 19:54:23open LazyList
let rec zip_with f l1 l2 =
lcons (f (hd l1) (hd l2)) (lazy (zip_with f (tl l1) (tl l2)))
let rec fib () =
lcons 0 (lazy (lcons 1 (lazy (zip_with ( + ) (fib ()) (tl (fib ()))))))
let _ =
print_int (LazyList.nth (fib ()) 25)
上記のコードは、このHaskellのコードを直訳したもの。
main = print $ last $ take 25 fib
where
fib = 0 : 1 : zipWith (+) fib (tail fib)
0485480
2006/06/13(火) 19:56:08open Pcaml
EXTEND
expr: AFTER "+"
[RIGHTA [x = expr; "+:"; xs = expr ->
<:expr< lcons $x$ (lazy $xs$) >> ]];
END
-------------------------------------------------
open LazyList
let rec zip_with f l1 l2 =
f (hd l1) (hd l2) +: zip_with f (tl l1) (tl l2)
let rec fib () =
0 +: 1 +: zip_with ( + ) (fib ()) (tl (fib ()))
let _ =
int_int (LazyList.nth (fib ()) 25)
と書けたりする。
0486デフォルトの名無しさん
2006/06/13(火) 22:42:41いやまあ割りと素朴な疑問の類で、
[1; 1; 1; 1; 1 ...]
これが ...] で終わる表示になったり、Stack overflow during evaluationにはならなかったりするのは
なんか OCaml の中でわざわざ特別扱いをしてあげてるんですよね。
そういう設計判断の動機って何なのかな、何かにうまいこと使えるのかな、っていう疑問です。
0487デフォルトの名無しさん
2006/06/13(火) 23:16:14単にリストが長いときには表示をはっしょってるだけ。
List.length とかを呼ぶと止まらない。
0488デフォルトの名無しさん
2006/06/15(木) 17:38:53見事にスルーされてるな
君はお呼びじゃなかったってことだ(藁
0489デフォルトの名無しさん
2006/06/15(木) 18:42:36自演乙
0490デフォルトの名無しさん
2006/06/15(木) 19:53:540491デフォルトの名無しさん
2006/06/15(木) 20:34:39氏ね
0492480
2006/06/15(木) 20:49:470493デフォルトの名無しさん
2006/06/15(木) 23:10:280494デフォルトの名無しさん
2006/06/16(金) 04:45:32循環を含むようなデータを考えると必要な場合があるということだと思う。
どんなデータかはぱっとは思いつかないけど、Webのリンクを含むようなやつとか、ファイルシステムとか?
0495デフォルトの名無しさん
2006/06/16(金) 14:15:43Lispのprint関数はそういうのに対する配慮が厚い。
Common Lispの場合は、
・*print-circle*がnil以外で、再帰のチェックをして、
#n=, #n#を使って、再帰構造を再構築可能な印字表現を出力する。
;;; 確か共有構造再現の処理もやったはず。
・*print-level*, *print-length*で深さ、長さの上限指定
環境のdump/restoreを昔からやっていたからだと思う。
*print-readably*は、read可能な印字表現の強制を行う。
シリアライゼーション考えると、
まともな言語/ライブラリは当然持っていていい機能だと思う。
0496デフォルトの名無しさん
2006/06/16(金) 14:17:38> ;;; 確か共有構造再現の処理もやったはず。
CLtLには、
;;;
For example, the result of
(let ((x (make-symbol "FOO"))) (list x x))
would be printed as
(#:foo #:foo)
if *print-circle* were nil, but as
(#1=#:foo #1#)
if *print-circle* were not nil.
;;;
な例が。
0497デフォルトの名無しさん
2006/06/16(金) 18:47:45まともな関数型言語はLispしかないことが証明されたね
0498デフォルトの名無しさん
2006/06/16(金) 18:59:55Lispもダメだということが証明されたが
0499デフォルトの名無しさん
2006/06/16(金) 23:52:510500デフォルトの名無しさん
2006/06/17(土) 11:52:41Lispの話書いてごめん。荒れちゃった…
0501デフォルトの名無しさん
2006/06/17(土) 18:35:400502デフォルトの名無しさん
2006/06/19(月) 17:21:240503デフォルトの名無しさん
2006/06/24(土) 18:48:480504デフォルトの名無しさん
2006/06/24(土) 19:05:13毎日毎晩、串挿してシコシコキーボード叩いてろって一蹴しちゃえ。
ちなみに俺と話すならスカイプIDは dj-tama で検索なりしてくれればOK。
どっかで見覚えあるID? 細かい細かい。知ったこっちゃね。
0505デフォルトの名無しさん
2006/06/25(日) 01:26:28じゃあ O'Caml、せめて OCaml と書いてくれや。
0506デフォルトの名無しさん
2006/06/25(日) 12:09:470507デフォルトの名無しさん
2006/06/25(日) 14:27:270508デフォルトの名無しさん
2006/06/25(日) 15:35:030509デフォルトの名無しさん
2006/06/25(日) 16:04:320510デフォルトの名無しさん
2006/06/26(月) 01:26:170511デフォルトの名無しさん
2006/06/26(月) 01:57:250512デフォルトの名無しさん
2006/06/26(月) 21:53:190513デフォルトの名無しさん
2006/06/27(火) 01:48:020514デフォルトの名無しさん
2006/07/04(火) 14:06:380515デフォルトの名無しさん
2006/07/15(土) 17:50:590516デフォルトの名無しさん
2006/07/15(土) 17:56:44だから閉鎖的なんだよね。
開発が遅れるのも当然。。
0517デフォルトの名無しさん
2006/07/17(月) 18:35:260518デフォルトの名無しさん
2006/07/21(金) 22:15:300519デフォルトの名無しさん
2006/07/22(土) 02:33:520520デフォルトの名無しさん
2006/07/22(土) 11:16:420521デフォルトの名無しさん
2006/07/22(土) 11:37:350522デフォルトの名無しさん
2006/07/22(土) 13:42:190523デフォルトの名無しさん
2006/07/23(日) 15:27:590524デフォルトの名無しさん
2006/07/23(日) 16:01:21try .. with .. finally
って書ける構文拡張ってある?
あるなら自作のじゃなくてそっちを使うんだけど。
0525デフォルトの名無しさん
2006/07/23(日) 20:44:270526デフォルトの名無しさん
2006/07/23(日) 21:38:470527デフォルトの名無しさん
2006/07/23(日) 22:23:00http://martin.jambon.free.fr/p4ck.html
pa_tryfinally
0528デフォルトの名無しさん
2006/07/23(日) 22:43:19紹介サンクス。
ただ、それは試したんだけど try .. finally しか書けなかった。
0529デフォルトの名無しさん
2006/08/01(火) 11:08:49MS/IBM/Sunなど10社、ITリソース用モデル化言語「SML」草案を公開
http://www.nikkeibp.co.jp/news/it06q3/509767/
0530デフォルトの名無しさん
2006/08/01(火) 13:31:16これはひどいな。もうすこし考えて名前付けりゃいーのに。
0531デフォルトの名無しさん
2006/08/01(火) 20:07:310532デフォルトの名無しさん
2006/08/01(火) 22:54:483 文字の achronym なんて数が限られているから仕方が無いんでない。
個人的には、何年か前までは SML といえば Smalltalk Mailing List だったし。
0533デフォルトの名無しさん
2006/08/01(火) 23:40:050534この流れならこれを出しとかなきゃなるまい
2006/08/03(木) 20:15:46つ http://www.google.com/search?q=SML
0535デフォルトの名無しさん
2006/08/03(木) 21:20:28google1位かよ。SEO対策できてるのなw
0536デフォルトの名無しさん
2006/08/03(木) 21:55:240537デフォルトの名無しさん
2006/08/07(月) 21:27:110538デフォルトの名無しさん
2006/08/09(水) 21:43:02こんなの始まった。OCamlメジャー化するといいなあ。
0539デフォルトの名無しさん
2006/08/09(水) 22:25:45もやもやした内容だなぁ
0540デフォルトの名無しさん
2006/08/10(木) 13:27:060541デフォルトの名無しさん
2006/08/10(木) 14:33:32自動的静的メモリ管理(リージョン推論、コンパイル時GC)の話が読みたいなぁ。
0542デフォルトの名無しさん
2006/08/11(金) 00:48:16そんなもんあるのか。知らんかったお。
Implementation of the call-by-value lambda-calculus using a stack of regions
A theory of stack allocation in polymorphically typed languages
こーゆーやつ?
0543デフォルトの名無しさん
2006/08/12(土) 06:54:37東大はSML?OCaml?
0544デフォルトの名無しさん
2006/08/12(土) 10:45:00俺は東工大だが、コンパイラの授業でやるよ。
0545デフォルトの名無しさん
2006/08/12(土) 12:04:33一文字を一文字として扱える用になれば実用ユーティリティにも使うんだけどなぁ。 (ショボーンAA略)
0546デフォルトの名無しさん
2006/08/12(土) 15:44:10是非自分で書いてください。
0547デフォルトの名無しさん
2006/08/12(土) 16:16:09リージョン推論とか詳しくないから聞きたいんだけど、
実用的に使うにあたって何か技術的な困難があったりするの?
それとも、単にあまり知られていないだけ?
0548デフォルトの名無しさん
2006/08/12(土) 19:20:39っていうのはいったいどういうつもりでそうなってるのかな。
0549デフォルトの名無しさん
2006/08/12(土) 23:56:11東北大だけど、プログラミング演習Bでやった。というか今レポートやってる。
講義の半分はJavaだから、MLは90分*5週だけど。
この科目は今年かららしい。
0550デフォルトの名無しさん
2006/08/13(日) 08:16:54Camomile は?
0551デフォルトの名無しさん
2006/08/13(日) 23:23:00東北大は住井先生が教えておられるんだっけ?
結局、教える人がいるかいないかで、授業で採用されるかどうかが決まるわけか。
東工大はどなたが教えてるのかな?
0552デフォルトの名無しさん
2006/08/13(日) 23:40:18情報工学科でやってた憶えはないけど。
0553デフォルトの名無しさん
2006/08/14(月) 11:44:56工学部のどっかではHaskellをやってたような気がするが詳しく知らない
0554デフォルトの名無しさん
2006/08/14(月) 15:51:13動的型や副作用が入ってくると、いきなり解析が難しくなるんですよ。
Cでキャストやポインタ演算を使うと、究極的にはメモリ空間のどこでも
指すことができるわけだし。
それに、手動管理(malloc/free)との混在も話がややこしくなる。
逆に言えば、C以外の、メモリアクセス手段が制限されている言語であれば、
うまく使うことによってGCの仕事を減らすことができる。
Java SE 6 に導入される予定の「エスケープ解析」(関数スコープの外に
出て行かないと解析できたオブジェクトはヒープではなくスタックに置く)は
リージョン推論の亜種だと思う。
0555デフォルトの名無しさん
2006/08/14(月) 18:46:280556デフォルトの名無しさん
2006/08/14(月) 18:52:56OCamlの標準ライブラリにexplode/implodeがないのはかなり疑問。
0557デフォルトの名無しさん
2006/08/14(月) 19:07:28thx. つか早っ。
やはり OCaml にはないのか…。OCaml では文字列のまま処理するのが
一般的なのかな。どうも手続き型っぽい処理になって気持ち悪いんだけど。
0558デフォルトの名無しさん
2006/08/17(木) 11:36:03変に char list <=> string 変換をバリバリされて遅いプログラムを
書かれる位なら、標準ライブラリからは外す、というデザインだと思われる
名前は判らなくても型は判る関数を探すには、標準ライブラリの .mli を
grep するか ocamlbrowser を使って探すとよい。まあ、この場合ないわけだけど
0559796
2006/08/23(水) 22:48:29そのfibは構造を共有していないので O(2^n)になってるよ!
let fib =
ってすると怒られるから、OCamlではそういう再帰構造は書けないのかな
0560デフォルトの名無しさん
2006/08/25(金) 18:35:21なるほどね
どうりでメモリを食いまくるわけだ
構造の共有か……
うーむ
0561560
2006/08/26(土) 01:24:03let rec fib () =
0 +: 1 +: (let fb = fib () in zip_with ( + ) fb (tl fb))
というように変更したら、遅延評価のキャッシュが効いて、速く計算できるようになったよ。
再帰的なデータという意味合いからは外れるけど、確定した値は再計算しないということでは
同じことになっていると思う。
0562デフォルトの名無しさん
2006/08/26(土) 02:22:26N > 2の時は、N番めの値を求めるには新しい fib () の N - 1番目まで
計算しているから計算量は大体ΣNくらいある。
これはO(n^2)だから、
Haskellで同じように書いた場合はO(n)よりも効率がわるい。
で、OCamlでは
let rec a = a + 1
とか書けないから、OCamlではこの形ではO(n)にできないんじゃね?っていうはなし。
とういわけで、頭のいい人再帰的な定義かつO(n)のfibを書いてくれ!
0563デフォルトの名無しさん
2006/08/26(土) 02:36:41文がおかしくなってた。
0564デフォルトの名無しさん
2006/08/26(土) 04:35:200565560
2006/08/26(土) 15:52:02詳しい仕組みとかは全然分からないんだけど、
let rec fib = lazy(
(num_of_string "0") +: (num_of_string "1") +:
zip_with ( +/ ) (Lazy.force fib) (tl (Lazy.force fib)))
let _ =
print_endline (string_of_num (LazyList.nth (Lazy.force fib) 1000))
というように「lazy()」で括ってみて、-rectypesオプションでビルドしたら、なんかうまくいった。
多倍長整数を使って1000番目を計算しても、Haskellと遜色ない速度で答えが出る。
0566562
2006/08/26(土) 16:19:260567デフォルトの名無しさん
2006/08/27(日) 10:51:260568soutaro
2006/08/27(日) 16:32:24ラクダマスクのつもりだったのですが、工作精度の悪さが災いして、
馬にしか見えなかったみたい。反省。
0569デフォルトの名無しさん
2006/08/27(日) 23:13:430570デフォルトの名無しさん
2006/08/30(水) 06:02:37集中講義で2単位くれるっていうから取ってみたけどついていけませんorz
0571デフォルトの名無しさん
2006/08/30(水) 15:16:360572デフォルトの名無しさん
2006/08/30(水) 18:06:230573デフォルトの名無しさん
2006/08/30(水) 21:24:35講義資料見たけど、確かにあれを2日間で初心者がやるのはちょっときついかも
0574デフォルトの名無しさん
2006/08/30(水) 21:25:43提供されているというのはいいことだと思えてきた。
0575デフォルトの名無しさん
2006/08/30(水) 21:54:38どこで聞いた台詞であったか。
0576デフォルトの名無しさん
2006/08/30(水) 22:01:550577デフォルトの名無しさん
2006/08/30(水) 22:17:140578デフォルトの名無しさん
2006/09/04(月) 09:29:09「ocamlcでなくocamloptで使える,dlopenのような動的リンク機構がないか」
と尋ねられたのだけど,私には分かりませんでした.
どなたかご存知の方いらっしゃいません?
自作ソフトにいわゆる「プラグイン」の仕組みを盛り込みたいらすぃ
0579デフォルトの名無しさん
2006/09/04(月) 22:23:05な話はたいてい実は本人の話な件について
0580デフォルトの名無しさん
2006/09/04(月) 22:31:51大変申し訳ない。
578じゃないけどな〜
0581デフォルトの名無しさん
2006/09/04(月) 22:35:080582デフォルトの名無しさん
2006/09/05(火) 00:49:09ttp://caml.inria.fr/pub/ml-archives/caml-list/2005/12/c583b03155e82f2d0f4e7ab031542f17.en.html
でどうかな?ちょっとぐぐったら出てきたんだけど。
いったんCでwrapすれば、OCamlのコードを共有ライブラリにできるけど、
それをOCamlから直接使えるようにサポートする気はない
とXavierが去年の12月に言ってる。
0583デフォルトの名無しさん
2006/09/06(水) 08:59:00する気はない=する気のある人募集
と読みかえる漢であることを望む
0584デフォルトの名無しさん
2006/09/06(水) 09:01:34漢と書いて「おとこ」と読ませたいらしいが、この文字が人に当たるときに
「卑劣漢」「詐欺漢」といったネガティブな熟語ばかりが想起されていやだ
0585デフォルトの名無しさん
2006/09/06(水) 09:49:02熱血漢って10回言ってみ。詐欺漢て何?初めて聞いた。
0586デフォルトの名無しさん
2006/09/06(水) 13:29:45もっともポピュラーな例「痴漢」
0587デフォルトの名無しさん
2006/09/06(水) 13:32:17>>585
子供じゃしらんかもしれん、最近は言わないからね。
0588デフォルトの名無しさん
2006/09/06(水) 13:36:1830歳でも子供でしょうか?
0589デフォルトの名無しさん
2006/09/06(水) 14:55:04おっさんキター
まじめな話プログラミング言語より日本語の書物を読んで語彙力つけるべきじゃないかと思います。
0590デフォルトの名無しさん
2006/09/06(水) 15:01:01語彙力って何ですか?
その時々の流行の言葉を覚えればいいのでしょうか。
0591デフォルトの名無しさん
2006/09/06(水) 19:05:360592デフォルトの名無しさん
2006/09/06(水) 20:57:460593デフォルトの名無しさん
2006/09/06(水) 23:17:48Sadistic Mika Land
0594578
2006/09/07(木) 02:59:20> いったんCでwrapすれば、OCamlのコードを共有ライブラリにできるけど、
> それをOCamlから直接使えるようにサポートする気はない
> とXavierが去年の12月に言ってる。
ふむ,なるほど.本人の言葉ですか...
やっぱりnative codeにしてしまうと型が分からなくなってしまうので,それを嫌っているんでしょうね.
なんかTyped Assembly Languageを使ってnative codeを安全に動的ロードしよう... という研究があるけど,
http://citeseer.csail.mit.edu/471673.html
まだ先は長そうだ.
0595デフォルトの名無しさん
2006/09/13(水) 21:55:170596デフォルトの名無しさん
2006/09/15(金) 07:42:12レスきっと付くよ
0597デフォルトの名無しさん
2006/09/18(月) 03:35:11いまいち思いつかんな・・・
0598デフォルトの名無しさん
2006/09/18(月) 04:26:59素人に直観的にアピールできる関数型言語のsugeeところは
スクリプト言語たちにあらかたパクられちまったし。
0599デフォルトの名無しさん
2006/09/18(月) 14:24:50「速さ」をアピールしてはどうか
0600デフォルトの名無しさん
2006/09/18(月) 14:29:52それはね、単にコンパイラの作者が優秀なだけ。。
別にOCamlだから実現できたという訳ではない。
0601デフォルトの名無しさん
2006/09/18(月) 16:55:32結構感動した覚えがある。
0602デフォルトの名無しさん
2006/09/18(月) 22:36:43native コンパイルができるというのは利点ではないの?
0603デフォルトの名無しさん
2006/09/18(月) 23:33:500604デフォルトの名無しさん
2006/09/19(火) 01:43:26実用主義者にとってはツールの性質が使用する動機になる
0605デフォルトの名無しさん
2006/09/19(火) 06:30:26でもHaskellもコンパイルするとバイナリできるよね?
よくしらないんだけどあれはocamlrunみたいなものに依存してるのかな
0606デフォルトの名無しさん
2006/09/19(火) 14:05:220607デフォルトの名無しさん
2006/09/19(火) 19:58:200608デフォルトの名無しさん
2006/09/19(火) 20:19:570609デフォルトの名無しさん
2006/09/19(火) 23:23:450610デフォルトの名無しさん
2006/09/19(火) 23:55:57中間コード→最適化→中間コード→最適化→機械語
0611デフォルトの名無しさん
2006/09/19(火) 23:56:25rubyとかセマンティクス上どうしても効率の良い実装は作りづらい。
0612デフォルトの名無しさん
2006/09/20(水) 00:02:030613デフォルトの名無しさん
2006/09/20(水) 12:15:16SMLでコンパイラ書いてみせるのは割とpopular
0614デフォルトの名無しさん
2006/09/20(水) 14:35:480615デフォルトの名無しさん
2006/09/20(水) 14:50:38論文なら結構あるのしってるけど日本語のサイトで自分の論文の種書いたのあんまり見かけないorz
0616デフォルトの名無しさん
2006/09/20(水) 18:27:16このとき、MLコンパイラの集合( D, ≦ )は、Edinburgh LCF MLを最小元とする完備半順序集合である。
D上の研究 f:D→D は、MLコンパイラdを使用してMLコンパイラd'を作成する。
このとき、d ≦ f(d) でなければならない。
d = f(d) である不動点dが得られたとき、かつそのときに限り、MLの研究は終了する。
0617デフォルトの名無しさん
2006/09/20(水) 19:00:17不等号が逆?
それともMLコンパイラを改悪することを研究と呼ぶのか。
0618デフォルトの名無しさん
2006/09/20(水) 19:39:11創始者を超えることは出来ません。だから最小元なのです。
0619デフォルトの名無しさん
2006/09/20(水) 19:55:12俺にもできそうな気がしてきた。
0620デフォルトの名無しさん
2006/09/20(水) 23:56:34にしても CDuce はとっつきにくいよね
0621デフォルトの名無しさん
2006/09/21(木) 21:13:040622デフォルトの名無しさん
2006/09/21(木) 21:29:46キャッチコピーはこうだ。
「素人が素人に送るOCaml本の決定版!」
0623デフォルトの名無しさん
2006/09/21(木) 21:41:110624デフォルトの名無しさん
2006/09/21(木) 22:37:360625デフォルトの名無しさん
2006/09/21(木) 23:12:060626デフォルトの名無しさん
2006/09/21(木) 23:57:34苦い後悔が残るものだ…。
0627デフォルトの名無しさん
2006/09/22(金) 00:20:020628デフォルトの名無しさん
2006/09/22(金) 12:09:26英語で書くとマッチョダンディな世界に見えて鬱だぞ(w
0629デフォルトの名無しさん
2006/09/22(金) 12:30:28MTASCとかC--とかNekoVMとか。
0630デフォルトの名無しさん
2006/09/22(金) 14:53:19Unison があまりにも知られていないのはちょと悲しい
0631デフォルトの名無しさん
2006/09/22(金) 16:11:490632デフォルトの名無しさん
2006/09/22(金) 20:25:260633デフォルトの名無しさん
2006/09/22(金) 20:27:370634デフォルトの名無しさん
2006/09/22(金) 20:28:350635デフォルトの名無しさん
2006/09/22(金) 20:55:580636デフォルトの名無しさん
2006/09/28(木) 00:33:33http://news19.2ch.net/test/read.cgi/newsplus/1159369025/
>プログラミング言語としてはRuby,C,C++,D,Java,Perlを使用した。
アレ??
0637デフォルトの名無しさん
2006/09/30(土) 16:08:10どんな問題でも対応しようと思えばできる手続き型言語はすばらしい
0638デフォルトの名無しさん
2006/10/04(水) 22:22:280639デフォルトの名無しさん
2006/10/04(水) 22:31:480640デフォルトの名無しさん
2006/10/14(土) 16:26:280641デフォルトの名無しさん
2006/10/14(土) 16:32:54誰が書いてるの?
0642デフォルトの名無しさん
2006/10/15(日) 04:19:37ユニオン型とかを詳しく書いてほしいね
0643デフォルトの名無しさん
2006/10/15(日) 17:04:400644デフォルトの名無しさん
2006/10/15(日) 18:01:27俺の先生が書いたテキストを公開してくれればなぁ・・・細かいところまで解説してくれていて良いテキストなのに・
受講生のみなんだよね・・
0645デフォルトの名無しさん
2006/10/15(日) 20:36:38先生の名前臥せなくてもいいのでは?
0646デフォルトの名無しさん
2006/10/15(日) 21:03:410647デフォルトの名無しさん
2006/10/15(日) 21:57:510648デフォルトの名無しさん
2006/10/15(日) 22:05:23晒したりとかしたらダメなんだよ。
本にする予定みたい。
0649デフォルトの名無しさん
2006/10/15(日) 22:08:340650デフォルトの名無しさん
2006/10/15(日) 22:19:15クスクス♪ \ /::::::::::::::::::::::::::::::.:..∨ ヽ \
r‐ , i\ /::::/.::::::::::;:::::::/|:::::::// / / . , / 「 ̄ フ
/:: / |:::::|:::::,'.::::/:: //:::イ |:::::|{ | | / //!{ }1イ / . | },. イ
/:/ .|:::::|i::::i::::::|: //::〃! |::j'1ハi. |仁i/i从/大iト、} / ハ /
. /:/ _ |:::::|i:::|::::N/厶イ/ノ j/廾}::ト〈.|_j{ r=ミV' / /, }/ OCamlよろしく〜〜
/:/ {:.ヽ. j ┴く::::l:i《bし{ }5T}: | | ,. }しリ゚ / /,/
. /: / \.ヽ/ Yi:ト  ̄ ,. ¨`ハハ ト、 ー- ,/ / /艸 ___
/::/ / |ヽi:ト、 t ァ ノi/ ヽ. ヽ- < /ノ イ/ .| { |
. /::/ / ヽ |:: ゝ//T ´ ___\// ji\ | |
.. /::/ , ィ {. | |::{く / i i:|:. i. i |. \〉. /リ. i. | |
|:::| ,. ´ | \ __ | |:.ヽ:\ !| |:| | i. |. ! , |__,.イ// ノ |. | |
|:::| / ! . ,:r'' ̄| |::::::i:::::} |i弋ナ|ヽl从‐|i-j/ }イ jハ{. / | |
ヽ:.ヽ._,.イ \`r' | |从jハノハkげi` 'iげ}j/ || / / .| |
ヽ/ { \ | | | | |iゝ ̄ ,  ̄ /'/ j.||./ / 丿 ,ノ
. / \ /  ̄ ̄「| | V! |! ト、 r┐ /'/ /ハ,ハ| / / /
| ` ー―一ァヘ l | {. Vi'ア / ̄〉,ハ'´j/j/リ ノ/ ∧ / /
http://caml.inria.fr/
0651デフォルトの名無しさん
2006/10/15(日) 22:36:290652デフォルトの名無しさん
2006/10/16(月) 20:58:17良い本が出来そうな気がするけどな
0653デフォルトの名無しさん
2006/10/16(月) 21:49:22それって俺のこと?
だったら俺の先生の方が上だよ
0654デフォルトの名無しさん
2006/10/18(水) 15:37:510655デフォルトの名無しさん
2006/10/18(水) 16:34:00一般的に書くのがかっこいいと思ってやがるの。
自分の文書が使い捨てにされるのが我慢ならないんだね。
マジできもいし。
0656デフォルトの名無しさん
2006/10/18(水) 21:07:22sml/njのサイトが繋がらない。
index以外は404だし…
クラックされたのだろうか
0657デフォルトの名無しさん
2006/10/18(水) 21:25:58以前のバージョンで書いたソースの手直しとか発生する?
0658デフォルトの名無しさん
2006/10/20(金) 00:12:31しかも洋書のパクリみたいな内容
0659デフォルトの名無しさん
2006/10/20(金) 04:10:06いちいちくわしくおしえてくれ
0660デフォルトの名無しさん
2006/10/20(金) 07:49:56そのビットが0だったらそのまま整数とみなして、そうでなかったらポインタとみなす、みたいな。
0661デフォルトの名無しさん
2006/10/20(金) 09:18:05型検査は静的に終わってるんだから動的型情報を持っておく意味ないし
0662デフォルトの名無しさん
2006/10/20(金) 09:20:560663デフォルトの名無しさん
2006/10/20(金) 13:11:362つ作るだけならいいんだけど、引数の数が増えると指数関数的に増大する。
0664デフォルトの名無しさん
2006/10/20(金) 13:15:340665デフォルトの名無しさん
2006/10/20(金) 22:59:150666デフォルトの名無しさん
2006/10/20(金) 23:58:500667デフォルトの名無しさん
2006/10/21(土) 00:46:51静的型付き言語をGC付きで実装するときには避けて通れない点だ
データが整数かポインタかどうやって判定する?
α.データだけを見て判定する
たとえば有効なアドレスの可能性があるならポインタと判定し
その可能性がゼロのときに限って整数とみる
ゴミを除ききれないのが欠点だ
β.実行時にも型情報をもたせてGC時にそれを見て判定する
β.1.データに型情報を埋め込む
32bitワードを31bit整数と1bit型情報で分けるのがこの方法
データの数に比例して型情報の合計サイズも増えてしまうのが欠点だな
β.2.型情報をデータと別の領域に持つ
データの数が増えても型情報のサイズは一定
しかし多相型を扱えない. データの型が実行時にならないと
決まらないから型情報をコンパイル時につくれないから.
例えばSun Javaの実装は別領域に配置した型情報への
ポインタをオブジェクトに持たせているからβ.1.とβ.2.
の折衷だな
MLのデータ構造に比べたらJavaのオブジェクトはそれほど頻繁
に生成されるものではないからポインタを持たせるコスト
もacceptableだと判断したんだな
MLの場合膨大な数のデータが生成と消滅を繰り返すから
ワードサイズのポインタを持たせるのは到底受け入れられ
ない. bitだけ持たせることにしたんだな. それしかいらないし.
Javaの場合, 整数かポインタかだけじゃなくてクラスやインタフェイス
の継承関係も実行時に必要だから1bitじゃ足りない
0668デフォルトの名無しさん
2006/10/21(土) 01:17:35多相型の関数は必要なだけ作れば?
どういう型のラインナップが必要かは実行しなくてもわかるんだから。
0669デフォルトの名無しさん
2006/10/21(土) 09:54:07GCつけるならデータの型を実行時に判定しなくちゃならない。
多相型のない言語でもGCを付けるならこの問題は同じ。
多相型があると解法が限定されてしまうが。
0670デフォルトの名無しさん
2006/10/21(土) 12:41:47> GCつけるならデータの型を実行時に判定しなくちゃならない
自体は真だけど、それはタグビットを値に持たせることが必須となることの
十分条件ではないね。
0671デフォルトの名無しさん
2006/10/21(土) 14:41:48使えるメモリ量が増えたから BIBOP 使えねという話を読んだ事があるけど、
領域毎に格納するオブジェクトを決めておく方式は良いアイデアだと思う。
0672デフォルトの名無しさん
2006/10/24(火) 10:04:09(a==b)? a : 0
とか書くじゃないですか
こういうのってOcaml にもありますか
毎度 if then else 書くのが疲れるので・・・
0673デフォルトの名無しさん
2006/10/24(火) 10:43:36やりたきゃ camlp4 使え
0674デフォルトの名無しさん
2006/10/24(火) 22:01:37# 1=2 && true || false;;
- : bool = false
# 1=1 && true || false;;
- : bool = true
3項演算子のない言語では割と一般的な慣用句だよん。
なんでもcamlp4使おうとするのは逆に頭固いと思う。
0675デフォルトの名無しさん
2006/10/24(火) 22:04:560676デフォルトの名無しさん
2006/10/25(水) 00:27:250677デフォルトの名無しさん
2006/10/25(水) 03:18:120678デフォルトの名無しさん
2006/10/26(木) 21:49:57これおもしろいですね。誤字が多いけど。
0679デフォルトの名無しさん
2006/10/26(木) 22:46:160680デフォルトの名無しさん
2006/10/26(木) 22:52:54SML?
0681デフォルトの名無しさん
2006/10/26(木) 23:10:470682デフォルトの名無しさん
2006/10/26(木) 23:19:510683デフォルトの名無しさん
2006/10/26(木) 23:37:030684デフォルトの名無しさん
2006/10/27(金) 02:50:270685デフォルトの名無しさん
2006/10/28(土) 00:33:440686デフォルトの名無しさん
2006/10/28(土) 04:43:160687デフォルトの名無しさん
2006/10/28(土) 05:01:290688デフォルトの名無しさん
2006/10/28(土) 10:38:430689デフォルトの名無しさん
2006/10/28(土) 13:50:140690デフォルトの名無しさん
2006/10/28(土) 17:43:020691デフォルトの名無しさん
2006/10/29(日) 23:42:00↓がその答えなんですが、こんな答えパッと出るものなのですか?
何かアルゴリズムの定石みたいのがあるのですか?それともおれが馬鹿なだけ?
一応書けたけのだけれどおれのは物凄い計算量。
初めて勉学で壁にぶちあたってます。。。
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;;
0692デフォルトの名無しさん
2006/10/30(月) 03:34:07逆に言えば慣れることが大事。
0693デフォルトの名無しさん
2006/10/30(月) 04:22:21>>692
なるほど。大1でプログラミング能力はJavaをちょっと齧った程度です。
Javaのソートなどは見ていてなるほどなぁ、と思ったのですがOcamlの
それを見て、どこからこんなの思いつくんだ!?って思ってしまいました。
やっぱ慣れなんですかね?
とっつきは記述の仕方など数学に似ている部分があったのでocamlのほうがスラスラ
いったのですが…
0694デフォルトの名無しさん
2006/11/06(月) 00:14:35今どれくらいまで進歩したの?
0695デフォルトの名無しさん
2006/11/06(月) 01:58:25オブジェクト指向離れが進んできてる気がする。
0696デフォルトの名無しさん
2006/11/06(月) 03:26:330697デフォルトの名無しさん
2006/11/06(月) 03:28:260698デフォルトの名無しさん
2006/11/07(火) 00:41:08論文が2005年の数本と6年の1本ぐらいしかないんだけど
どっから勉強すればいいの?今さXPATHとかああゆうちょっと
普通の言語だと処理しにくい構造のやつSYBだと処理しやすい
みたいだから勉強したいのおしえてちょ
0699デフォルトの名無しさん
2006/11/12(日) 06:03:46何これ?
0700デフォルトの名無しさん
2006/11/13(月) 01:40:230701デフォルトの名無しさん
2006/11/13(月) 01:55:480702デフォルトの名無しさん
2006/12/03(日) 02:09:30知ったこっちゃない俺にとっては同じ抽象化に見えるんだが、どうよ?
<m:int;ρ> だろうが <m:int> <: <m:int;m':string> だろうが、
<m:int>は共通部分ですよって事しか言ってないじゃん。
どっちかに統一できんのか?
0703デフォルトの名無しさん
2006/12/03(日) 05:18:480704デフォルトの名無しさん
2006/12/05(火) 22:14:530705デフォルトの名無しさん
2006/12/07(木) 08:46:13コードは書きやすいけど、デバッグがめんどくさい。
0706デフォルトの名無しさん
2006/12/07(木) 11:36:000707デフォルトの名無しさん
2006/12/07(木) 20:53:400708デフォルトの名無しさん
2006/12/07(木) 21:29:58ocamldebugというのがありますよ。
0709デフォルトの名無しさん
2006/12/07(木) 21:34:16ウォッチウインドウとかクリックでブレークポイント設定とかしたいの
0710デフォルトの名無しさん
2006/12/07(木) 23:37:23ただしVS2005Proが必要。
0711デフォルトの名無しさん
2006/12/08(金) 21:12:340712デフォルトの名無しさん
2006/12/09(土) 22:46:45shuffle_list l = (* 'a list -> 'a list *)
let rec shuffle_list' t =
let insert a l n =
let rec insert' a l n t = match l, n with
_, 0 | [], _ -> List.rev_append t (a::l)
| x::xs, n -> insert' a xs (n-1) (x::t)
in insert' a l n []
in function
[] -> t
| x::xs ->
let n = Random.int ((List.length t) + 1)
in shuffle_list' (insert x t n) xs
in shuffle_list' [] l
これでは効率が悪いような気がします.
他に何かいい書き方があるでしょうか?
0713デフォルトの名無しさん
2006/12/10(日) 00:49:22let random_split (l, len) =
let final_xlen = len / 2 in
let rec loop source slen x xlen y ylen = match source with
[] -> ((x, xlen), (y, ylen))
| (s::ss) ->
if Random.int slen < final_xlen - xlen
then loop ss (slen-1) (s::x) (xlen+1) y ylen
else loop ss (slen-1) x xlen (s::y) (ylen+1)
in loop l len [] 0 [] 0;;
let shuffle_list l =
let rec shuffle_list' (l, len) = match l with
[] -> []
| [x] -> [x]
| xs ->
let (a, b) = random_split (l, len)
in List.rev_append (shuffle_list' a) (shuffle_list' b)
in shuffle_list' (l, List.length l);;
0714712
2006/12/10(日) 01:50:46なるほどこれだと速いですね.ありがとうございます.
この場合はシャッフルが一様である保証ができるでしょうか?
というのは,リストのどの要素も等確率にリストのある位置に
くるという意味ですが.
0715デフォルトの名無しさん
2006/12/10(日) 10:13:10loop の処理は source から final_xlen 個の要素を無作為に選択する処理に他ならないので,
>let (a, b) = random_split (l, len)
で l の各要素が a に入るか b に入るかが等確率であると言えるように見えます.
0716デフォルトの名無しさん
2006/12/10(日) 10:16:46厳密には,確率 len / 2 で a に入り,確率 1 - len / 2 で b に入る,
でした.
0717712
2006/12/11(月) 01:25:07ご指摘ありがとうございます.
確かにそう考えるとほぼ一様っぽいですね.
面倒なので証明を考えてみていないのですが十分使えるのでOKです.
改めて 713 さんありがとうございました.
0718デフォルトの名無しさん
2006/12/11(月) 02:06:29n個から適当な一個に注目し、(k/n)の確率でこれを選ぶ。
さらに残りの(n-1)個から同じアルゴリズムで足りない分を選ぶ。
で、これを使ったとき、考えられるnCk通りが全て等確率で現れることを示せば良い。
nに関する帰納法で示す。n=0のときは自明。
注目された一個が選ばれたとき(確率k/n)、帰納法の仮定から、残りについて(n-1)C(k-1)通りが等確率で現れる。
よって特定の選びかたが現れる確率は、
k/n * (1/(n-1)C(k-1)) = k!(n-k)!/n!
選ばれなかったとき、同様に、
(n-k)/n * (1/(n-1)Ck) = k!(n-k)!/n!
であり等しい。結局全ての選びかたが等確率で現れることがいえた。
0719デフォルトの名無しさん
2006/12/11(月) 12:19:27実際には、配列に変換してから、ランダムシャッフルするのが
一番楽だと思うけど。
0720デフォルトの名無しさん
2006/12/20(水) 09:49:17単相型とか多相型って言葉の意味がわからないんですが・・・
どういう意味なんですか?
0721デフォルトの名無しさん
2006/12/20(水) 09:50:44なんだかピンと来ません
簡単な例でどういう感じが単相だとか多相だとか教えていただけないでしょうか
0722デフォルトの名無しさん
2006/12/21(木) 01:55:20# let make_list x = [x];;
val make_list : 'a -> 'a list = <fun>
# make_list 1;;
- : int list = [1]
# make_list true;;
- : bool list = [true]
こういう感じが「単相的」
# let make_list x = [0; x];;
val make_list : int -> int list = <fun>
(緩和された値多相とか、そーゆー難しい話はこの際抜きで)
0723721
2006/12/21(木) 15:13:56やっと、わかりました。ありがとうございました。
0724デフォルトの名無しさん
2006/12/29(金) 09:37:04let quote_string fmt s =
Format.fprintf fmt "\"%a\""
(fun fmt s ->
String.iter (fun c -> Format.fprintf fmt "%s" (escape_char c)) s) s
これって、どうして
let quote_string fmt s =
Format.fprintf fmt "\"%a\""
(String.iter (fun c -> Format.fprintf fmt "%s" (escape_char c)) s))
じゃいけないんでしょうか
なんで間に (fun fmt s -> ....)が入るのかがよくわからないのです
0725デフォルトの名無しさん
2006/12/29(金) 14:50:010726デフォルトの名無しさん
2007/01/03(水) 11:08:31%aは formatter -> 'a -> unit という関数と 'a の値と二つ必要なんだよ。
# open Format;;
# fprintf std_formatter "%a";;
- : (Format.formatter -> '_a -> unit) -> '_a -> unit = <fun>
参考:ttp://caml.inria.fr/resources/doc/guides/format.html
0727デフォルトの名無しさん
2007/01/03(水) 17:36:550728デフォルトの名無しさん
2007/01/04(木) 05:58:42rubyでいうところのeRubyみたいなものです。
0729724
2007/01/05(金) 09:16:19ありがとうございます
%a について勘違いしてました。ただ型についてはわかりましたが
formatter ってものについてまだよくわかってないみたいす
も一度勉強してきます
0730728
2007/01/07(日) 06:38:410731デフォルトの名無しさん
2007/01/07(日) 10:58:08mod_camlも別に使ったこと無いけど
0732デフォルトの名無しさん
2007/01/08(月) 01:02:29eRuby の実用途で一番近いのは camltemplate なんだけど、
http://saucecode.org/camltemplate/
こちらは OCaml のコードがそのまま埋め込まれるわけではないので少し違うしなぁ
0733デフォルトの名無しさん
2007/01/12(金) 10:32:36Cでso作ってリンクするんじゃなしに
0734デフォルトの名無しさん
2007/01/12(金) 10:35:590735デフォルトの名無しさん
2007/01/12(金) 10:40:310736デフォルトの名無しさん
2007/01/12(金) 23:17:250737デフォルトの名無しさん
2007/01/26(金) 09:50:120738デフォルトの名無しさん
2007/01/26(金) 23:34:43・クロージャのMarshalも結構制限があるっぽい
なので難しそうな印象
0739デフォルトの名無しさん
2007/01/27(土) 07:59:35たしかNetshm というモジュールがなんかのライブラリにあったけど
これもMarshal同様の制限があった気がするな
0740デフォルトの名無しさん
2007/01/30(火) 09:22:17エクスポートして中身を確認したいんですがどうすればよいのでしょう
0741デフォルトの名無しさん
2007/01/31(水) 00:50:26書いてあるけど、.ml の相互変換ってできるのでしょうか。
どなたか、やり方知ってたら、教えて下さいませ。
0742デフォルトの名無しさん
2007/01/31(水) 02:01:14Marshal.Closures指定すればできね?
同一プログラムファイルでしか共有できないけど。
byte/native問わず3.08からはふつうに使えるはず。
http://caml.inria.fr/pub/docs/manual-ocaml/libref/Marshal.html
http://wiki.ocaml.jp/index.php?ChangesSince3.07
共有メモリを別のプログラムで使う場合はクロージャは諦めてくれ。
0743デフォルトの名無しさん
2007/01/31(水) 02:09:54camlp4 pa_o.cmo pr_r.cmo foo.ml
camlp4 pa_r.cmo pr_o.cmo foo.ml
とか?
0744741
2007/02/01(木) 19:31:19おお! そんなやり方が!
一応、マニュアルとかも斜め読みしたんですが分かりませんでした。
マニュアルよく見たら、分かりますかね。それともソースですか?
何はともあれ、ありがとうございました。
0745デフォルトの名無しさん
2007/02/03(土) 10:31:290746743
2007/02/05(月) 21:54:37ttp://caml.inria.fr/pub/docs/tutorial-camlp4/tutorial008.html#toc55
manualは分かりづらい。tutorial推奨。
>>745
禿同。
0747デフォルトの名無しさん
2007/02/14(水) 06:26:48% ocaml
Objective Caml version 3.09.3
# #thread;;
/usr/local/lib/ocaml/threads: added to search path
/usr/local/lib/ocaml/unix.cma: loaded
/usr/local/lib/ocaml/threads/threads.cma: loaded
# let t = Thread.create (fun () -> while true do Thread.delay 1.0 done) ();;
val t : Thread.t = <abstr>
# Thread.kill t;;
Exception: Invalid_argument "Thread.kill: not implemented".
てなるんですが Thread.kill って実装されてないんでしょうか?
0748デフォルトの名無しさん
2007/02/14(水) 08:39:170749デフォルトの名無しさん
2007/02/14(水) 09:41:27あるいは thread を kill する別のやりかたはあるのでしょうか?
0750デフォルトの名無しさん
2007/02/14(水) 10:47:49それからソースを見れば、
(* Thread.kill is currently not implemented due to problems with
cleanup handlers on several platforms *)
とあるのがわかる。
あと vmthread なら kill は実装されてるだろ。
0751デフォルトの名無しさん
2007/02/14(水) 16:11:46vmthread って light weight なスレッドだとか聞いたけど
じゃあ、ふつーの native thread って何であるの?
外部のCのライブラリとかと共存するため?
mt がらみの処理がcaml で閉じてる場合、vmthread 使ったほうが
高速なんだよね?
0752デフォルトの名無しさん
2007/02/14(水) 16:27:38native threadだと実CPUの数でパフォーマンスがあがるから。
0753デフォルトの名無しさん
2007/02/14(水) 17:00:350754デフォルトの名無しさん
2007/02/14(水) 21:26:33それなりに使ってる人たちもいるんだろうけど、
どの界隈に多いんだろうか。
0755デフォルトの名無しさん
2007/02/14(水) 22:27:57vmthread は ocaml 上で動く → ???
0756デフォルトの名無しさん
2007/02/14(水) 23:02:42俺も思ったw
それはそうと本出るらしいね
http://d.hatena.ne.jp/sumii/20070214/p2
0757デフォルトの名無しさん
2007/02/15(木) 09:49:02vmthread の方がいいよ
0758デフォルトの名無しさん
2007/02/15(木) 09:49:450759デフォルトの名無しさん
2007/02/15(木) 10:11:34http://caml.inria.fr/pub/docs/manual-ocaml/manual038.html
Native/vmthread関係なく複数CPUの恩恵を受けることはないと書いてある。
たしか、IO等の重い処理(正確にはleave_blocking_section()を呼ぶ処理)に対しては、実行中に他のスレッドを実行しうる。
それ以外については複数CPUで走ることはないはず。
ちょっと論点は違うけどこの辺が参考になるのではないかな。
http://alan.petitepomme.net/cwn/2006.05.16.html#5
0760デフォルトの名無しさん
2007/02/15(木) 17:27:54>>756
スレの上の方で予言してた人のはこれですかね
でもエントリの内容だけだと内容の想像が付かない
0761デフォルトの名無しさん
2007/02/15(木) 21:44:180762デフォルトの名無しさん
2007/02/15(木) 21:53:36let hoge x = let rec loop = ... in loop
と必要なだけ引数を取ったらクロージャを作るのと
let rec hoge x = ... else hoge x y
と変化しない引数も持って回るのとで、速度の差はあるのでしょうか?
0763デフォルトの名無しさん
2007/02/15(木) 22:06:16女が使うような女々しい言語なんかつかえるか!!!
0764デフォルトの名無しさん
2007/02/15(木) 22:12:16それじゃ女の子とどうやって話するんだ
0765デフォルトの名無しさん
2007/02/15(木) 22:13:100766デフォルトの名無しさん
2007/02/16(金) 07:11:160767デフォルトの名無しさん
2007/02/18(日) 15:22:55出版社のページに目次あったよー
0768デフォルトの名無しさん
2007/02/18(日) 16:02:050769デフォルトの名無しさん
2007/02/19(月) 11:10:44本家のページに「前者のように書きたがる人が多いけど
後者の方が速いから改めよ」みたいなことが書いてあった気がする
0770デフォルトの名無しさん
2007/02/19(月) 11:22:57#!/usr/bin/env ocaml
print_string "hello\n";;
#!/usr/local/bin/ocaml
print_string "hello\n";;
というのを$ocaml test.mlという風に実行すると両方とも同じ結果になるんですが、
実行権をあたえて、./test.mlという風に実行するとなぜか後者だけprint_stringが見つかりません
見たいな事を言われてしまうんですが、なにか解決する方法はありませんか。
0771デフォルトの名無しさん
2007/02/19(月) 11:59:22#!/usr/local/bin/ocamlrun /usr/local/bin/ocaml
print_string "hello\n";;
で、よかったんですね・・・、
これでさくらレンタルでもocaml CGIが走る!ψ(`皿´)ψウシャー
0772デフォルトの名無しさん
2007/02/19(月) 12:02:06#!から始まる先頭行の行末までをコマンドとみなして、あたかもそのコマンド
に引数を与えて実行するという機能を、UNIX系のOSでは持つ。
で、そのコマンドがそのパスに存在しないと file not found 系のエラーになる。
ということで間違いなく ocaml が /usr/local/bin にないだけだから、
which ocaml してその結果で置き換えなさい。
env コマンドが何をするものか、なぜそれだと上手く行くように見えるのか、
というのは自分で調べること。
0773デフォルトの名無しさん
2007/02/19(月) 12:33:240774デフォルトの名無しさん
2007/02/19(月) 13:01:05本じゃなしに、例えばC++とかJavaとかの棚に入るような雰囲気の本をそろそろ出すべきだと思う
この感じだと、せっかくの入門書なのに古臭いLispの本が並ぶ棚の側に置かれそうな感じだ
0775762
2007/02/19(月) 16:18:55http://caml.inria.fr/pub/old_caml_site/ocaml/speed.html
これですね。後者のほうにしときます。ありがとうございました。
0776デフォルトの名無しさん
2007/02/19(月) 17:16:28いや違うと思うぞ。
うまくいかないのはocamlコマンドが#!で始まるスクリプトだからかな。
http://ocaml.jp/archive/ocaml-manual-3.06-ja/manual023.html
0777デフォルトの名無しさん
2007/02/19(月) 22:03:120778デフォルトの名無しさん
2007/02/20(火) 03:34:08shebang行に#!<dir>/bim/ocaml
と入れても実行できない理由は、
ocamlというファイル自体がocamlrun上で走る
バイトコードだからかなと思ったんですが、違いますかね?
実際そのように考えて、>>771のように
#!<dir>/bin/ocamlrun <dir>/bin/ocaml
としたら、うまく動いてるんですが・・・
ttp://www002.upp.so-net.ne.jp/mamewo/ml.html
0779デフォルトの名無しさん
2007/02/20(火) 03:34:510780デフォルトの名無しさん
2007/02/21(水) 06:18:350781デフォルトの名無しさん
2007/02/22(木) 10:25:49これでも導入しとけよ。
0782デフォルトの名無しさん
2007/02/23(金) 02:19:24そうだと思う。ocamlの先頭部分をダンプすると
#!/foo/bar/ocamlrun
とか付いているし。
もう一個の実行の仕方として
#! /bin/sh
# (*
exec ocaml "$0" "$@"
*) directory "."
というのがある。
面倒なので俺も>>781使うのを推奨。
0783デフォルトの名無しさん
2007/02/24(土) 20:52:52結構行間が空いてるのでもう一回り小さい装丁でもよかったんじゃなかろうかと思わんでもない、
内容をぱっと見してるかぎりじゃプログラム初学者から関数型を食わず嫌いしてた古参のプログラマも読める内容になってます。
0784デフォルトの名無しさん
2007/03/14(水) 13:43:05# [1;2;3];;
- : int list = [1; 2; 3]
とかpretty-printしてくれるけど、これと同じことする関数ってない?
0785デフォルトの名無しさん
2007/03/24(土) 08:54:13list -> tuple
の相互変換をする標準関数はないの?
0786デフォルトの名無しさん
2007/03/24(土) 13:49:35Toploop.print_value
ただし使い方が難しいかも
>>785
たぶんない。型がつけられないと思われる。
Obj.magic的なことをすれば何とかなるかもしれんが。
0787デフォルトの名無しさん
2007/03/27(火) 05:21:32let tuple_of_list lst = Obj.magic (Array.of_list lst)
ちゃんと動くかどうかは…知らん。
0788デフォルトの名無しさん
2007/03/27(火) 06:30:300789デフォルトの名無しさん
2007/03/30(金) 07:35:080790デフォルトの名無しさん
2007/03/30(金) 09:18:52nativeコードでも見れる
0791デフォルトの名無しさん
2007/03/30(金) 21:26:460792デフォルトの名無しさん
2007/03/30(金) 22:54:52http://www.pllab.riec.tohoku.ac.jp/smlsharp/ja/?Download
0793デフォルトの名無しさん
2007/04/01(日) 01:28:54ウィンドウズでさくっと使えるので楽しげ。
SML# 0.20 (2007-03-30 10:47:08 JST)
# val x = 1;
val x = 1 : int
#
さぁ、何作って遊ぼうかなー。
0794デフォルトの名無しさん
2007/04/01(日) 01:40:38# fun get_name n : string = #name n;
val get_name = fn : ['a#{name:string} .'a -> string]
おー、forallになってるお。
# get_name { name = "smlsharp", version = 0.2 };
val it = "smlsharp" : string
グレイト。まぁ、前からできるんだろうけどさ。初体験なわけよ、俺的には。
っていうか、レコードって型宣言しなくても使えるんだ。
0795デフォルトの名無しさん
2007/04/01(日) 13:43:56多相レコードのキモだ。
他のレコード(オブジェクト)型がある言語では「そのフィールドを持つレコード(オブジェクト)型の
宣言がないよ」って言われる。
0796デフォルトの名無しさん
2007/04/01(日) 14:28:04#fun pair x y = (x, y);
val pair = fn : ['a .'a -> ['b .'b -> 'a * 'b]]
# pair 1;
val it = fn : ['a .'a -> int * 'a]
うん、多相になっている。OCamlなら、
# let pair x y = x, y;;
val pair : 'a -> 'b -> 'a * 'b = <fun>
# pair 1;;
- : '_a -> int * '_a = <fun>
と単相になってしまう。
ちなみに私はSML#の関係者でもなんでもないので、
広告のための自作自演ではない。あしからず。
ホントに単なる趣味です。
追加するとSML#だと、これが無理っぽい。
# fun fst (x, y) = x;
val fst = fn : ['a,'b.'b * 'a -> 'b]
# fst ([], 1);
stdIn:7.1-7.11 Warning:
dummy type variable(s) X0 are introduced due to value restriction
val it = [] : X0 list
残念。単相になってしまう。
0797デフォルトの名無しさん
2007/04/01(日) 17:36:57どれどれ。
# fun power (x, 0) = 1
> | power (x, n) = x * power (x, n - 1);
val power = fn : int * int -> int
# power(2, 31) - 1;
val it = 2147483647 : int
うむ、確かに。正負あわせて32bitって訳だ。
0798デフォルトの名無しさん
2007/04/02(月) 22:10:190799デフォルトの名無しさん
2007/04/03(火) 04:10:31そいつは基地外。HaskellとかErlangのコミュでもフレーム撒き散らして迷惑かけてる。
0800デフォルトの名無しさん
2007/04/15(日) 04:39:390801デフォルトの名無しさん
2007/04/15(日) 11:33:05http://www.cl.cam.ac.uk/research/tsg/SMLNET/
http://research.microsoft.com/fsharp/fsharp.aspx
オレも誤解してた時期があったけど。でもSML#の方が .net より先なんで仕方ない。
0802デフォルトの名無しさん
2007/04/15(日) 16:00:14マルチコアプロセッサを積んだマシンが殆どな時代だし。
0803デフォルトの名無しさん
2007/05/01(火) 21:19:58既出?
0804デフォルトの名無しさん
2007/05/02(水) 01:09:290805デフォルトの名無しさん
2007/05/02(水) 02:32:490806デフォルトの名無しさん
2007/05/02(水) 06:26:39http://www.sanspo.com/baseball/top/bt200705/bt2007050201.html
0807デフォルトの名無しさん
2007/05/11(金) 21:42:10MLでファイルシステムを書けるなんて、鼻血が出そうだ。
0808デフォルトの名無しさん
2007/05/12(土) 20:30:530809デフォルトの名無しさん
2007/05/12(土) 20:58:05・速いから
0810デフォルトの名無しさん
2007/05/12(土) 20:58:590811デフォルトの名無しさん
2007/05/12(土) 21:23:370812デフォルトの名無しさん
2007/05/12(土) 22:17:320813デフォルトの名無しさん
2007/05/12(土) 22:18:59えーっと、この変数に入ってるのはリストのリストのリストのリストの。。。。。キッーーーーー(イライラ
0814デフォルトの名無しさん
2007/05/13(日) 06:34:32おまえはオレかw
0815デフォルトの名無しさん
2007/05/13(日) 07:13:51ワロタ
0816デフォルトの名無しさん
2007/05/13(日) 11:19:540817デフォルトの名無しさん
2007/05/13(日) 11:24:110818デフォルトの名無しさん
2007/05/13(日) 11:52:59『動的型付け』がScheme/Common Lispの言語仕様に入ってるの?
0819デフォルトの名無しさん
2007/05/13(日) 12:31:480820デフォルトの名無しさん
2007/05/13(日) 12:33:240821デフォルトの名無しさん
2007/05/13(日) 14:05:580822デフォルトの名無しさん
2007/05/13(日) 14:11:240823デフォルトの名無しさん
2007/05/13(日) 14:15:200824デフォルトの名無しさん
2007/05/13(日) 14:22:13静的型付け (=変数に型がある)
- 強い型付け(即エラー), 弱い型付け(一部自動キャスト), 型推論(ひもづけるリテラル等から判断) 等で更に細分化できる
動的型付け (=値に型がある)
型なし
- BCPL、アセンブラ等
0825デフォルトの名無しさん
2007/05/13(日) 14:27:41たとえば1という値に対して加算という操作ができるのであれば"a"という値に対しても加算という操作ができる。
0826デフォルトの名無しさん
2007/05/13(日) 14:30:410827デフォルトの名無しさん
2007/05/13(日) 19:11:480828デフォルトの名無しさん
2007/05/13(日) 19:51:210829デフォルトの名無しさん
2007/05/13(日) 20:10:490830デフォルトの名無しさん
2007/05/13(日) 22:52:090831デフォルトの名無しさん
2007/05/13(日) 23:01:20実行時型検査を省略する。
つまり、型推論と同じようなことをしている。
0832デフォルトの名無しさん
2007/05/13(日) 23:04:28Common Lisp だって静的型付けは言語でサポートされているし、
型推論をする事も可能だけど、OCaml の方が全然速い
0833デフォルトの名無しさん
2007/05/13(日) 23:54:48型指定を山ほど書くはめになるけど。
0834デフォルトの名無しさん
2007/05/14(月) 00:00:56実測したのはどんな処理ですか?
数値演算系かな。
0835デフォルトの名無しさん
2007/05/14(月) 01:17:22そりゃ速いのは助かるけど、Webアプリや業務ロジックを実装する上では
CommonLispだろーがOCamlだろーが、速さに関して特に不都合に感じない。
それよりも静的検査の強力さがOCamlの一番の特徴じゃないの?
0836デフォルトの名無しさん
2007/05/14(月) 01:23:050837デフォルトの名無しさん
2007/05/14(月) 01:24:310838デフォルトの名無しさん
2007/05/14(月) 01:42:57どっちも気になるなら両方つかえよ。あんま相手しないほうがいいんじゃね。
0839デフォルトの名無しさん
2007/05/14(月) 15:52:40ように思う。
デビアンのべんちのサイトでも確かに結果がでてる。1年前の順位とちがう。
国内で一桁しか使ってそうに無いcleanって速いみたいだね。日本のサイト
でがんばってる二人凄いと思う。出版の規格が浮かび上がればいいね。その
前にあらーんのように、ITmediaなどで取り上げてもらって、世論誘導を願
えば売れるかも。昨年はすける、今年あらーん、来年くりーんか。三拍子だ。
おきゃむるブレイクも有り得るんか。
0840デフォルトの名無しさん
2007/05/14(月) 17:20:08シンクロしている事が人気に繋がっている訳だけど、クリーンはそういうのが
無いんだよね。元々コンカレントを意識していた筈なのに…
つーか、まともにネイティブスレッド使えるまともな関数型言語の処理系って
少ないよね
0841デフォルトの名無しさん
2007/05/14(月) 17:53:01http://thumb.uploda.org/file/uporg808735.jpg
0842デフォルトの名無しさん
2007/05/14(月) 17:54:000843デフォルトの名無しさん
2007/05/14(月) 17:55:240844デフォルトの名無しさん
2007/05/14(月) 18:02:230845デフォルトの名無しさん
2007/05/14(月) 18:16:460846デフォルトの名無しさん
2007/05/14(月) 21:04:580847デフォルトの名無しさん
2007/05/14(月) 21:06:33開発を始めたのは 一時の気の迷い か 魔が差した って感じ?
0848デフォルトの名無しさん
2007/05/14(月) 21:12:54OCaml厨の皆さん、お疲れ様でした。w
0849デフォルトの名無しさん
2007/05/14(月) 21:16:38言語仕様的に、使いにくい。
OCamlの方が副作用がある分使いやすかった。
0850デフォルトの名無しさん
2007/05/14(月) 21:42:15そうすっよね!?
なんちゅうか、道筋が一本しかない感じがCと違うっつぅか、
なんちゅうぁ、そこがいいんすよね。
不器用なのか糞真面目なのか、複数名で開発する場合の
保守のし易さつぅか、どう考えてもOCamlでしょ?
って感じですよねぇ。
0851デフォルトの名無しさん
2007/05/14(月) 21:45:130852デフォルトの名無しさん
2007/05/14(月) 22:12:320853デフォルトの名無しさん
2007/05/14(月) 22:14:200854デフォルトの名無しさん
2007/05/14(月) 22:21:580855デフォルトの名無しさん
2007/05/14(月) 22:50:26つかMLもう来ないのかよ(´・ω・`)
0856デフォルトの名無しさん
2007/05/14(月) 23:38:01でもC#の中に型推論を組み込むとかいってるし、
F#のほうは途中でぽしゃるような気がします。
0857デフォルトの名無しさん
2007/05/16(水) 03:49:26その事実を踏まえれば途中でぽしゃるという表現がそもそもおかしい
Visual Studioに同梱されることを目指して作ってる訳ではなかろう
0858デフォルトの名無しさん
2007/05/16(水) 03:58:45一連の流れからVSシリーズに載ることなくと言う期待への裏切りがポシャることを指している事は明らかなんだからそこまで厳密に指摘するのは酷だろう。
0859デフォルトの名無しさん
2007/05/16(水) 14:28:29とりあえず落ち着けw
0860デフォルトの名無しさん
2007/05/16(水) 16:02:350861デフォルトの名無しさん
2007/05/17(木) 03:49:360862デフォルトの名無しさん
2007/05/17(木) 07:33:33これの List.init を使えばいいんじゃね
0863デフォルトの名無しさん
2007/05/17(木) 19:36:090864デフォルトの名無しさん
2007/05/18(金) 12:40:36そのくらいなら、自分で作ってmy utilitiesとしてつかえばいいじゃない。
ocamlでは作成が難しいのか?
0865デフォルトの名無しさん
2007/05/18(金) 21:43:440866デフォルトの名無しさん
2007/05/19(土) 00:17:12メジャーバージョンアップということ忘れてた
0867デフォルトの名無しさん
2007/05/19(土) 01:18:57インプリメントさせられる。その文法は "val virtual v:t"
* 事前的にバイトコードコンパイルプログラムの為だけに可能なつかまえへん例外の
バックトレースのスタックのプリントはネイティブコードにもサポートさせました。
(32/64bitのIntel/AMD & PPC)
* 新ポート:Mac OS X , PPC 74bit, PSDKツールチェインを使っとるMS Windows
64bit (x64)、VS2005 ツールチェインを使っとる MS Windows 32bit
* Camlp4プレプロセッサは部分的に再装備されて、新しいcamlp4、文法拡張の為のよ
りモジュラーなAPIに提供してる。(サードパーティの文法拡張を利用してるユーザー
はこれらの拡張が新しいAPIにポートされるまで0caml 3.09に留まる事を望むかもし
れへん。)
* 新しい試みのツール、"ocamlbuild" : OCamlアプリやライブラリを自動的に作るコン
パイルマネージャ。ドラフト文章を見ろや!ゴラッ
だそうです。
0868デフォルトの名無しさん
2007/05/19(土) 22:31:06一見機械翻訳のように見えて、実は妙に味のある訳文乙。
0869デフォルトの名無しさん
2007/05/20(日) 22:53:48もう、NJ版は使う気になれないわ
0870デフォルトの名無しさん
2007/05/23(水) 22:39:140871デフォルトの名無しさん
2007/05/23(水) 22:47:34web情報と比べて、書籍として買うだけの価値があるかどうか。
0872デフォルトの名無しさん
2007/05/24(木) 00:26:55ocamlはどうだろね。
0873デフォルトの名無しさん
2007/05/24(木) 00:36:440874デフォルトの名無しさん
2007/05/24(木) 00:40:29大学生が書いてんのか、このシリーズ
0875デフォルトの名無しさん
2007/05/24(木) 05:38:14「目次からもわかりますが、基本と実用のバランスが取れていて、
すごく良い感じです。」
ttp://d.hatena.ne.jp/sumii/20070523/p2
0876デフォルトの名無しさん
2007/05/24(木) 06:56:410877デフォルトの名無しさん
2007/05/24(木) 07:52:37ttp://www.amazon.com/Foundations-F-Robert-Pickering/dp/1590597575/
ttp://www.amazon.com/Expert-F-Don-Syme/dp/1590598504/
0878デフォルトの名無しさん
2007/05/26(土) 00:48:36http://blog.livedoor.jp/dankogai/archives/50838208.html
0879デフォルトの名無しさん
2007/05/26(土) 16:12:380880デフォルトの名無しさん
2007/05/26(土) 18:11:290881デフォルトの名無しさん
2007/05/26(土) 21:53:19入門Ocaml ... 実践的!?
かなり色分けがはっきりしているね。
Ocaml用に発売された最近の2冊は
0882デフォルトの名無しさん
2007/05/27(日) 18:04:25ろくでないかどうかしらないけど、立ち読みで確認したら、Ocaml開発
関係者のアドバイスも得てるみたいだね。名古屋でOcamlがはやってる
のはこの人の努力の結果なのだろうかな???
確かに、874のように経歴などでしか判断出来ないとどうしても、信頼
出来ないと思われがちだし、そんな人の方が多いし、初心者でいい本か
どうかなんてその辺からしか判断出来ないもんな。率直に言って、監修
になんでその人の名前を使わせてもらわなかったんだろうと思ったです。
0883デフォルトの名無しさん
2007/05/27(日) 18:07:42その辺は弾さんと意見は同じ。
0884デフォルトの名無しさん
2007/05/27(日) 19:58:23言っちゃ悪いけど、言語の性格としては古いんじゃない?
0885デフォルトの名無しさん
2007/05/27(日) 20:01:460886デフォルトの名無しさん
2007/05/27(日) 20:03:110887デフォルトの名無しさん
2007/05/27(日) 20:37:52雑食が一番。
0888デフォルトの名無しさん
2007/05/27(日) 21:16:060889デフォルトの名無しさん
2007/05/28(月) 10:39:17HaskellやSMLは気にならないんだが
0890デフォルトの名無しさん
2007/05/28(月) 17:18:410891デフォルトの名無しさん
2007/05/28(月) 20:41:04使えるようになったの?
おいらがさわったときは漢字1文字がリストの3サイズにされてたりしたんだけど。
バージョンいくつからいけるようになったん?
0892デフォルトの名無しさん
2007/05/28(月) 23:34:51GHCは6.6からUnicodeなソースコードを読み込むようになった。
だけど、IOライブラリが対応しきれて無くて、
Unicodeな文字列を表示しようとしても、各文字の1バイト分ずつしか表示されない。
0893デフォルトの名無しさん
2007/05/29(火) 00:18:17俺もそう思う。でも OCaml が一番処理系の使い勝手が良さそうなんだよね。
Moscow ML って確か Caml の VM からの派生だったと思うけど、OCaml
処理系から派生した SML 処理系があったら良いな。
0894デフォルトの名無しさん
2007/06/02(土) 01:48:16そうなったらOCamlとJAVAは駆逐されるね
0895デフォルトの名無しさん
2007/06/02(土) 02:00:140896デフォルトの名無しさん
2007/06/02(土) 18:02:24(int n) => n > 0;
0897デフォルトの名無しさん
2007/06/02(土) 18:04:55var x = new { FamilyName = "糸色", FirstName="望"};
Console.Write("{0}\n", x.FamilyName, x.FirstName);
0898デフォルトの名無しさん
2007/06/02(土) 18:59:20型宣言とごっちゃに書かなくちゃいけないなんてきもすぎ
0899デフォルトの名無しさん
2007/06/02(土) 19:20:310900デフォルトの名無しさん
2007/06/02(土) 19:30:08高度なレスをお願いします
0901デフォルトの名無しさん
2007/06/02(土) 20:13:27n => n + 1
書かなくても問題無い
0902デフォルトの名無しさん
2007/06/02(土) 22:22:500903デフォルトの名無しさん
2007/06/02(土) 22:25:03まだM$謹製の F# のほうがネタにしやすい
0904デフォルトの名無しさん
2007/06/02(土) 23:02:020905デフォルトの名無しさん
2007/06/02(土) 23:58:12C#のようなメジャー言語がMLに歩み寄っていることの方がニュースバリューがある。
0906デフォルトの名無しさん
2007/06/03(日) 00:29:01別にマイナー/メジャーは関係ない。
有用と思われる特徴がある言語でどういう事ができるのか検証したりするとおもしろいよ。
0907デフォルトの名無しさん
2007/06/03(日) 16:54:16そしてOCamlはその役目を終えるだった
ありがとうOCaml
そしてさようなら
0908デフォルトの名無しさん
2007/06/03(日) 17:00:59OCaml は無くなっても良いけど、きちんとした代わりが欲しいよ
0909デフォルトの名無しさん
2007/06/03(日) 17:18:01君のいう有望な言語を教えてほしいw
0910デフォルトの名無しさん
2007/06/03(日) 18:57:43無いから困ってるんだけどね。
0911デフォルトの名無しさん
2007/06/03(日) 19:47:36JavaやC++ではオブジェクト指向やらUMLやらいろんな研究がされてきたけど、
関数型ではそういう積み重ねがまだまだ少ない。
これからに期待だね。
0912デフォルトの名無しさん
2007/06/03(日) 20:43:35一生非生産的な言語比較でもしてれば。別にありがくもないし、さようなら。消えて。
0913デフォルトの名無しさん
2007/06/03(日) 22:13:330914デフォルトの名無しさん
2007/06/03(日) 22:22:550915デフォルトの名無しさん
2007/06/03(日) 22:28:100916デフォルトの名無しさん
2007/06/04(月) 00:40:08田舎町の、40人程度の小さな会社。
20代前半の女は私だけで(そもそも女が私含め3人しかいない)最初はみんな優しかったけど、
日が経つにつれ私が仕事ができなくてどんくさいヲタ系喪女だとわかるとみんな掌を返すように冷たくなり
職場でも孤立して寂しい思いをしていた。
ある日、私が一人でバス停までトボトボ帰り道を歩いていると、同じ職場の3歳年上の技術官の人が声をかけてきた
背が高くて細身。少し頼りない感じの人だけど男と2人きりで話した事がない私は顔を真っ赤にして震えry
彼「○○(私)さん。今、帰り?」
私「は、ははははhい、、い、今kえる途中です!!!!!」
彼「仕事は慣れた?」
私「いいいいいいいいいいいえ、と、、、とんでもないです!!」
そんな感じで数日間オドオドしながら彼と一緒に帰った。さりげなくメアドも聞かれた・・・
ある日、
彼「○○さんって漫画とか好きだったりする?」
私「(興奮して)dふゅぎうjpk@pだだだだ大好きです!!!!」
彼「マジ?オタクだったりする?これから一緒に食事いかない?もっと話そうよ!」
それから彼のアパートまでいき、車に乗せてもらってヲタトークで盛り上がりながらお食事
家に帰ったら「今日は楽しかったですねーオフの日にまた何処か遊びに行きません?(^0^)」のメールが
やばい!!20で処女、友達いない、デブス、キモオタの四重苦なのにここ1週間に若い男と初めてメールの交換して、車にのっけてもらって
さらにオフの日に遊ぶ約束までしちゃったよ
今ならしねる。きみのためなら死ねる
あああああああ妄想が止まらない
0917デフォルトの名無しさん
2007/06/07(木) 20:11:510918デフォルトの名無しさん
2007/06/07(木) 20:53:460919デフォルトの名無しさん
2007/06/08(金) 01:10:500920デフォルトの名無しさん
2007/06/08(金) 08:07:38どのあたりを特に勉強すればよいのだろうか。
0921デフォルトの名無しさん
2007/06/08(金) 22:18:37ナンというよりも、床の間に飾られてるうちにカチカチに干からびた正月の鏡餅。
0922デフォルトの名無しさん
2007/06/10(日) 10:04:35砕いてから油で揚げたら旨いんだぞ
0923デフォルトの名無しさん
2007/06/16(土) 07:56:43ttp://alain.frisch.fr/natdynlink.html
来ましたね
0924デフォルトの名無しさん
2007/06/17(日) 17:53:50type-preservingて日本語でどう訳せばいい?
0925デフォルトの名無しさん
2007/06/17(日) 20:05:570926デフォルトの名無しさん
2007/06/17(日) 21:39:17型保存?
0927デフォルトの名無しさん
2007/06/17(日) 21:47:30質問に質問で返すのはやめてください
0928デフォルトの名無しさん
2007/06/18(月) 05:51:040929デフォルトの名無しさん
2007/06/18(月) 08:12:30だから「お願い」しています。
0930デフォルトの名無しさん
2007/06/18(月) 23:55:45OCamlで書いたプラグインを受け付けるようなプログラム書けるようになるのかな?
0931デフォルトの名無しさん
2007/06/21(木) 23:05:24オマケでnative の toplevel も入ってるらしいね
それと、dynlinkモジュールってライブラリファイルにリンクできないんだけど
なんでかな
実行ファイルにはリンクできるんだけど
0932デフォルトの名無しさん
2007/07/01(日) 22:55:260933デフォルトの名無しさん
2007/07/02(月) 21:40:420934デフォルトの名無しさん
2007/07/02(月) 23:50:18List.fold_left f a [b1; ...; bn] is f (... (f (f a b1) b2) ...) bn
hold_leftは、初期値とリストの先頭要素がfの呼び出し引数になる。
だから、aとb1をくっつける順番に引数が並ぶ。
List.fold_right f [a1; ...; an] b is f a1 (f a2 (... (f an b) ...))
hold_rightは、リストの最後の要素と初期値がfの呼び出し引数になる。
だから、anとbをくっつける順番に引数が並ぶ。
...まぁ単なる私の想像だけど。
0935デフォルトの名無しさん
2007/07/04(水) 01:07:41手書きで一個一個ノートに書いて展開してみたら良くわかりました
0936デフォルトの名無しさん
2007/07/04(水) 02:28:130937デフォルトの名無しさん
2007/07/05(木) 02:19:08ttp://www.pllab.riec.tohoku.ac.jp/smlsharp/ja/?Download
ttp://www.pllab.riec.tohoku.ac.jp/smlsharp/ja/?Contact
0938デフォルトの名無しさん
2007/07/07(土) 15:23:46Ocaml でリストのシャッフルがしたい(要素をランダムに入れ替えたい)のですが、どんな書き方があるでしょうか?
とりあえず Perl での Schwartz 変換風に書いてみたのが↓ですが、こんな書き方もある、とかありましたらお願いします。
let shuffle lst =
List.map (fun (_, x) -> x)
(List.sort (fun (x, _) (y, _) -> compare x y)
(List.map (fun x -> ((Random.float 1.0), x)) lst));;
0939デフォルトの名無しさん
2007/07/07(土) 17:37:030940デフォルトの名無しさん
2007/07/07(土) 19:55:02>712-717
0941デフォルトの名無しさん
2007/07/11(水) 15:59:38ひとりで書くときはいいけど、そうじゃないときは
string 2つ3つ受け取るような関数ばんばん書いたらまずいよね
0942デフォルトの名無しさん
2007/07/17(火) 00:20:33それも仕方がなくである。
参考書を渡されて読んでみたが、
「なにこれ?玩具みたいな言語だな。へんてこな仕様だし。」
って思ってた。全然、必然性を感じなかったしやる気も出なかった。
でも、課題があるので仕方なくやっていた。
周りはやる気があって課題をこなしていくのに俺はまったくやる気がなかった。
だけど約1年後、
急に目覚めたのである。
うわ・・・なにこれ。パターンマッチとかポリモフィズムとか・・・特に型推論。
コンパイルが通ればほぼ動くではないか、手続き型で良く見る「セグメンテーションフォール」
が出ない・・・。
しかも何よりもうれしいのが、処理を見て関数が何をしているかではなく、
関数そのものが処理である、という事実に喜びがこみ上げてきた。
今では、現場でML言語は使われるはずもなく、JavaやC++で仕事してるが、
この時の経験は活かされてる実感がある。
世の中では必要にでも迫られなければ、ML言語などというマイナー言語を
体験する人の数も少ないのではないか。
そんな中、仕方なくから始まったものの、この言語に出会えた事を非常にうれしく思う。
ありが十々。
0943デフォルトの名無しさん
2007/07/17(火) 00:23:54○必要性
×セグメンテーションフォール
○セグメンテーションフォールト
0944デフォルトの名無しさん
2007/07/17(火) 00:35:51お仕事で揉まれるうちに、彼らが忌み嫌う副作用のほうに
計算の本質があることが分かってくるものじゃ
0945デフォルトの名無しさん
2007/07/17(火) 02:52:32計算の本質は副作用じゃなくて、副作用は我々とのインターフェースにすぎないよ。
0946デフォルトの名無しさん
2007/07/17(火) 07:59:560947デフォルトの名無しさん
2007/07/17(火) 09:59:33某コロシアム?でやたら使ってる人いるけどなんか微妙な気がするんだよね。
0948デフォルトの名無しさん
2007/07/17(火) 12:06:14それは実用プログラムを作りたい人の話じゃないの?
計算可能性とか研究してるからそういうのにあんまり興味ない。
0949デフォルトの名無しさん
2007/07/17(火) 22:10:02それが本質かどうかは知らんけどね。
0950デフォルトの名無しさん
2007/07/18(水) 19:47:570951デフォルトの名無しさん
2007/07/19(木) 06:58:16.NETライブラリをばりばり使って書くと独自性がかすんで微妙に見えるかもしれないけど
言語自体はかなり野心的だと思うよ。
0952デフォルトの名無しさん
2007/07/20(金) 21:58:10>>951
今expert F#のドラフト読んでるけど確かに野心的。
でも配列系のデータ構造が
List,LazyList,Array,Seq,(IEnumerable?)...
と大量にあるのは頂けない。
0953デフォルトの名無しさん
2007/07/21(土) 01:11:25マイナー言語処理系で配列表現が1つだけとかだったら
不安でしかたないと思うけど。何が頂けないの?
あと、特に読んでないけど何が野心的なの?
0954デフォルトの名無しさん
2007/07/21(土) 16:44:02色々なテクニックを知ることがでけてよかった
スレのないようにかぶるトピックもあったから
筆者はこのスレに出没してるのかな?
とりあえずいい本だった、感謝。
0955デフォルトの名無しさん
2007/07/21(土) 20:18:44>マイナー言語処理系で配列表現が1つだけとかだったら
不安でしかたないと思うけど。何が頂けないの?
そういわれればそうかもしれない。でも、なんか使いづらいんだよ。
List,LazyListはいいとしてArrayとSeqは正直違いがわからない。
知っていたら教えてください。(マニュアル嫁になるのはわかるが。)
>あと、特に読んでないけど何が野心的なの?
そうだなぁ。印象でそう感じた、じゃ答えになってないな。
OCamlの使いづらい点を改善してもっと使いやすくしてやろう、
という感じを受ける。
e.g. intもfloatで演算子(+とか)を統一,いちいち分けなくて良い。
リストじゃないけど内包表記が使える。Active pattern。
答えになっているだろうか?まだ抽象的?
0956デフォルトの名無しさん
2007/07/21(土) 20:45:460957デフォルトの名無しさん
2007/07/21(土) 22:32:26浅井本もいいぞ。両方おすすめ
0958デフォルトの名無しさん
2007/07/21(土) 23:01:520959デフォルトの名無しさん
2007/07/24(火) 18:27:580960デフォルトの名無しさん
2007/07/28(土) 20:07:00http://ocamldt.free.fr/spip.php?article3
試した人いる?
0961名無しさん@そうだ選挙に行こう
2007/07/29(日) 00:45:11スルーされるんだよ、間違いない。
0962名無しさん@そうだ選挙に行こう
2007/07/29(日) 00:53:100963名無しさん@そうだ選挙に行こう
2007/07/29(日) 06:14:250964名無しさん@そうだ選挙に行こう
2007/07/29(日) 09:18:150965名無しさん@そうだ選挙に行こう
2007/07/29(日) 09:18:38使ってみたが、Macでは動かず。こっちの方が断然良い:
OcaIDE
ttp://ocaml.eclipse.ortsa.com:8480/ocaide/screenshots.html
構文エラーが下線で即座に指摘されるし、型情報をポップアップで表示してくれるし、コード補完も効くし、モジュールを修正すると勝手にインタフェースも修正してくれるし、トップレベルやocamlbrowserもついてくる。
JDTとなんら遜色はない。
不満をいえばocamlbuildやcamlp4へのオプションを与えたり、findlibを使ったパッケージのリンクとかそういうのがないとプロジェクトを共有する時などのポータビリティに欠ける。
つーかこの程度で実用的とかほざく奴ってどんな原始人だ?
0966名無しさん@そうだ選挙に行こう
2007/07/29(日) 12:02:13>コード補完やオブジェクトブラウザ,GUIエディタを備えたIDEって興奮しません?
元Windowsプログラマーとしてはそれはあたりまえだったから興奮しない
0967名無しさん@そうだ選挙に行こう
2007/07/29(日) 12:21:360968名無しさん@そうだ選挙に行こう
2007/07/29(日) 13:13:320969名無しさん@そうだ選挙に行こう
2007/07/29(日) 13:17:54確かにw
UNIXプログラマは、ミネラルウォーターと、IDEは不要と来ている
0970名無しさん@そうだ選挙に行こう
2007/07/29(日) 16:16:26おっちょこちょいの自分には。
コード補完、文法ミスを判定してくれるだけでも開発効率×2だよ。
0971名無しさん@そうだ選挙に行こう
2007/07/29(日) 16:51:010972名無しさん@そうだ選挙に行こう
2007/07/29(日) 18:11:28emacsでいいんじゃない
0973デフォルトの名無しさん
2007/07/31(火) 13:19:540974デフォルトの名無しさん
2007/07/31(火) 20:14:13http://uproda11.2ch-library.com/src/1119129.jpg
Ocamlのバイトコードインタプリタ実行の設定箇所はまだ空白になってた。
けっこういいかもっておもったり。
0975デフォルトの名無しさん
2007/07/31(火) 20:21:21アウトラインがあるのはけっこういいかも。
MLってletでネストしまくって訳わからなくなるときあるけど、
そういう時にね。
0976デフォルトの名無しさん
2007/07/31(火) 20:45:050977デフォルトの名無しさん
2007/07/31(火) 22:29:51日本語つかえないの?
0978デフォルトの名無しさん
2007/07/31(火) 22:41:41どこらへんが?
0979デフォルトの名無しさん
2007/07/31(火) 23:51:02>>977はコメントが文字化けしてる点を指摘してるんじゃない?
EUCだったとか
0980デフォルトの名無しさん
2007/08/03(金) 17:47:400981デフォルトの名無しさん
2007/08/03(金) 21:10:020982デフォルトの名無しさん
2007/08/03(金) 21:41:370983デフォルトの名無しさん
2007/08/03(金) 22:37:240984デフォルトの名無しさん
2007/08/03(金) 23:30:260985デフォルトの名無しさん
2007/08/03(金) 23:44:46どう書く?orgのお題から適当に見繕ってチャレンジしてみるとかどうよ?
ttp://ja.doukaku.org/challenge/
C#とOCamlの既存解答を見比べることもできるし
なんか参考になるんじゃないかね?
0986デフォルトの名無しさん
2007/08/04(土) 07:48:15F#のおいしいところはC# 3.0に取り入れられるから
将来的にはC#一本でも問題ないかと。
C# 2.0にも一部取り入れられていて、
たとえば無名delegateでブロック渡し(クロージャ)をしたり、
継続渡しなんかを意識的に使うと便利な面がある。
ttp://d.hatena.ne.jp/yaneurao/20070207
0987デフォルトの名無しさん
2007/08/04(土) 08:07:210988デフォルトの名無しさん
2007/08/04(土) 23:01:44要はそれをりかいしているひとが少ないってことなんだろうね
0989デフォルトの名無しさん
2007/08/04(土) 23:03:26副作用をできるだけ排除する癖がつくから、
デバッグの手間が減るって点だっしょ。
0990デフォルトの名無しさん
2007/08/04(土) 23:33:19簡潔にまとめられないのが怪しいな・・・的な態度を取られることもあるね
一言でまとめられないと理解してくれない人に説明する気もおきないなー
0991デフォルトの名無しさん
2007/08/05(日) 00:39:430992デフォルトの名無しさん
2007/08/05(日) 02:00:34説明して理解してくれる程の人ならば、既に使い始めているということ。
0993デフォルトの名無しさん
2007/08/05(日) 02:07:58禅問答みたいな、分かれば分かる的な説明よりは断然良いと思うけどなあ。
まあ、けむに巻いた方が自己満足は大きいのかもしれんけど。
0994デフォルトの名無しさん
2007/08/05(日) 03:05:13void hoge() const ←これ
クロージャの方が関数型ならではの便利さを実感できる希ガス
boostでlambdaとか問題外だし
0995デフォルトの名無しさん
2007/08/05(日) 03:19:340996デフォルトの名無しさん
2007/08/05(日) 03:23:260997デフォルトの名無しさん
2007/08/05(日) 06:40:400998デフォルトの名無しさん
2007/08/05(日) 06:41:530999デフォルトの名無しさん
2007/08/05(日) 06:44:591000デフォルトの名無しさん
2007/08/05(日) 08:58:59まあ、C++ は参照透明な言語だからね。
ttp://d.hatena.ne.jp/w_o/20061008
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。