関数型言語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/
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?

と上手く動いています。

どのあたりを調べれば良いかのポインタだけでも構いませんので、
解決方法ご存知の方、教えていただけますでしょうか。
2010/09/21(火) 23:10:05
SML#ってMSの.Net系言語だと思って無視してたんだけど、
全然関係無しなんだね。まぎらわしすぎw

解決方法でないレスでゴメソ >>345
2010/09/22(水) 02:13:02
>>345
SML/NJだと自動でライブラリを読み込むようだが,SML#ではそうでないみたいね.
ソースの smlsharp-0.56/smlnj-lib/Util/redblack-set-fn.sml
にRedBlackSetFnが入ってるから,必要なファイル込みでuseすればいいんじゃないかな.
348345
垢版 |
2010/09/22(水) 21:06:32
>>347
$prefix/lib/smlsharp/smlnj-lib/Util 以下に各set用のfunctorが
あったので、こちらをuseしてみたところ、
上手く動くようになりました。
ありがとうございます。

sml#ではCM上手く動かないのはやっぱり嫌だなぁ。
なんとかならないものか…
2010/09/26(日) 18:45:17
初歩の初歩ですいません、symbolic nameって何?

ML for the working programmerを読み始めて早速引っ掛かってしまいました。
2010/09/28(火) 01:50:38
alphabeticでない名前
2010/10/16(土) 00:36:53
Jane StreetのCoreってOCaml 3.12に対応してる?
コンパイルに失敗する
2010/10/24(日) 18:34:30
エディタの桁数はいくつに設定していますか?
2010/11/10(水) 00:02:31
遅レスだけど、桁数は80でインデントは4。

:se nu ai sw=4 ts=4
2010/11/10(水) 23:06:49
私も桁は80(インデントは2)。
でも無名関数を多用すると桁が足りなくなるので
増やすべきか悩む。横長モニタ買いたくなる。
355デフォルトの名無しさん
垢版 |
2010/11/11(木) 21:11:38
通常は80に設定しているが、MLを編集するときは、120に増す。
とはいえ、100を超えると読みにくくなるので、適当に折り返すことにしている。
ただ、このコーディングルールに従えばOK、というようなのがないので、
毎回困っている。
356デフォルトの名無しさん
垢版 |
2010/11/11(木) 21:19:26
>>305 解決策(SML/NJの場合の)が見つかった。
data label = A | B | C
Unsafe.cast A: int;
Unsafe.cast B: int;
Unsafe.cast C: int;
とすると、それぞれ0,1,2になる。
2010/11/11(木) 21:49:53
>>356
MLは初心者だけど、>>305は(コードの問題ではなく)設計の問題だと思う。

代数構造として、直積(組型やレコード型)と列(リスト型や配列型)は全く別の概念。
コンパイルの前に要素の数が決定できるなら直積を使うべきだし、
実行してみないと決定できないのなら列を使う。あるいは動的なシンボルで
ランダムアクセスしたいならハッシュ型を、更に順序性が必要ならB木型を。

これらすべてはプログラムの設計工程で決定しておくべきもの。
設計工程での不具合をコーディング工程で取り返そうとするのは、よくある過ち。
>>356の解決策というのは、いわゆる「泥縄」的手法。いずれ破綻する。

いくらMLが美しい言語でも、設計が汚ければコードはグチャグチャになるよ。
逆に、設計が適切であれば手続き型言語であっても美しいコードは書ける。
2010/11/11(木) 21:54:05
そんな大仰な話でもないだろ。
Pascal、Modula系からMLやら(その他EiffelやらOberonやら)への流れで、
なぜか列挙型を配列のインデックスに使う機能が捨てられた悲しいね、ってだけの話だ。
2010/11/11(木) 22:25:29
だから「なぜ列挙型を配列のインデックスに使う機能が捨てられたのか?」という
疑問の答えを考えなさい、と言ってる。

列挙型(特に関数型言語の直和、MLのdatatype定義)というのは、要素を数え上げることで
集合を定義している。いわゆる「内包的定義」だ。集合なのだから、その要素間に順序性は無い。
もし要素間に順序性が求められるのなら、列として(集合とは別に)それら要素を定義する。
そしてそれらの間の関係を写像(関数あるいはハッシュ型などで)させることで対応づける。

こういった考え方(設計技術)無しに、力任せのコーディングテク(技法)で解決しようとするのでは、
(特にMLのような明瞭な型体系を持つ)関数型言語の利点は、全く生きないよ。
型をわずらわしく感じるうちは、いつまでたってもIT土方のままだ。(型定義 = 設計なのに....。)
結果的に「関数型言語を使っても美しい(高品質な)コードは書けなかった。チクショウ騙された。」
という誤解が生まれる。
2010/11/11(木) 22:25:48
>>357
305が既にコーディング工程まで来ているという根拠は?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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