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

■ このスレッドは過去ログ倉庫に格納されています
2009/06/15(月) 07:15:21
関数型言語MLについて語るスレッドです。

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

総本山
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/
2009/11/26(木) 16:53:19
良いこと考えた
正社員を派遣すればいいんじゃん
2009/11/26(木) 18:11:29
マルチのコピペにいちいち釣られてんのか
コピペした奴が自分で反応してんのか
どっちにしてもアホだ
2009/11/26(木) 18:58:16
>>245
面倒だから経営も外注するか。

労組嫌ってるやつは公務員か?死ねよ
2009/11/26(木) 19:03:43
http://pc12.2ch.net/test/read.cgi/tech/1189246532/l50
249デフォルトの名無しさん
垢版 |
2009/12/06(日) 22:09:27
>>243
欧州のどこだかは、派遣使うとそれだけ割高になるような法律になってるとか
聞いたことある。
250デフォルトの名無しさん
垢版 |
2009/12/07(月) 00:49:50
>>245
プログラマの派遣なら、正社員の派遣が主流じゃないか?

>>249
法律なんか作らなくても、市場原理に任せておけば派遣のほうが高くなる。
レンタルとリースのどっちが割高かってこと。
むしろ、法律によって市場を歪めているのが諸悪の原因。
251デフォルトの名無しさん
垢版 |
2009/12/31(木) 15:29:23
>>250
どの法律のこと?
2009/12/31(木) 19:26:50
おい、押すなよ、、絶対だぞ」
2009/12/31(木) 21:53:25
ポチっとな
2010/01/03(日) 16:49:17
val () = print "あけおめ\n"
2010/01/07(木) 21:35:11
OCaml用のlibcurlバインディングらしい、ocurlを入れようとしたのですがエラーが出ます。
curl-helper.c
主に「dereferencing pointer to incomplete type」というエラーが大量に出ます。
どうすればいいのでしょうか。
./configやlibcurlのインストールなどは済ませています。
環境はMSYS + MinGW、Windows 7です。
256デフォルトの名無しさん
垢版 |
2010/01/08(金) 18:36:46
libcurl のバージョンは。
257デフォルトの名無しさん
垢版 |
2010/01/08(金) 18:43:34
バージョンはよいみたい。一度古いので苦労した記憶がある
2010/01/09(土) 03:51:07
libcurlはWindows版では最新の7.19.7を入れました。
MinGWは最新のものを入れています。
ところで、http://jocaml.inria.fr/http://caml.inria.fr/ が落ちているのですが。
2010/01/09(土) 04:31:29
http://caml.inria.fr/pub/docs/manual-ocaml/manual032.html#toc135
ここの例通りに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でやりました。
2010/01/09(土) 08:51:21
>>259
Cランタイムのシンボルを見つけられてない、ということで
>Cygwinでocamlc -c modwrap.cすると何故かアクセスが拒否されるので modwrap.cとmod.mlのコンパイルはMinGWでやりました。
が怪しい。
この部分MinGWとCygwinの互換性はあるの?Cygwin知らんけど、全部-mnocygwinならどうだろう。
2010/01/09(土) 09:28:15
>260
>この部分MinGWとCygwinの互換性はあるの?
エラーが出てるのは正に MinGW と Cygwin で互換性のなさそうな部分だね。

>259
>何故かアクセスが拒否される
modwrap.c を Windows ネイティブのアプリで編集していたりすると発生する場合もあるので
・Cygwin アプリで編集する
・mkpasswd とか使って /etc/passwd を見直してみる
・とりあえず chown / chmod してみる
・ACL 周りの設定を変えてみる(mount とか環境変数 CYGWIN とか)
あたりはどうだろ。
2010/01/11(月) 21:48:13
>>260
>>261
助言ありがとうございます。
レスを頼りにいろいろ試してみましたが、だめでした。
OcamlもCygwinも使ってまだ日が浅いので大事なところを見落としているのかもしれません。
今忙しいのであまり時間が取れないのですが、Cygwinで揃えてまたいろいろと試してみようと思います。
本当にありがとうございました。
2010/02/06(土) 21:54:14
Moscow ML 使ってみようと思ったら、もうずっと更新されてないんだね…
2010/02/19(金) 00:01:29
SchemeとMLは、心が洗われるわー
2010/02/19(金) 23:52:14
あー汚れてるんですね
2010/02/22(月) 10:15:16
はい
2010/02/26(金) 18:43:33
        
2010/03/18(木) 02:27:03
OCamlはCにembedできますか?
2010/03/22(月) 23:27:08
Milnerが亡くなったそうだね
2010/03/22(月) 23:32:10
http://lambda-the-ultimate.org/node/3863

ホントだ。ご冥福をお祈りします。
ML は勉強していて楽しかったです。
2010/03/28(日) 22:50:27
『プログラミングの基礎』 浅井健一著 を買ってポチポチ楽しく
やってるんですが、著者のサポートサイトに書いてあるように
やっても、未だに日本語の表示が出来ません。

ttp://pllab.is.ocha.ac.jp/~asai/book/Linux.html

環境はWinXPのVMPlayer上のDebian(lenny)でやってます。
端末でインタープリタ走らせてる場合も、Emacs上でtuareg-
modeでやってる場合も文字コードが表示されてしまいます。

助けてけろ〜
2010/03/28(日) 23:42:03
分からんけど、なんでLANG=en_USのISOなんとかなんだろ?ja_JP.eucJPとかじゃないのか
2010/04/09(金) 23:58:56
OCamlはoreilly本来ないね
2010/04/11(日) 20:56:52
>>270
奥さん亡くなった三日後に心筋梗塞か。
2010/04/11(日) 21:10:03
ご冥福をお祈りします。
2010/04/12(月) 22:51:23
あの世で福??
277デフォルトの名無しさん
垢版 |
2010/04/21(水) 21:04:50
signatureのfunctorの使い方がよくわかりません。

signatureを受け取ってstructureを返すfunctor Aと、
signatureを受け取ってsignatureを返すfunctor Bを定義したとします。

signature CにAとBを適用したものをA(C), B(C)としたとき、
A(C)にB(C)を適用したstructureはどうしたら使えますか?
278277
垢版 |
2010/04/21(水) 21:06:26
言い忘れました。OCamlの話です。
279277
垢版 |
2010/04/21(水) 22:56:41
すみません、自己解決しました。
2010/04/22(木) 01:34:18
あれ?OCamlのfunctorってsignatureを受け取ったり返したり出来るの?
受け取るのも返すのstructureだけだと思ってた
2010/04/22(木) 01:38:21
ドキュメント読んでみたけど、
http://caml.inria.fr/pub/docs/manual-ocaml/manual019.html#toc67
やっぱりfunctorがsignatureを受け取れるようには見えないなぁ
2010/04/25(日) 12:26:40
質問していいですか。
'a * 'bの値を受け取り、型'aと'bが等しいか否かを判定する関数はo'camlで書けますか?
283デフォルトの名無しさん
垢版 |
2010/04/25(日) 22:33:07
>>283
2010/04/25(日) 22:54:26
>>284
2010/04/26(月) 00:03:13
>>282
何がしたいのか分からないけど
OCamlでは型情報は実行時には残っていないので
そういう型を扱うプログラムは一切かけないとおもう
2010/04/26(月) 21:09:56
OCamlってなんで最上位ビットをゴミ集め様に使っちゃうようにしたのかな。
なんか、これが凄くアダになってるように思えるのだが
2010/04/27(火) 20:51:34
Lisp系含めてわりと見かける仕様なんじゃ
2010/04/29(木) 20:07:48
$ sudo aptitude install ocaml
 …
以下の新規パッケージがインストールされます:
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 のディスク領域が新たに消費されます。

(#^ω^)ピキピキ
2010/04/29(木) 20:14:14
>>288
ocaml-nox
2010/04/30(金) 12:32:47
こそは自分でMakeだろJK
2010/05/01(土) 16:43:51
SML#は生きていた
2010/05/02(日) 01:19:01
音沙汰なくてちょっと諦めかけてたから新バージョンリリースめでたい
293デフォルトの名無しさん
垢版 |
2010/05/05(水) 04:16:18
OCamlの型で 'a. 'a list というのを見たんですけど、この「.」って何ですか?
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だからエラー
2010/05/05(水) 15:33:12
>>294
ありがとうございます
296デフォルトの名無しさん
垢版 |
2010/05/15(土) 22:35:32
SMLにはレコード更新の機能がなく、日常的に苦労しているので、ネイティブコードが
はけるSML#のリリースは待ち遠しかった。
ただ、欲を言うと、レコード拡張も言語としてサポートして欲しかった。
2010/05/16(日) 08:50:49
>SMLにはレコード更新の機能がなく、日常的に苦労している
すげえ、日常的にか。仕事に使ってるの?
>ただ、欲を言うと、レコード拡張も言語としてサポートして欲しかった。
レコード拡張って?
2010/05/17(月) 17:27:31
MLton って無限ストリーム使ったプログラムも最適化してくれるの?
299デフォルトの名無しさん
垢版 |
2010/05/18(火) 22:20:33
>>297
小規模な数値計算をしているだけで、すごいことはしていません。
Fortranで十分ですが、いくつかの部品を定義して、NJの対話環境
で評価することで、試行錯誤できて重宝してます。

レコードの拡張
連結と言うべきだった。
{a=1,b=2}#{c=3}
val it={a=1,b=2,c=3}
ができると嬉しい。
2010/05/21(金) 01:51:26
Vimのインデントファイルで
ocaml.vimやomlet.vimより
いいものありませんか?
2010/05/21(金) 21:02:03
MLで書くときはスタイルに悩むね。
inの前で改行すべきか?
連続するletはインデントすべきか?
などなど
2010/05/22(土) 23:36:50
スタイルは悩みますね。
今のところ連続するletもinの後も
インデントしないようにしています。

ただ、こう書きたいという思いがあっても
Vimのインデントファイルでは
うまくいかないことがあって困ります。

ユーザーの多そうなEmacsを使った方が
いいのかもしれません。ま、それを
言ったら関数型言語もHaskellということ
になるかもしれませんが…
303デフォルトの名無しさん
垢版 |
2010/06/04(金) 16:33:24
Ocamlで
let plus x y = x + y があるとき
xより先にyに代入する方法はあるますか?
304デフォルトの名無しさん
垢版 |
2010/06/04(金) 20:40:08
λ式を使えば良いのでは。
すでに、y = aの代入が決まっているときは、
(fun x -> plus x a)
まだのときは、
(fun y -> fun x -> plus x y)
を使う。
※SML使いなので、構文上の間違いはあるかもしれぬ。
305デフォルトの名無しさん
垢版 |
2010/06/04(金) 20:44:13
これも、一種のスタイル問題だが、
列挙型を定義するときに、
datatype X = X1 | X2 | X3 | ...
とするか
type X = int
val X1 = 1
val X2 = 2
...
とするかで悩んでしまう。最初は、vector (ランダムアクセス)を使わない
見込みだったのだが、必要になったときのことを心配してしまう。
306デフォルトの名無しさん
垢版 |
2010/06/04(金) 22:34:46
そういう心配をしなくていいくらいコンパイラの最適化は賢いから安心して代数データ型を使えという話をどこかで見た気がするのだがどこだか忘れてしまったな。
2010/06/04(金) 22:41:07
succ X1が欲しいという話だと思ったんだが。

……俺ならObj.magicしちゃうな
308デフォルトの名無しさん
垢版 |
2010/06/04(金) 22:44:58
http://d.hatena.ne.jp/sumii/20060918/1158537612
これだった。あんまり突っ込んだこと書かれてなかったな。でもこういう話じゃないの?
309デフォルトの名無しさん
垢版 |
2010/06/05(土) 18:55:54
>>304
ありがとうございます。
310デフォルトの名無しさん
垢版 |
2010/06/05(土) 23:46:13
>> 308, 307
ありがとうございます。そうです、O(1)で整数に変換できるかを心配していました。
2010/06/10(木) 00:10:32
O(1)での変換速度を気にしなきゃいけないくらい沢山定義するなら、
DEFINEマクロ使った方がいいんじゃないかなぁ。あ、OCamlの場合だけど。

(* compile with -pp "camlp4orf" *)
DEFINE A = 1
let _ = print_int A
312デフォルトの名無しさん
垢版 |
2010/06/14(月) 19:50:39
>> 311
Ocamlマクロ使えましたね。いいなぁ〜
313デフォルトの名無しさん
垢版 |
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

関数プログラマ的には、どれがいいのだろう。
(もっといい書き方もあるかもしれない)

2010/06/14(月) 19:58:31
個人的にはこだわらずに破壊的代入もがんがん使えって思うけど、その前にmapの捜査順は前からって保証されてるのか?
315デフォルトの名無しさん
垢版 |
2010/06/14(月) 21:34:29
確かに、一般的には規格違反かもしれない。ちなみに
http://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を考慮して、そう書いているのか
は不明。
2010/06/16(水) 05:25:03
>>313
効率気にしないなら下のようにも.
fun series nil = nil
  | series (h::t) = h :: map (fn x => x + h) (series t)
効率を気にするなら,series3がいいと思った.
refを使うと現在の変数の状態を気にする必要があって大変.
series2はやってることはわかったけど,コードがなんとなく見づらい.
2010/06/16(水) 12:11:01
>現在の変数の状態を気にする必要があって大変
refが大変で、引数変数が大変でないと思う辺り、関数型言語プログラマだなあ。
俺はまだそこまでの境地には達してないや
2010/06/16(水) 18:09:00
「こんなこともあろうかと」いいながら、用意しておいたscanlを使うのが一番直感的。
2010/06/16(水) 20:47:50
なるほど scanl か
mapAccumL で満足しそうになっていた
320デフォルトの名無しさん
垢版 |
2010/06/17(木) 21:08:40
>> 316
ひさしぶりに何か美しいものを見た気がします。
>> 318,319
HaskellのData.Listにある関数ですね。GHCは入れてあるが、ほとんど使って
いないので、知らなかったのですが、いっぱい関数が用意されてますね。


321デフォルトの名無しさん
垢版 |
2010/06/18(金) 19:16:35
NJに付属するCMLって、multicore対応じゃないみたいですね。
(tar ballのToDoに書いてあった)
ノード内並列には使えない。残念。
2010/06/18(金) 19:31:43
SML なら Poly/ML がネイティブスレッドに対応してるよ
323デフォルトの名無しさん
垢版 |
2010/06/18(金) 20:52:49
>>322
ありがとうございます。
ここを http://www.polyml.org/Doc.html さらっと見てみましたが、
結構しっかりした実装のようですね。
これは、SML/NJからの移行を検討する価値がある。
他に、
- Windowsプログラミング
- FFIが簡単(のように見える)
が気に入った。
2010/06/18(金) 21:45:31
MLでGUIプログラミング、って時々やろうとするんだけど準備が面倒で挫折する。
lablgtk2とその依存ライブラリを標準で取り込んでくれ〜
2010/07/04(日) 19:42:48
ファンクターでモジュールを作ったときに実行される関数がほしいんだけど
OOのコンストラクタみたいなの
2010/07/05(月) 12:51:06
 V V
(´・ω・`) うさちゃんピース
2010/07/05(月) 15:03:08
長澤うさみ
2010/07/09(金) 01:03:21
>>325
module F (A : sig val x : int end) = struct
let _ = print_int A.x
end

このファンクターに適当なモジュールを適用してごらん
2010/07/09(金) 22:25:03
MLが関数型言語とか、最初に言い出したのは誰なのかしら
2010/07/11(日) 11:47:27
 \                    /
   \  丶       i.   |      /     ./       /
    \  ヽ     i.   .|     /    /      /
      \  ヽ    i  |     /   /     /
   \
                                  -‐
  ー
 __          わ た し で す            --
     二          / ̄\           = 二
   ̄            | ^o^ |                 ̄
    -‐           \_/                ‐-

    /
            /               ヽ      \
    /                    丶     \
   /   /    /      |   i,      丶     \
 /    /    /       |    i,      丶     \ 
2010/07/23(金) 23:57:35
プログラミング言語ML
http://www.amazon.co.jp/dp/4756116418

J. D. Ullmanのこの本絶版になってたのか。
11年前に図書館で世話になったときは、面白かった。
2010/08/06(金) 17:34:51
3.12.0来たのか
2010/08/14(土) 16:35:21
OCaml出たばっかりなのに人が少ないってどういうことなの
2010/08/16(月) 01:05:07
平和ってすばらしい
2010/08/16(月) 01:22:01
windows用の最新版は3.11.0ってことですか?公式のリンクが切れてるという。。
2010/08/16(月) 12:57:13
自分でビルドすればいいし、URLの修正ぐらい自分でやればいいし
2010/08/21(土) 23:26:49
windows 3.11.0

http://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はどこにあるんだ・・・
2010/08/22(日) 01:37:10
いっこうにMacPortsにこねえ>3.12.0
なんか既存アプリ壊してるとかあるのかね

>>337
志村ー、"thread.ml"ー
2010/08/22(日) 02:53:00
>>337
圧倒的感謝
悩んでた自分が馬鹿らしい つーか馬鹿だった
2010/08/22(日) 02:54:15
ミス
>>338
2010/08/23(月) 01:39:58
unitをどうやって代入させるかで数分悩んでしまった。
2010/08/30(月) 15:11:49
可読なCに変換してくれるコンパイラはないのか
2010/09/19(日) 08:18:17
これはOCamlの仕様書と思って良いのでしょうか?
ttp://caml.inria.fr/pub/docs/manual-ocaml/index.html
2010/09/19(日) 22:05:30
仕様なんてない
345デフォルトの名無しさん
垢版 |
2010/09/21(火) 22:59:45
最近SML#が活発に更新されているようなので、0.56インストールしてみました。

集合演算を使ったプログラムを書こうとしているのですが、
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?

と上手く動いています。

どのあたりを調べれば良いかのポインタだけでも構いませんので、
解決方法ご存知の方、教えていただけますでしょうか。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況