関数型言語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/
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になる。
0357デフォルトの名無しさん
2010/11/11(木) 21:49:53MLは初心者だけど、>>305は(コードの問題ではなく)設計の問題だと思う。
代数構造として、直積(組型やレコード型)と列(リスト型や配列型)は全く別の概念。
コンパイルの前に要素の数が決定できるなら直積を使うべきだし、
実行してみないと決定できないのなら列を使う。あるいは動的なシンボルで
ランダムアクセスしたいならハッシュ型を、更に順序性が必要ならB木型を。
これらすべてはプログラムの設計工程で決定しておくべきもの。
設計工程での不具合をコーディング工程で取り返そうとするのは、よくある過ち。
>>356の解決策というのは、いわゆる「泥縄」的手法。いずれ破綻する。
いくらMLが美しい言語でも、設計が汚ければコードはグチャグチャになるよ。
逆に、設計が適切であれば手続き型言語であっても美しいコードは書ける。
0358デフォルトの名無しさん
2010/11/11(木) 21:54:05Pascal、Modula系からMLやら(その他EiffelやらOberonやら)への流れで、
なぜか列挙型を配列のインデックスに使う機能が捨てられた悲しいね、ってだけの話だ。
0359デフォルトの名無しさん
2010/11/11(木) 22:25:29疑問の答えを考えなさい、と言ってる。
列挙型(特に関数型言語の直和、MLのdatatype定義)というのは、要素を数え上げることで
集合を定義している。いわゆる「内包的定義」だ。集合なのだから、その要素間に順序性は無い。
もし要素間に順序性が求められるのなら、列として(集合とは別に)それら要素を定義する。
そしてそれらの間の関係を写像(関数あるいはハッシュ型などで)させることで対応づける。
こういった考え方(設計技術)無しに、力任せのコーディングテク(技法)で解決しようとするのでは、
(特にMLのような明瞭な型体系を持つ)関数型言語の利点は、全く生きないよ。
型をわずらわしく感じるうちは、いつまでたってもIT土方のままだ。(型定義 = 設計なのに....。)
結果的に「関数型言語を使っても美しい(高品質な)コードは書けなかった。チクショウ騙された。」
という誤解が生まれる。
0360デフォルトの名無しさん
2010/11/11(木) 22:25:48305が既にコーディング工程まで来ているという根拠は?
0361デフォルトの名無しさん
2010/11/11(木) 22:29:03列挙型がインデックスの配列なんて、単にmapの効率的な表現でしかないだろ……。
0362デフォルトの名無しさん
2010/11/11(木) 22:33:39単純に(非常に残念ながら)固定長配列型が採用されなかったからだろうね。
全部可変長配列ならインデックスに演算不可能な型を使えてもしょうがないから。
0363デフォルトの名無しさん
2010/11/11(木) 22:39:12根拠は、>>305が使った「スタイル」と言う言葉。
>>361
>単にmapの効率的な表現でしかないだろ……。
その通り。より正確には「写像の効率的な実装(コード化)」だね。
>>357で書いたのは、実装(コード化)で解決しようとせずに設計に立ち返りなさい、という話。
0364デフォルトの名無しさん
2010/11/11(木) 22:44:09設計どうこうの話で絡む理由がわからんな。
それこそ言語機能の問題でしか無いんだから、実装の詳細もいいとこだろうに。
0365デフォルトの名無しさん
2010/11/11(木) 22:52:14下流工程で延々とモガき続ける、いわゆる土方から抜け出せるよう助言したつもりだったが、
余計なお世話だったかもしれない。これで落ちるよ。
0366デフォルトの名無しさん
2010/11/11(木) 22:57:510367デフォルトの名無しさん
2010/11/11(木) 22:59:31余計なお世話どころか、勘違い甚だしすぎる。
SML使う土方現場なんて日本にあったら俺が行きてーよw
0368365
2010/11/11(木) 23:14:44>>366
スマン。>>363の
>>>357
>根拠は、>>305が使った「スタイル」と言う言葉。
という部分の>>357というアンカは間違いだった。>>360宛のレスとして読み直してくれ。
0369デフォルトの名無しさん
2010/11/11(木) 23:22:160370デフォルトの名無しさん
2010/11/11(木) 23:27:020371デフォルトの名無しさん
2010/11/12(金) 00:43:43私はただの数値計算屋なので、このような助言はありがたい。
型の設定は大切にしています。ただ、研究用のプログラムなの
で、予想外の変更が生じるし、過剰に一般的に作ると使いにくく
なるので、なかなか難しいところです。
いまの問題でゆうと、対象の要素数が100とか1000であれば、
ハッシュを使う選択をしますが、当面の問題では、10以下の
固定個なので、列挙子を使いたい訳です。これは、NJの対話型
環境で式を評価したときに、
列挙子名が表示されるためです。
※NJのハッシュは組み込み型であるvectorほど使いやすくはない
ので、ハッシュを避けがちになるという別の問題はある。
なおUnsafe.castは前にOcamlにはmagicがあるという話が出たの
で、備忘録的に書いただけです。
0372デフォルトの名無しさん
2010/11/13(土) 19:02:170373デフォルトの名無しさん
2010/11/13(土) 21:11:230374デフォルトの名無しさん
2010/11/16(火) 01:51:58それも国内で。
結構なことじゃないの。
0375デフォルトの名無しさん
2010/11/17(水) 03:57:12が使えることのに気付くのにも時間が掛かったが、まさか、.cm/への
書きこみで競合が起こるとは想像だにできなかった。
0376デフォルトの名無しさん
2010/12/07(火) 20:39:56From: Julian Assange <proff@i...>
Subject: call for ocaml volunteers
http://caml.inria.fr/pub/ml-archives/caml-list/2000/08/6b8b195b3a25876e0789fe3db770db9f.en.html
0377デフォルトの名無しさん
2010/12/17(金) 00:13:19としてsml_tkがあるようだが、Posixストラクチャ
とか使っててコンパイルできない。
0378デフォルトの名無しさん
2011/02/11(金) 13:52:350379デフォルトの名無しさん
2011/02/16(水) 22:27:36気配はないねぇ。
0380デフォルトの名無しさん
2011/02/17(木) 00:06:390381デフォルトの名無しさん
2011/02/17(木) 00:16:06ocamlのobject的な機能って使ってる人いるのかね?
0382デフォルトの名無しさん
2011/02/17(木) 00:31:110383デフォルトの名無しさん
2011/02/27(日) 19:00:35.300384デフォルトの名無しさん
2011/02/28(月) 06:23:51.79あなたやその他の人が誰も立てないから。
0385デフォルトの名無しさん
2011/03/02(水) 23:24:04.60先日のRuby会議でCoqの話題が多かったようです。
ttp://partake.in/events/47ccda3b-82d2-4f89-aa83-395a26545b62
0386デフォルトの名無しさん
2011/03/03(木) 07:11:19.470387デフォルトの名無しさん
2011/03/11(金) 15:27:53.72私にそう言ったのは、大法螺吹きの異名で名高い営業マン。
もちろん、彼はプログラミングのことは全然知らない。
たぶん関数型言語のこともどっかのポルノ雑誌ででも読んだのだろう。やれやれだ。
「岡村ってのが新しいらしいね。」
なんだよ、その岡村って…。もしかして日本人の開発した関数型言語か?岡村って誰だよ。
「やねさんなら、当然、岡村、使ったことあるよね?」
使ったことあるどころか、名前すら知らんよ。なんだよ、岡村って…。
「あれー?やねさんともあろう御人が、岡村も知らないとは…」
いや、マジで知らんよ。なんなんだよ、それ。
「そうかー。知らないのかー。やねさんでも知らないのかー。」
そう言われて「なんだかなぁ」と思いながら帰ってきて、「関数型言語 岡村」でググって見たけど、そんなの出てこねーよ。
「なんだよ、また、いつもの大法螺かよ!」と思って、布団に入って寝てたら、深夜の三時に、「もしかして、岡村ってOCamlのことじゃね?」と夢のなかで気づいて、いま悔しくて壁を思いっきりグーパンチで殴ってるところ。
0388デフォルトの名無しさん
2011/03/11(金) 19:43:34.45Yacc束してたのに、Matlab。
あだー。アラン、隙間フェチ、すから。
見つけるのは一苦労じゃろーね。Sque無い
嗚呼、くっ。一緒にエイダみる予定だったのに・・
遅coqしたら理彩のレイジがMaximaになる
メーリングリストで蓮家等に聞いてミルか
Amigaとう。んじゃ,またAgda!
Orc、またAgdaな
0389デフォルトの名無しさん
2011/03/11(金) 21:16:39.930390デフォルトの名無しさん
2011/03/13(日) 21:05:50.23Coqスレ
http://hibari.2ch.net/test/read.cgi/tech/1300017923/
0391デフォルトの名無しさん
2011/04/02(土) 19:12:41.89ワロタwww
0392デフォルトの名無しさん
2011/04/04(月) 00:00:15.57(fn x => x (Unsafe.cast x)) (fn x => (Unsafe.cast x))
0393デフォルトの名無しさん
2011/04/04(月) 00:35:09.27let safe (Safe x) = x;;
print_char((fun x -> safe x x) (Safe (fun x -> safe x x)));;
0394デフォルトの名無しさん
2011/04/05(火) 21:49:01.21OCamlならこんなかんじ?
(fun x -> x (Obj.magic x))(fun x -> x (Obj.magic x));;
0395デフォルトの名無しさん
2011/04/14(木) 09:44:35.08で、技術書買って真っ先にやることと言えば正誤チェック。
つ・・つかえねぇ・・・この本
誤謬の嵐だぜこりゃw
量がハンパネェ
本として機能してない
残念だがゴミ箱へ
0396デフォルトの名無しさん
2011/04/14(木) 21:22:48.50そんなにひどいの?
0397デフォルトの名無しさん
2011/04/15(金) 00:44:37.03うん?
自分にとっては、haskellの学習に大きく寄与したぞ?
コラムの再帰に関する格言と、その本質に言及した言葉が無かったら、関数型言語を挫折してた
(関数型言語の魅力が解らなかっただろう)
自分は、この人にhaskell版を書いて欲しいぞ
今なら言える
手続き型言語は全体的に(それをするには)「どうする」で作り、関数型言語は、全体的に(それは)「何か(あるいは、どんなものか)」で作る言語だと
■ このスレッドは過去ログ倉庫に格納されています