[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/10 00:21 / Filesize : 224 KB / Number-of Response : 956
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

関数型言語ML(SML, OCaml, etc.), Part 5



1 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 14:49:54 ]
関数型言語MLについて語るスレッドです。

MLは、確固とした理論的背景を持つ言語でありながら、
現実的なソフトの開発にも使用できる実用性を備えた言語です。
また、プログラミングの初心者が最初に学習する言語としても優れています。

総本山
Standard ML www.smlnj.org/
Objective Caml caml.inria.fr/ocaml/

前スレ
関数型言語ML(SML, OCaml, etc.), Part 4
pc11.2ch.net/test/read.cgi/tech/1133003340/

182 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 17:37:52 ]
>>181
おとなしくシミロン嫁

183 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 17:40:00 ]
グロタンのEGA/SGA嫁

184 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 17:41:40 ]
知ってどしたいん?ん?

185 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 17:47:24 ]
シミロンとは・・・

圏論による論理学―高階論理とトポス
清水 義夫

www.amazon.co.jp/o/ASIN/4130120573/

186 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 18:09:02 ]
>>182
シミロン読んでるんですが、高階論理をトポスに対応させて
いるところを Curry-Howard 同型と考えていいわけですか?


187 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 18:26:11 ]
>>186
まあそうなんだけど、関数に対応するものがトポスの射になってる。

普通の集合論では、「はじめに一者あり」である。存在論的な形になっていて、その一者(実は、空)から、すべての存在が生成される。
では、Mac Lane が指摘した、論理学ではどうなるか。

ところが関数型の場合、「はじめに働きあり」である。なんじゃそりゃ、と思うかもしれない。
普通の集合論では、関数は、集合の一種(つまり、グラフ)として定義される。
でもこちらは、逆に、関数から集合を定義しようということなのだ。

この関数概念を一般化したのがシミロンのトポスの射。

188 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 18:31:40 ]
Grothendieckは位相空間 X より X 上 の層全体のなす圏(トポスになる) がより本質的だと考えた。
彼はこの考えを、エタールコホモロジーのアイデアとともに得た。

189 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 18:34:39 ]
>>187
解説ありがとうございます。
ちょっと外出してきますのでまたのちほど。
すみませんです。

190 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 18:36:07 ]
シミロンでやってるのはGrothendieckのオリジナルとは違って、
Kripke-Joyalの意味論での手続きによって集合論的論理式をトポスの対象と射についての言明として解釈したもの。



191 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 18:47:05 ]
実数の体系の持つ超越的な性格は集合論の初期から様々な数学者の嫌悪の的となった。
実数を定めるのに便利な集合論的定式化はやがて多くの数学者に受け入れられるようになったが、
20世紀初めに論理学者のブラウワーは直観主義とよばれる、具体的に構成できるようなものだけを認める論理の体系をつくった。
彼はそこで実数について通常の数学におけるものとは著しく異なった結論を導きだせることを示した。
これにはKripke-Joyalの層の意味論によって現代的な解釈が与えられる。

シミロンのやってることを実行するとこんな風に実数の扱いなどがもっとブラウワー的に出来るようになります。

192 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 18:49:58 ]
ただしCoqではKripke-Joyalの意味論は扱えないのでこのスレの趣旨からは外れますね。
つづきは数学板で質問してください。

193 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 19:10:59 ]
λ式は、どのプログラマにとっても役立つ新たなツールです。最近ではVisual Basic 2008にも実装されました。

元々、Visual Basic 2008 (以前のコード名は "Orcas") にλ式が追加されたのは 、LINQ (Language Integrated Queries) をサポートするためです。
これは、Visual Basic でのデータ プログラミングを可能にするものです。

λ式を使用すると、プログラムの柔軟性が向上することがわかります。
λ式は、関数内で定義される呼び出し可能なエンティティであり、何の制約もなく利用でき、
したがって、λ式を関数から返したり他の関数に渡したりできるからです。

λ計算(lambda calculus)は、理論計算機科学や数理論理学における、関数の定義と実行を抽象化した計算体系であるλ算法とも言う。
関数を文字λ)を使った式によって表記する。アロンゾ・チャーチとスティーヴン・コール・クリーネによって1930年代に考案されたものです。
1936年にチャーチはλ計算を用いて一階述語論理の決定可能性問題を否定的に解いた。
λ計算は「計算可能な関数」とはなにかを定義するために用いられることもある。

λ計算は1つの変換規則(変数置換)と1つの関数定義規則のみを持つ、最小の(ユニバーサルな)プログラミング言語であるということもできる。
ここでいう「ユニバーサルな」とは、全ての計算可能な関数が表現でき正しく評価されるという意味である。
これは、λ計算がチューリングマシンと等価な数理モデルであることを意味している。
チューリングマシンがハードウェア的なモデル化であるのに対し、λ計算はよりソフトウェア的なアプローチをとっている。

λ計算は計算の意味論や型理論など、計算機科学のいろいろなところで使われており、特にLisp、ML、Haskellといった関数型プログラミング言語の理論的基盤として、
その誕生に大きな役割を果たしたが、とうとうVisual Basicにまで搭載されたことで、今後、その重要性は益々増大するだろう。

194 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 20:43:42 ]
いま帰りました。
つまり、空集合から始まる現代集合論はもう
終わりの時代を迎えた、ということですか?
シミロンを読んでいて、ラムダ項もある種の
射に対応するのを知り目から鱗が落ちました。



195 名前:デフォルトの名無しさん mailto:sage [2008/01/01(火) 21:53:13 ]
>>192
そうですね。数学板にいきます。

196 名前:デフォルトの名無しさん mailto:sage [2008/01/02(水) 22:55:53 ]
Lisp ⇒ Common Lisp
Lisp ⇒ Scheme
Lisp ⇒ ML
┌―――┘

ML ⇒ Miranda ⇒ Haskell ⇒ Erlang
ML ⇒ Miranda ⇒ Clean ⇒ Concurrent Clean
ML ⇒ SML
ML ⇒ CAML ⇒ OCAML ⇒ (そろそろこないかなぁ?)

197 名前:デフォルトの名無しさん mailto:sage [2008/01/02(水) 23:38:37 ]
Erlangは違くない?

198 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 04:13:52 ]
ついついOCamlという字面を見ると『岡村』って読んじゃう。
SMLをSmileって読んじゃうみたいに。でも頭の中はSMのことでいっぱい。
EclipseやElispをエロリスプとか。

199 名前:デフォルトの名無しさん [2008/01/03(木) 14:03:05 ]
>>196
Haskell→Erlangはおかしいでしょ

200 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 14:18:11 ]
Clean ⇒ Concurrent Clean ⇒ Clean



201 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 23:11:56 ]
OCamler ⇒ 岡村さん
SMLer ⇒ 須村さん
Schemer ⇒ 隙間さん

202 名前:デフォルトの名無しさん mailto:sage [2008/01/03(木) 23:27:49 ]
数学わかる人がいなくなると急にレベル下がっちゃうね。

203 名前:デフォルトの名無しさん [2008/01/04(金) 01:21:28 ]
Visual Basicやりたい放題なんだな。
VB.NET化であれだけ振り回した後だともう既存のユーザの移行コストとか考えないでいい空気なんだろうか。


204 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 10:14:36 ]
別にラムダ式を入れるのに後方互換を犠牲にする必要はないだろ

205 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 17:31:47 ]
COMつかい放題なのに文法が残念だからカオスでOK

206 名前:デフォルトの名無しさん mailto:sage [2008/01/04(金) 22:50:49 ]
VBはスレチだから置いとくとして、F#は何度かアップデートされたら化ける可能性はある。
OCAMLが完全に止まってるだけにちょっと気になる。

207 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 00:06:15 ]
q-lang.sourceforge.net/
これなんか面白そう

208 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 00:25:51 ]
>>207
Q言語って音響・映像に特化してるのかな?
これで作られた "Q+Faust+Pd" はかなり大規模な感じ。
関数型の特性を生かしてフィルターとかが多いみたいですね。

209 名前:デフォルトの名無しさん mailto:sage [2008/01/05(土) 22:59:09 ]
>>206
言語そのものの出来より、MSが力入れるかどうかだな。

210 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 01:19:39 ]
>>209
現在のF#はfunctorが使えないからちょっとね。
でも今後のアップデートで何を追加するのかロードマップを示してくれると興味も湧くんだけどなぁ。
MSが力を入れてくれると期待したい。



211 名前:デフォルトの名無しさん [2008/01/06(日) 23:46:06 ]
ttp://www.infoq.com/articles/pickering-fsharp-workflow
ここ見た感じだと結構ちがう言語に見える
yield とかあるんだね

212 名前:デフォルトの名無しさん mailto:sage [2008/01/06(日) 23:58:10 ]
>>211
F#の記事ですね。
記者は手続き型でしか考えられない人かな?
forループ連発が意図的なのかよくわからなけど、あまり良い例じゃないなぁ。

213 名前:デフォルトの名無しさん [2008/01/07(月) 00:15:51 ]
この記事のforは全部F#独自のシーケンス内包表記でしょ。
書いた人もFoundations of F#の人だし。

214 名前:デフォルトの名無しさん mailto:sage [2008/01/07(月) 00:26:33 ]
>>213
for使うと再帰より速度が出るとか?

215 名前:デフォルトの名無しさん [2008/01/12(土) 10:03:20 ]
3.10.1でたね。プレステ3でビルドできるみたい?

216 名前:デフォルトの名無しさん [2008/01/12(土) 18:38:12 ]
>>215
何の?


217 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 02:37:14 ]
caml.inria.fr/ocaml/release.en.html

The most recent version of Objective Caml is 3.10.1. It was released on 2008-01-11.

Some of the highlights in release 3.10 are:
* Instance variables in classes can be declared virtual and
implemented in subclasses. Syntax is val virtual v : t.
* Printing of stack backtraces on uncaught exceptions,
previously available only for bytecode-compiled programs,
is now supported for native-code programs as well.
(Supported on Intel/AMD and PPC, in 32 and 64 bits).
* New ports: MacOS X, PowerPC, 64 bits; Microsoft Windows 64 bits (x64)
using the Microsoft PSDK toolchain; Microsoft Windows 32 bits using the Visual Studio 2005 toolchain.
* The Camlp4 preprocessor was partially reimplemented and offers a new,
more modular API for syntax extensions.
(Users of third-party syntax extensions may wish to stay with OCaml 3.09 until these extensions are ported to the new API.)
* A new experimental tool, ocamlbuild:
a compilation manager that automates the building of OCaml applications and libraries. See the draft documentation.


218 名前:デフォルトの名無しさん mailto:sage [2008/01/13(日) 21:53:45 ]
流れをぶったぎっちゃうけれど、質問させてください
SML#のページにあるSMLFormatってcamlp4みたいなものなの?
説明見てもちょっと理解できなかったので…
サンプルも何か追加で入れないと動かないのもあるみたいなので使ったことある方とか居たら、どんなものか聞かせてください

219 名前:デフォルトの名無しさん [2008/01/13(日) 22:32:40 ]
使ったこと無いけど解説読むと普通のフォーマッタ/プリティプリンタじゃないかな。

220 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 21:14:36 ]
F#版Parsec
ttp://www.quanttec.com/fparsec/index.html

F#版STM
ttp://cs.hubfs.net/blogs/hell_is_other_languages/archive/2008/01/16/4565.aspx



221 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 22:41:00 ]
schemeのiotaみたいなのってocamlにないですかね

222 名前:デフォルトの名無しさん [2008/01/17(木) 08:21:32 ]
Arrayにはある。ListにはExtlibにある。

223 名前:デフォルトの名無しさん mailto:sage [2008/01/17(木) 23:14:49 ]
トン。

224 名前:デフォルトの名無しさん mailto:sage [2008/01/18(金) 00:08:30 ]
できたー。ライブラリインストールに手間取った;;
ExtList.List.init 100 ((+)1);;
結構タイプ量おおいな;;

225 名前:デフォルトの名無しさん [2008/01/18(金) 00:27:11 ]
Extlibは基本open ExtListとかして使うものだよ。
ListまでをopenしないのはOCaml流だと思ってあきらめるしかないけど。

226 名前:218 mailto:sage [2008/01/18(金) 22:06:57 ]
>219
遅くなってごめんなさい

ありがとう

227 名前:デフォルトの名無しさん mailto:sage [2008/01/21(月) 20:16:22 ]
>>225
遅くなったけど、ありがとう
ばっちり使わせてもらいます。

228 名前:デフォルトの名無しさん mailto:sage [2008/01/22(火) 17:31:49 ]
windows用のexeファイルを作りたいのですがどうすればいいですか?
VC++ expressインストールすればできますか?

229 名前:デフォルトの名無しさん [2008/01/23(水) 08:10:53 ]
同梱のドキュメントに書いてあるよ。

230 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 23:43:03 ]
同じint -> int = <fun>なのに、RandomではException: Invalid_argument "Random.int"がでます
○ExtLib.List.init 10 ((+)1);;
×ExtLib.List.init 10 Random.int;;
説明では、Invalid_argが出るのは初期値(↑だと10)が負の時とあるけど、これってもしかしてバグ?




231 名前:デフォルトの名無しさん mailto:sage [2008/01/23(水) 23:46:44 ]
↑無視してくださいRandom.int 0がエラーでした。

232 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 23:02:51 ]
次スレのタイトルを「関数型言語ML(SML, OCaml, F#, etc.), Part 6」として「【.NET】F#について語れ【OCAML】」スレを合流させれば過疎らなくて済むかねぇ。
ML系過疎り杉w

233 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 23:03:20 ]
たった今ハマりかけたのでちょっと書いとく。
Array.copyで新規作成されるのは一次元目の配列だけで、
二次元、三次元とかの値は前の値を差し続けてる。
まるごとコピーしたいときはその次元専用のcopyを作った方がいいみたい。


234 名前:デフォルトの名無しさん mailto:sage [2008/01/25(金) 03:01:51 ]
228じゃないけどうまくいかないや。
masm32もVC++も入れたしmasmのINCLUDE、LIB、PATHも通したのに。

一応Visual StudioのVCのPATH入れたり
masm32のbinにcl.exeやmspdb80.dll入れてみたりしたけど駄目だった。
う〜ん、masmとVC++アンインストしようかしらw

235 名前:デフォルトの名無しさん [2008/01/26(土) 00:34:24 ]
エスパー能力を期待しないでくれよ

236 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 12:53:22 ]
すみません,勉強し始めたばかりで,わからないことがあります.
指定した数だけランダムな数字を出力したいです.
やってみたところ再帰が止まらないです...
どうして>.<b

# let rec print_random n =
if n = 0 then 2 else
begin
print_int (Random.int 2);
print_random n-1;
end;;

237 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 12:59:31 ]
>print_random n-1;
これが(print_random n)-1;と解釈されるからだな
print_random (n-1);とすればよろし

238 名前:sage [2008/01/30(水) 14:49:02 ]
ocamlbuild はゴミ

あれで便利便利って言って喜んでる奴はまだロクなもん書いてない

さらなるゴミ p4 のビルドで必要なのがさらにゴミ
ゴミのおかげで make world の時間がもったいない


239 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 17:18:38 ]
>>237
ありがとうございます〜〜〜
少しずつ型チェックってなんのかわかってきました.いろいろ書いてみます!

let rec cntRandom n zeroCnt oneCnt=
if n = 0 then zeroCnt else
(
if ((Random.int 2) = 0) then
cntRandom (n-1) (zeroCnt+1) oneCnt else cntRandom (n-1) zeroCnt (oneCnt+1)
);;



240 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 21:00:52 ]
token listを受け取って整形式XMLなら(string,string) xmlを返すxml_of_tokensを作れ、という問題に
3日ぐらい挑んでいるのですが、わかりません。誰か助けて。

type token = PCDATA of string | Open of string | Close of string;;
type ('a,'b) xml = XLf of 'b option | XBr of 'a * ('a,'b) xml list;;

入力: [Open "a"; Open "b"; Close "b"; Open "c"; PCDATA "Hello"; Close "c"; Close "a"]
出力: XBr ("a", [XBr ("b", []); XBr ("c", [XBr ("Hello", [])])])

入力の型と出力の型が違うのでわけわかりません
閉じタグとか考えてると、スコープが足りないです。
スコップをください。




241 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 00:21:39 ]
>>240
全然深く考えてないけど,スタック使えばいいんじゃないの?

242 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 10:32:25 ]
>>240
PCDATAはXLfでなくて良いのか?

exception ParseException of string
let rec parse (xs : token list) (context : string list) (ks : ('a,'b) xml list list) : ('a,'b) xml =
 let add_child ks x =
  match ks with
  | [] -> raise (ParseException "internal error: add_child")
  | (k::ks1) -> (x::k)::ks1
 in
 match xs with
 | [] ->
  if context <> [] then
   raise (ParseException ("some tags are not closed:" ^ (String.concat "," context)))
  else
   hd (hd ks)
 | (PCDATA str)::xs1 ->
  if context = [] then
   raise (ParseException ("toplevel PCDATA:" ^ str))
  else
   parse xs1 context (add_child ks (XBr (str, [])))
 | (Open tag)::xs1 ->
  parse xs1 (tag::context) ([]::ks)
 | (Close tag)::xs1 ->
  if (hd context) <> tag then
   raise (ParseException ("close tag mismatch:" ^ tag ^ " appeared where " ^ (hd context) ^ " expected"))
  else
   parse xs1 (tl context) (add_child (tl ks) (XBr (tag, (rev (hd ks)))))
let run_parse xs = parse xs [] [[]]

243 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 22:14:54 ]
うおーありがとうございます!
(Open tag)::xs1の箇所で、ひとつ先読みする再帰になるのかと思って
ずっと考えてたけど、全然違った・・
あと、ご指摘のとおりPCDATAはXLfのほうが良さそうですね

上のadd_childみたいな関数が必要になるかどうかの判断って
自分には職人技の世界に思えるんですが
一般的なやり方みたいなのあるんですかね。

とりあえず、上記を参考に自分でも書けるよう頑張ってみます。


244 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 23:51:48 ]
ねぇねぇ、OCamlでオブジェクトを使わないって人いる?
そういう人ってレコードを拡張したい時どうしているの?




245 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 00:19:05 ]
OCamlのクラスって副作用ありますか?

246 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 00:54:00 ]
副作用ありのオブジェクトも作れますし、なしのも作れますよ。

副作用あり
# class point = object
val mutable x : int = 0
method set_x v = x <- v
end;;
class point : object val mutable x : int method set_x : int -> unit end

副作用なし
# class point' = object
val x : int = 0
method set_x v = {< x = v >}
end;;
class point' : object ('a) val x : int method set_x : int -> 'a end


247 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 02:49:12 ]
OCamlでlet _ = ... とlet () = ... 構文の違いがよくわかりません。
使い分けがあるのでしょうか?

248 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 21:32:35 ]
let _ =... と let () =... とでは、使える状況が違う。
前者は名前の束縛を省略しただけで右式がどんな型になっても構わないけど、
後者は右式がunit型にならないとダメ。
どちらも print_string のような副作用が目的の式によく使うけど、
私は戻り値が要らないという意味で、let _ =...で統一している。
これだと let _ = Thread.create f () とかでも対応できる。

249 名前:247 mailto:sage [2008/02/06(水) 23:43:09 ]
>>248
ありがとうございます。

# let () = true;;
Characters 9-13:
let () = true;;
^^^^
This expression has type bool but is here used with type unit

やってみたら確かにそうです。
悩んでいたのでとても参考になります。

250 名前:デフォルトの名無しさん [2008/02/07(木) 10:23:25 ]
俺は戻り値がunit じゃない状況を区別するために let () = を使ってる
let _ = は、 ignore @@ Unix.system "rm -rf hoge" とか



251 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 10:40:36 ]
labelglutを使っていて
GluMat.gluPerspective ~fovy:(45.0) ~aspect:(1.0) ~zNear:(0.1) ~zFar:(100.0)
って書いてもUnbound value GluMat.gluPerspectiveって言われてちゃう

wwwfun.kurims.kyoto-u.ac.jp/soft/lsl/lablgl.txt
www.opengl.org/sdk/docs/man/xhtml/gluPerspective.xml
を見て書いたのですがどこがいけないかわかりません>.<b




252 名前:デフォルトの名無しさん mailto:sage [2008/02/07(木) 23:12:43 ]
>>251
まさかライブラリの指定を忘れてるなんて落ちはないよな。
ocamlc -I +lablGL lablgl.cma lablglut.cma ...
という感じでコンパイルしなきゃいけないはずだけど?

253 名前:247 mailto:sage [2008/02/08(金) 02:21:31 ]
>>250
統一するか区別するかOCaml内のコードを調べてみます。
多いほうにしてみます。

254 名前:デフォルトの名無しさん mailto:sage [2008/02/08(金) 09:33:48 ]
>>252
大体原因がわかった
exampleにあった
GlMat.ortho ~x:(-1.0, 1.0) ~y:(-1.0, 1.0) ~z:(-1.0,1.0);
を調べてみたら
void glOrtho( GLdouble left,
GLdouble right,
GLdouble bottom,
GLdouble top,
GLdouble nearVal,
GLdouble farVal);
でなっていてGLの引数と違う名前になっていたのね

GluMat.perspective ~fovy:(45.0) ~aspect:(1.0) ~zNear:(0.1) ~zFar(100.0);
GluMat.perspective ~fovy:(45.0) ~aspect:(1.0) ~z(0.1, 100.0);
見たく試してみてもダメだったw

どっかに引数に関してマニュアルないわけ?

255 名前:デフォルトの名無しさん mailto:sage [2008/02/09(土) 21:25:54 ]
>> 254
.mli 見ろや:

val perspective : fovy:float -> aspect:float -> z:float * float -> unit


256 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 01:59:10 ]
cygwin 3.10で実行しています。

while true do
  print_string "debug1\n";
  ignore (Unix.recv sock buf 0 (String.length buf) []);
  print_string buf;
  print_string "debug2\n";
done;;
を実行したのですが、
print_string "debug1\n";
が実行されず、プログラムが停止して、動きません。
コンパイル時にエラーはありませんでした。
何がいけないのでしょうか?

257 名前:デフォルトの名無しさん [2008/02/14(木) 06:49:29 ]
>>256
システムに関係なく print_string は buffering されているので
flush stdout が必要。

デバッグには stderr に出力 + flush の prerr_endline をおすすめする。
次の pervasives.mli のコメントをよく読んでくれ:

val print_string : string -> unit
(** Print a string on standard output. *)
val print_endline : string -> unit
(** Print a string, followed by a newline character, on
standard output and flush standard output. *)
val prerr_endline : string -> unit
(** Print a string, followed by a newline character on standard error
and flush standard error. *)

こういう細かいことって日本語の O'Caml の本には書いてないのかな?


258 名前:デフォルトの名無しさん mailto:sage [2008/02/14(木) 20:34:46 ]
>257
ありがとうございます。
prerr_endlineを使用したところ、うまく動作するようになりました。

259 名前:デフォルトの名無しさん [2008/02/15(金) 16:42:11 ]
OCamlで共有ライブラリを作ったり、それと動的リンクするようなプログラムを作るには、
Makefileにどう書けばいい?

260 名前:デフォルトの名無しさん mailto:sage [2008/02/15(金) 17:01:35 ]
>>259
stublib のことなら ocaml のソースの otherlibs/graph などを参考に。
otherlibs/Makefile.shared を include してあるが、そこに大体書いてある。




261 名前:259 mailto:sage [2008/02/16(土) 16:35:26 ]
>260
ごめん、説明不足だった。

OCamlで書かれたライブラリがあって、それを自分で書いたOCamlのコードから使いたいんだけど、
ライブラリの方がLGPLなのでできれば静的リンクしたくないんだ。

262 名前:デフォルトの名無しさん [2008/02/16(土) 16:59:23 ]
>>261
3.10現在、無い。バイトコードだとstubを読みに行く方法があるけど。
OCamlのライブラリは多くの場合LGPLの例外事項が追加されていると思うんだけど、
そういうのはないの? 以下はsexplibの例。

As a special exception to the GNU Lesser General Public License, you
may link, statically or dynamically, a "work that uses the Library"
with a publicly distributed version of the Library to produce an
executable file containing portions of the Library, and distribute that
executable file under terms of your choice, without any of the additional
requirements listed in clause 6 of the GNU Lesser General Public License.


263 名前:259 mailto:sage [2008/02/16(土) 17:31:46 ]
>262
ありがとう!勉強になった。

調べてみたけど、例外事項は入ってないみたいだ。

ライブラリのメーリングリストを流し読みしたところ、
「オブジェクトファイルを添付すればいいだけなんだから別に問題なくね?」
という結論になった模様orz

まぁ実際そのとおりだから、そうすることにするよ。

264 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 01:27:40 ]
ttp://www.ocaml-tutorial.org/ja
なんかつながんね

265 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 01:47:54 ]
>>264
繋がるよ?

266 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 01:59:31 ]
オレは繋がらない。

267 名前:デフォルトの名無しさん mailto:sage [2008/02/17(日) 08:56:08 ]
俺も問題ない

268 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 12:11:08 ]
Ocamlの入門者ですが、n重のリストの要素数を数えたいと思って
↓のように書いてみたのですがエラーになります。
型推論などまだよくわかってないのですが、Ocamlではこのような関数は書けないのでしょうか。
# let rec moredeeplen = function
  | [] -> 0
  | (hd :: tl) :: rest -> 1 + moredeeplen tl + moredeeplen rest
  | _ :: rest -> 1 + moredeeplen rest;;
This expression has type 'a list but is here used with type 'a list list

269 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 21:42:05 ]
>>268
自分も勉強中だからはっきりとは言えないけどムリじゃないかな?

まず、n重のリストを関数に適用しようにも、
n=1のリストは'a list
n=2のリストは'a list list
n=3のリストは'a list list list
…ていう用にそれぞれ型が違うのでどんな入れ子リストにでも対応できる関数は書けない。

現実にそういうことがやりたいなら、バリアントとリストを組み合わせることになると思う。

270 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 21:51:43 ]
>>268
O'Caml の気持ちを代弁すると、
moredeeplen の型は多分 'a list list -> int だと思うんだが、
再帰的に呼ぶ際に moredeeplen tl の所で 'a list -> int という違う型で
使っている。なのでアウト。

普通は 268 が書きたいような、型を利用した再帰関数は ML の多相型では
書けませんな。




271 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 21:59:39 ]
> ocaml -rectypes
Objective Caml version 3.09.3

# let rec len v = List.fold_left (fun s v -> s + (len v)) 0 v;;
val len : ('a list as 'a) -> int = <fun>
# len (let rec v = [v; v; v] in v);;
Stack overflow during evaluation (looping recursion?).

はっ、初学者を混乱させるだけか...。

272 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 10:12:55 ]
>>271
その定義は常に 0 を返すのだが。

let rec len v = List.fold_left (fun s v -> s + (len v) + 1) 0 v;;
# len [[[];[]]; []];;
- : int = 4

面白いけど 268 がやりたいこととはちょっと違いますね。


273 名前:268 mailto:sage [2008/02/22(金) 11:03:06 ]
酷いコードを例示したのに色々考えてくださってありがとうございます。
簡単にはできないということで先に進もうと思います。

274 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 01:03:08 ]
こちらのスレの方々はどうなのでしょう?
pc11.2ch.net/test/read.cgi/tech/1186030985/244n

275 名前:デフォルトの名無しさん mailto:sage [2008/02/25(月) 23:31:52 ]
>>274
accumulator は後にするかなあ
複雑にならないなら fold とかで済ませたいと思っちゃうけど

276 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 01:59:47 ]
すいません、↓の記事を見かけたのですが、結局yieldってどんな風に実装するんですか?
itpro.nikkeibp.co.jp/article/COLUMN/20070612/274231/

277 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 02:33:33 ]
>>276
π-calculusは俺も勉強中なんだが、
この本が役に立つぜ
www.amazon.co.jp/Communicating-Mobile-Systems-Robin-Milner/dp/0521658691

質問ですが、
GUIライブラリが充実しているネイティブコンパイラ付きの関数型言語はありませんか?
HaskellもOCamlもこれといってまともなGUIライブラリが存在しないので・・・

278 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 03:02:36 ]
wxHaskellはまともなGUIライブラリに数えてくれないのか

279 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 09:13:48 ]
yieldの中身の作り方の参考にはならんのでは>ミルナー本

280 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 10:02:42 ]
wxHaskellは前回の公式リリースからだいぶ時間がたってるしなぁ。
その間にGHCも6.4から6.8になってるわけで…。

久しぶりにSourceforgeのほう見てみたら
wxhaskell-0.10.3-rc1 ってのが出てた。
sourceforge.net/project/showfiles.php?group_id=73133



281 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 10:20:29 ]
LablGTKは駄目なのか?
wwwfun.kurims.kyoto-u.ac.jp/soft/olabl/lablgtk.html

282 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 11:18:21 ]
>>276
・グローバルなunit chan refを一個作る(qとする)
・yieldはqからのrecvとして実装
・トップレベルのプロセスを生成した後に、qにsendし続けるプロセスを生成
という感じでどうだろう






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<224KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef