関数型言語ML (SML, OCaml, etc.), Part 6
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2009/06/15(月) 07:15:21MLは、確固とした理論的背景を持つ言語でありながら、
現実的なソフトの開発にも使用できる実用性を備えた言語です。
また、プログラミングの初心者が最初に学習する言語としても優れています。
総本山
Standard ML http://www.smlnj.org/
Objective Caml http://caml.inria.fr/ocaml/
前スレ
関数型言語ML(SML, OCaml, etc.), Part 5
http://pc12.2ch.net/test/read.cgi/tech/1186292994/
0256デフォルトの名無しさん
2010/01/08(金) 18:36:460257デフォルトの名無しさん
2010/01/08(金) 18:43:340258デフォルトの名無しさん
2010/01/09(土) 03:51:07MinGWは最新のものを入れています。
ところで、http://jocaml.inria.fr/ や http://caml.inria.fr/ が落ちているのですが。
0259デフォルトの名無しさん
2010/01/09(土) 04:31:29ここの例通りにCでOcamlのモジュール使おうと試してるんだけどうまくいかない。
最後の手順の cc -o prog main.c mod.a -lcurses で詰まっています。
mod.a(startup.o):startup.c:(.text+0x9e): undefined reference to `__lseeki64'
mod.a(startup.o):startup.c:(.text+0x240): undefined reference to `__lseeki64'
mod.a(startup.o):startup.c:(.text+0x2e7): undefined reference to `__lseeki64'
mod.a(startup.o):startup.c:(.text+0x93b): undefined reference to `__beginthread'
mod.a(sys.o):sys.c:(.text+0x7): undefined reference to `__errno'
mod.a(sys.o):sys.c:(.text+0xf7): undefined reference to `__errno'
mod.a(sys.o):sys.c:(.text+0x101): undefined reference to `__errno'
mod.a(str.o):str.c:(.text+0x30f): undefined reference to `__imp___pctype'
mod.a(str.o):str.c:(.text+0x32c): undefined reference to `__isctype'
こんなエラーが大量に出る。
libcamlrun.aが怪しいと思うのだけれどどうすればいいかわからない。
環境はXPでCygwin Ocamlは3.10.2
Cygwinでocamlc -c modwrap.cすると何故かアクセスが拒否されるので modwrap.cとmod.mlのコンパイルはMinGWでやりました。
0260デフォルトの名無しさん
2010/01/09(土) 08:51:21Cランタイムのシンボルを見つけられてない、ということで
>Cygwinでocamlc -c modwrap.cすると何故かアクセスが拒否されるので modwrap.cとmod.mlのコンパイルはMinGWでやりました。
が怪しい。
この部分MinGWとCygwinの互換性はあるの?Cygwin知らんけど、全部-mnocygwinならどうだろう。
0261デフォルトの名無しさん
2010/01/09(土) 09:28:15>この部分MinGWとCygwinの互換性はあるの?
エラーが出てるのは正に MinGW と Cygwin で互換性のなさそうな部分だね。
>259
>何故かアクセスが拒否される
modwrap.c を Windows ネイティブのアプリで編集していたりすると発生する場合もあるので
・Cygwin アプリで編集する
・mkpasswd とか使って /etc/passwd を見直してみる
・とりあえず chown / chmod してみる
・ACL 周りの設定を変えてみる(mount とか環境変数 CYGWIN とか)
あたりはどうだろ。
0262デフォルトの名無しさん
2010/01/11(月) 21:48:13>>261
助言ありがとうございます。
レスを頼りにいろいろ試してみましたが、だめでした。
OcamlもCygwinも使ってまだ日が浅いので大事なところを見落としているのかもしれません。
今忙しいのであまり時間が取れないのですが、Cygwinで揃えてまたいろいろと試してみようと思います。
本当にありがとうございました。
0263デフォルトの名無しさん
2010/02/06(土) 21:54:140264デフォルトの名無しさん
2010/02/19(金) 00:01:290265デフォルトの名無しさん
2010/02/19(金) 23:52:140266デフォルトの名無しさん
2010/02/22(月) 10:15:160267デフォルトの名無しさん
2010/02/26(金) 18:43:330268デフォルトの名無しさん
2010/03/18(木) 02:27:030269デフォルトの名無しさん
2010/03/22(月) 23:27:080270デフォルトの名無しさん
2010/03/22(月) 23:32:10ホントだ。ご冥福をお祈りします。
ML は勉強していて楽しかったです。
0271デフォルトの名無しさん
2010/03/28(日) 22:50:27やってるんですが、著者のサポートサイトに書いてあるように
やっても、未だに日本語の表示が出来ません。
ttp://pllab.is.ocha.ac.jp/~asai/book/Linux.html
環境はWinXPのVMPlayer上のDebian(lenny)でやってます。
端末でインタープリタ走らせてる場合も、Emacs上でtuareg-
modeでやってる場合も文字コードが表示されてしまいます。
助けてけろ〜
0272デフォルトの名無しさん
2010/03/28(日) 23:42:030273デフォルトの名無しさん
2010/04/09(金) 23:58:560274デフォルトの名無しさん
2010/04/11(日) 20:56:52奥さん亡くなった三日後に心筋梗塞か。
0275デフォルトの名無しさん
2010/04/11(日) 21:10:030276デフォルトの名無しさん
2010/04/12(月) 22:51:230277デフォルトの名無しさん
2010/04/21(水) 21:04:50signatureを受け取ってstructureを返すfunctor Aと、
signatureを受け取ってsignatureを返すfunctor Bを定義したとします。
signature CにAとBを適用したものをA(C), B(C)としたとき、
A(C)にB(C)を適用したstructureはどうしたら使えますか?
0278277
2010/04/21(水) 21:06:260279277
2010/04/21(水) 22:56:410280デフォルトの名無しさん
2010/04/22(木) 01:34:18受け取るのも返すのstructureだけだと思ってた
0281デフォルトの名無しさん
2010/04/22(木) 01:38:21http://caml.inria.fr/pub/docs/manual-ocaml/manual019.html#toc67
やっぱりfunctorがsignatureを受け取れるようには見えないなぁ
0282デフォルトの名無しさん
2010/04/25(日) 12:26:40'a * 'bの値を受け取り、型'aと'bが等しいか否かを判定する関数はo'camlで書けますか?
0283デフォルトの名無しさん
2010/04/25(日) 22:33:070284デフォルトの名無しさん
2010/04/25(日) 22:54:260285デフォルトの名無しさん
2010/04/26(月) 00:03:13何がしたいのか分からないけど
OCamlでは型情報は実行時には残っていないので
そういう型を扱うプログラムは一切かけないとおもう
0286デフォルトの名無しさん
2010/04/26(月) 21:09:56なんか、これが凄くアダになってるように思えるのだが
0287デフォルトの名無しさん
2010/04/27(火) 20:51:340288デフォルトの名無しさん
2010/04/29(木) 20:07:48…
以下の新規パッケージがインストールされます:
camlp4{a} ledit{a} libdrm2{a} libgl1-mesa-glx{a} libpthread-stubs0{a}
libpthread-stubs0-dev{a} libx11-dev{a} libxau-dev{a} libxaw7{a}
libxcb-xlib0-dev{a} libxcb1-dev{a} libxdmcp-dev{a} libxext-dev{a}
libxi-dev{a} libxmu6{a} libxpm4{a} libxtst6{a} libxv1{a} libxxf86dga1{a}
libxxf86vm1{a} ocaml ocaml-base{a} ocaml-base-nox{a} ocaml-interp{a}
ocaml-nox{a} tcl8.4{a} tk8.4{a} x11-utils{a} x11proto-core-dev{a}
x11proto-input-dev{a} x11proto-kb-dev{a} x11proto-xext-dev{a} xbitmaps{a}
xterm{a} xtrans-dev{a}
0 個のパッケージを更新、 35 個を新たにインストール、 0 個を削除予定、0 個が更新されていない。
29.4MB のアーカイブを取得する必要があります。 展開後に 97.0MB のディスク領域が新たに消費されます。
(#^ω^)ピキピキ
0289デフォルトの名無しさん
2010/04/29(木) 20:14:14ocaml-nox
0290デフォルトの名無しさん
2010/04/30(金) 12:32:470291デフォルトの名無しさん
2010/05/01(土) 16:43:510292デフォルトの名無しさん
2010/05/02(日) 01:19:010293デフォルトの名無しさん
2010/05/05(水) 04:16:180294デフォルトの名無しさん
2010/05/05(水) 07:24:38「'a.」は「任意の型パラメータを'aとし、その'aついて...(for all)」の意味
例えば、
type 'a t = { e : 'a }
は'aを型パラメータに取るけど、
type 'a t = { e : 'a; p : 'b. 'b list }
とすると、任意の型'bをパラメータに持つ型をレコードの要素にできる
もちろん
type 'a t = { a : 'a; p : 'b list }
は'bがunboundだからエラー
0295デフォルトの名無しさん
2010/05/05(水) 15:33:12ありがとうございます
0296デフォルトの名無しさん
2010/05/15(土) 22:35:32はけるSML#のリリースは待ち遠しかった。
ただ、欲を言うと、レコード拡張も言語としてサポートして欲しかった。
0297デフォルトの名無しさん
2010/05/16(日) 08:50:49すげえ、日常的にか。仕事に使ってるの?
>ただ、欲を言うと、レコード拡張も言語としてサポートして欲しかった。
レコード拡張って?
0298デフォルトの名無しさん
2010/05/17(月) 17:27:310299デフォルトの名無しさん
2010/05/18(火) 22:20:33小規模な数値計算をしているだけで、すごいことはしていません。
Fortranで十分ですが、いくつかの部品を定義して、NJの対話環境
で評価することで、試行錯誤できて重宝してます。
レコードの拡張
連結と言うべきだった。
{a=1,b=2}#{c=3}
val it={a=1,b=2,c=3}
ができると嬉しい。
0300デフォルトの名無しさん
2010/05/21(金) 01:51:26ocaml.vimやomlet.vimより
いいものありませんか?
0301デフォルトの名無しさん
2010/05/21(金) 21:02:03inの前で改行すべきか?
連続するletはインデントすべきか?
などなど
0302デフォルトの名無しさん
2010/05/22(土) 23:36:50今のところ連続するletもinの後も
インデントしないようにしています。
ただ、こう書きたいという思いがあっても
Vimのインデントファイルでは
うまくいかないことがあって困ります。
ユーザーの多そうなEmacsを使った方が
いいのかもしれません。ま、それを
言ったら関数型言語もHaskellということ
になるかもしれませんが…
0303デフォルトの名無しさん
2010/06/04(金) 16:33:24let plus x y = x + y があるとき
xより先にyに代入する方法はあるますか?
0304デフォルトの名無しさん
2010/06/04(金) 20:40:08すでに、y = aの代入が決まっているときは、
(fun x -> plus x a)
まだのときは、
(fun y -> fun x -> plus x y)
を使う。
※SML使いなので、構文上の間違いはあるかもしれぬ。
0305デフォルトの名無しさん
2010/06/04(金) 20:44:13列挙型を定義するときに、
datatype X = X1 | X2 | X3 | ...
とするか
type X = int
val X1 = 1
val X2 = 2
...
とするかで悩んでしまう。最初は、vector (ランダムアクセス)を使わない
見込みだったのだが、必要になったときのことを心配してしまう。
0306デフォルトの名無しさん
2010/06/04(金) 22:34:460307デフォルトの名無しさん
2010/06/04(金) 22:41:07……俺ならObj.magicしちゃうな
0308デフォルトの名無しさん
2010/06/04(金) 22:44:58これだった。あんまり突っ込んだこと書かれてなかったな。でもこういう話じゃないの?
0309デフォルトの名無しさん
2010/06/05(土) 18:55:54ありがとうございます。
0310デフォルトの名無しさん
2010/06/05(土) 23:46:13ありがとうございます。そうです、O(1)で整数に変換できるかを心配していました。
0311デフォルトの名無しさん
2010/06/10(木) 00:10:32DEFINEマクロ使った方がいいんじゃないかなぁ。あ、OCamlの場合だけど。
(* compile with -pp "camlp4orf" *)
DEFINE A = 1
let _ = print_int A
0312デフォルトの名無しさん
2010/06/14(月) 19:50:39Ocamlマクロ使えましたね。いいなぁ〜
0313デフォルトの名無しさん
2010/06/14(月) 19:54:03あるけど、どの程度が許容範囲なんだろう。
与えられたリストの部分和を要素とするリストを返す関数を書いてみると、
破壊的代入を使ったバージョンが一番短く直観的に思う。
fun series xs =
(fn s => map (fn i => i + !s before s := !s + i) xs) (ref 0)
fun series2 xs =
(rev o #2) (foldl (fn (i,(s,ys)) => (i+s,(i+s)::ys)) (0,nil) xs)
fun series3' s (i::is) = (i+s) :: series3' (i+s) is
| series3' s nil = nil;
val series3 = series3' 0
関数プログラマ的には、どれがいいのだろう。
(もっといい書き方もあるかもしれない)
0314デフォルトの名無しさん
2010/06/14(月) 19:58:310315デフォルトの名無しさん
2010/06/14(月) 21:34:29http://www.smlnj.org/doc/basis/pages/list.html
には
map f l
applies f to each element of l from left to right, returning the list of results.
と書かれているが、"from left to right"を副作用を持つfを考慮して、そう書いているのか
は不明。
0316デフォルトの名無しさん
2010/06/16(水) 05:25:03効率気にしないなら下のようにも.
fun series nil = nil
| series (h::t) = h :: map (fn x => x + h) (series t)
効率を気にするなら,series3がいいと思った.
refを使うと現在の変数の状態を気にする必要があって大変.
series2はやってることはわかったけど,コードがなんとなく見づらい.
0317デフォルトの名無しさん
2010/06/16(水) 12:11:01refが大変で、引数変数が大変でないと思う辺り、関数型言語プログラマだなあ。
俺はまだそこまでの境地には達してないや
0318デフォルトの名無しさん
2010/06/16(水) 18:09:000319デフォルトの名無しさん
2010/06/16(水) 20:47:50mapAccumL で満足しそうになっていた
0320デフォルトの名無しさん
2010/06/17(木) 21:08:40ひさしぶりに何か美しいものを見た気がします。
>> 318,319
HaskellのData.Listにある関数ですね。GHCは入れてあるが、ほとんど使って
いないので、知らなかったのですが、いっぱい関数が用意されてますね。
0321デフォルトの名無しさん
2010/06/18(金) 19:16:35(tar ballのToDoに書いてあった)
ノード内並列には使えない。残念。
0322デフォルトの名無しさん
2010/06/18(金) 19:31:430323デフォルトの名無しさん
2010/06/18(金) 20:52:49ありがとうございます。
ここを http://www.polyml.org/Doc.html さらっと見てみましたが、
結構しっかりした実装のようですね。
これは、SML/NJからの移行を検討する価値がある。
他に、
- Windowsプログラミング
- FFIが簡単(のように見える)
が気に入った。
0324デフォルトの名無しさん
2010/06/18(金) 21:45:31lablgtk2とその依存ライブラリを標準で取り込んでくれ〜
0325デフォルトの名無しさん
2010/07/04(日) 19:42:48OOのコンストラクタみたいなの
0326デフォルトの名無しさん
2010/07/05(月) 12:51:06(´・ω・`) うさちゃんピース
0327デフォルトの名無しさん
2010/07/05(月) 15:03:080328デフォルトの名無しさん
2010/07/09(金) 01:03:21module F (A : sig val x : int end) = struct
let _ = print_int A.x
end
このファンクターに適当なモジュールを適用してごらん
0329デフォルトの名無しさん
2010/07/09(金) 22:25:030330名無しさん@そうだ選挙に行こう
2010/07/11(日) 11:47:27\ 丶 i. | / ./ /
\ ヽ i. .| / / /
\ ヽ i | / / /
\
-‐
ー
__ わ た し で す --
二 / ̄\ = 二
 ̄ | ^o^ |  ̄
-‐ \_/ ‐-
/
/ ヽ \
/ 丶 \
/ / / | i, 丶 \
/ / / | i, 丶 \
0331デフォルトの名無しさん
2010/07/23(金) 23:57:35http://www.amazon.co.jp/dp/4756116418
J. D. Ullmanのこの本絶版になってたのか。
11年前に図書館で世話になったときは、面白かった。
0332デフォルトの名無しさん
2010/08/06(金) 17:34:510333デフォルトの名無しさん
2010/08/14(土) 16:35:210334デフォルトの名無しさん
2010/08/16(月) 01:05:070335デフォルトの名無しさん
2010/08/16(月) 01:22:010336デフォルトの名無しさん
2010/08/16(月) 12:57:130337デフォルトの名無しさん
2010/08/21(土) 23:26:49http://ocaml.jp/Chapter%2024%20The%20threads%20library
>threads ライブラリを使用するプログラムは以下のようにリンクしてください:
>ocamlc -thread other options unix.cma threads.cma other files
って書いてあるのに
ocamlc -thread unix.cma threads.cma thread.ml
File "thread.ml", line 7, characters 8-21:
Error: Unbound value Thread.create
Threadはどこにあるんだ・・・
0338デフォルトの名無しさん
2010/08/22(日) 01:37:10なんか既存アプリ壊してるとかあるのかね
>>337
志村ー、"thread.ml"ー
0339デフォルトの名無しさん
2010/08/22(日) 02:53:00圧倒的感謝
悩んでた自分が馬鹿らしい つーか馬鹿だった
0340デフォルトの名無しさん
2010/08/22(日) 02:54:15>>338
0341デフォルトの名無しさん
2010/08/23(月) 01:39:580342デフォルトの名無しさん
2010/08/30(月) 15:11:490343デフォルトの名無しさん
2010/09/19(日) 08:18:17ttp://caml.inria.fr/pub/docs/manual-ocaml/index.html
0344デフォルトの名無しさん
2010/09/19(日) 22:05:300345デフォルトの名無しさん
2010/09/21(火) 22:59:45集合演算を使ったプログラムを書こうとしているのですが、
CM周りの問題のせいか上手く動きません。
例えば、sml#では、
# structure SSet = RedBlackSetFn(struct type ord_key = string; val compare = String.compare end);
stdIn:1.18-1.94 Error: unbound functor: RedBlackSetFn
となります。smlだと、
- structure SSet = RedBlackSetFn(struct type ord_key = string; val compare = String.compare end);
[autoloading]
[library $SMLNJ-BASIS/basis.cm is stable]
[library $SMLNJ-LIB/Util/smlnj-lib.cm is stable]
[autoloading done]
structure SSet : ORD_SET?
と上手く動いています。
どのあたりを調べれば良いかのポインタだけでも構いませんので、
解決方法ご存知の方、教えていただけますでしょうか。
0346デフォルトの名無しさん
2010/09/21(火) 23:10:05全然関係無しなんだね。まぎらわしすぎw
解決方法でないレスでゴメソ >>345
0347デフォルトの名無しさん
2010/09/22(水) 02:13:02SML/NJだと自動でライブラリを読み込むようだが,SML#ではそうでないみたいね.
ソースの smlsharp-0.56/smlnj-lib/Util/redblack-set-fn.sml
にRedBlackSetFnが入ってるから,必要なファイル込みでuseすればいいんじゃないかな.
0348345
2010/09/22(水) 21:06:32$prefix/lib/smlsharp/smlnj-lib/Util 以下に各set用のfunctorが
あったので、こちらをuseしてみたところ、
上手く動くようになりました。
ありがとうございます。
sml#ではCM上手く動かないのはやっぱり嫌だなぁ。
なんとかならないものか…
0349デフォルトの名無しさん
2010/09/26(日) 18:45:17ML for the working programmerを読み始めて早速引っ掛かってしまいました。
0350デフォルトの名無しさん
2010/09/28(火) 01:50:380351デフォルトの名無しさん
2010/10/16(土) 00:36:53コンパイルに失敗する
0352デフォルトの名無しさん
2010/10/24(日) 18:34:300353デフォルトの名無しさん
2010/11/10(水) 00:02:31:se nu ai sw=4 ts=4
0354デフォルトの名無しさん
2010/11/10(水) 23:06:49でも無名関数を多用すると桁が足りなくなるので
増やすべきか悩む。横長モニタ買いたくなる。
0355デフォルトの名無しさん
2010/11/11(木) 21:11:38とはいえ、100を超えると読みにくくなるので、適当に折り返すことにしている。
ただ、このコーディングルールに従えばOK、というようなのがないので、
毎回困っている。
0356デフォルトの名無しさん
2010/11/11(木) 21:19:26data label = A | B | C
Unsafe.cast A: int;
Unsafe.cast B: int;
Unsafe.cast C: int;
とすると、それぞれ0,1,2になる。
■ このスレッドは過去ログ倉庫に格納されています