関数型言語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/
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が既にコーディング工程まで来ているという根拠は?
2010/11/11(木) 22:29:03
>>359とか自分で読み返して恥ずかしくないのか?
列挙型がインデックスの配列なんて、単にmapの効率的な表現でしかないだろ……。
2010/11/11(木) 22:33:39
あと「なぜ列挙型を配列のインデックスに使う機能が捨てられたのか?」は
単純に(非常に残念ながら)固定長配列型が採用されなかったからだろうね。
全部可変長配列ならインデックスに演算不可能な型を使えてもしょうがないから。
2010/11/11(木) 22:39:12
>>357
根拠は、>>305が使った「スタイル」と言う言葉。

>>361
>単にmapの効率的な表現でしかないだろ……。
その通り。より正確には「写像の効率的な実装(コード化)」だね。
>>357で書いたのは、実装(コード化)で解決しようとせずに設計に立ち返りなさい、という話。
2010/11/11(木) 22:44:09
正直「いちいちmap作るの効率悪い&めんどくさいからちゃっちゃとUnsafe.castしてしまえ」ってだけの話なのに
設計どうこうの話で絡む理由がわからんな。
それこそ言語機能の問題でしか無いんだから、実装の詳細もいいとこだろうに。
2010/11/11(木) 22:52:14
そうだね。プログラミング言語なんて道具にすぎないんだから、本人がどう使おうが自由だし。
下流工程で延々とモガき続ける、いわゆる土方から抜け出せるよう助言したつもりだったが、
余計なお世話だったかもしれない。これで落ちるよ。
2010/11/11(木) 22:57:51
だから、その本人が今現在下流工程にいるという根拠はなんなの?
2010/11/11(木) 22:59:31
大体設計としてはインデックス値集合からのmap確定で、見直す要素なんて全く無いだろ。
余計なお世話どころか、勘違い甚だしすぎる。

SML使う土方現場なんて日本にあったら俺が行きてーよw
368365
垢版 |
2010/11/11(木) 23:14:44
落ちたつもりだったけど、自分のカキコにアンカ間違いがあったから、そこだけ訂正。

>>366
スマン。>>363

 >>>357
 >根拠は、>>305が使った「スタイル」と言う言葉。

という部分の>>357というアンカは間違いだった。>>360宛のレスとして読み直してくれ。
2010/11/11(木) 23:22:16
今ひどい泥縄を見た。
2010/11/11(木) 23:27:02
こんなに人いたんだな
371デフォルトの名無しさん
垢版 |
2010/11/12(金) 00:43:43
305&356です。
私はただの数値計算屋なので、このような助言はありがたい。
型の設定は大切にしています。ただ、研究用のプログラムなの
で、予想外の変更が生じるし、過剰に一般的に作ると使いにくく
なるので、なかなか難しいところです。

いまの問題でゆうと、対象の要素数が100とか1000であれば、
ハッシュを使う選択をしますが、当面の問題では、10以下の
固定個なので、列挙子を使いたい訳です。これは、NJの対話型
環境で式を評価したときに、
列挙子名が表示されるためです。
※NJのハッシュは組み込み型であるvectorほど使いやすくはない
ので、ハッシュを避けがちになるという別の問題はある。

なおUnsafe.castは前にOcamlにはmagicがあるという話が出たの
で、備忘録的に書いただけです。    
372デフォルトの名無しさん
垢版 |
2010/11/13(土) 19:02:17
SML# 0.60 は大堀先生からアナウンス
2010/11/13(土) 21:11:23
いらねー
2010/11/16(火) 01:51:58
ML が研究されているという情報。
それも国内で。
結構なことじゃないの。
375デフォルトの名無しさん
垢版 |
2010/11/17(水) 03:57:12
ようやくMPIを使っての並列起動に成功した……。Intel MPIの32bit版
が使えることのに気付くのにも時間が掛かったが、まさか、.cm/への
書きこみで競合が起こるとは想像だにできなかった。
2010/12/07(火) 20:39:56
なにこれ?
From: Julian Assange <proff@i...>
Subject: call for ocaml volunteers

http://caml.inria.fr/pub/ml-archives/caml-list/2000/08/6b8b195b3a25876e0789fe3db770db9f.en.html
377デフォルトの名無しさん
垢版 |
2010/12/17(金) 00:13:19
windowsでグラフィックスを扱うライブラリ
としてsml_tkがあるようだが、Posixストラクチャ
とか使っててコンパイルできない。
2011/02/11(金) 13:52:35
standard MLとかって、もう終わった言語なの?
379デフォルトの名無しさん
垢版 |
2011/02/16(水) 22:27:36
NJのバージョンはときどき上がっているようだが、64bit版の開発が着手される
気配はないねぇ。
2011/02/17(木) 00:06:39
Objective SML とかあればなあ・・・
2011/02/17(木) 00:16:06
ええ。
ocamlのobject的な機能って使ってる人いるのかね?
2011/02/17(木) 00:31:11
Ocaml みたいな奴だったらイラン
2011/02/27(日) 19:00:35.30
なんでCoqのスレとかないの?
2011/02/28(月) 06:23:51.79
>>384
あなたやその他の人が誰も立てないから。
2011/03/02(水) 23:24:04.60
>> 383
先日のRuby会議でCoqの話題が多かったようです。
ttp://partake.in/events/47ccda3b-82d2-4f89-aa83-395a26545b62
2011/03/03(木) 07:11:19.47
またITプランニングのやつらか!
2011/03/11(金) 15:27:53.72
「最近、関数型言語が流行ってんだってね?」
私にそう言ったのは、大法螺吹きの異名で名高い営業マン。
もちろん、彼はプログラミングのことは全然知らない。
たぶん関数型言語のこともどっかのポルノ雑誌ででも読んだのだろう。やれやれだ。
「岡村ってのが新しいらしいね。」
なんだよ、その岡村って…。もしかして日本人の開発した関数型言語か?岡村って誰だよ。
「やねさんなら、当然、岡村、使ったことあるよね?」
使ったことあるどころか、名前すら知らんよ。なんだよ、岡村って…。
「あれー?やねさんともあろう御人が、岡村も知らないとは…」
いや、マジで知らんよ。なんなんだよ、それ。
「そうかー。知らないのかー。やねさんでも知らないのかー。」
そう言われて「なんだかなぁ」と思いながら帰ってきて、「関数型言語 岡村」でググって見たけど、そんなの出てこねーよ。
「なんだよ、また、いつもの大法螺かよ!」と思って、布団に入って寝てたら、深夜の三時に、「もしかして、岡村ってOCamlのことじゃね?」と夢のなかで気づいて、いま悔しくて壁を思いっきりグーパンチで殴ってるところ。
2011/03/11(金) 19:43:34.45
おいおい、岡村!アラン、見ランダ?
Yacc束してたのに、Matlab。

あだー。アラン、隙間フェチ、すから。
見つけるのは一苦労じゃろーね。Sque無い
嗚呼、くっ。一緒にエイダみる予定だったのに・・
遅coqしたら理彩のレイジがMaximaになる
メーリングリストで蓮家等に聞いてミルか
Amigaとう。んじゃ,またAgda!
Orc、またAgdaな
2011/03/11(金) 21:16:39.93
おつかれ〜
2011/03/13(日) 21:05:50.23
たててやったぞ

Coqスレ
http://hibari.2ch.net/test/read.cgi/tech/1300017923/
2011/04/02(土) 19:12:41.89
>>388
ワロタwww
392デフォルトの名無しさん
垢版 |
2011/04/04(月) 00:00:15.57
NJのUnsafe.castのあまり意味のない使い道
(fn x => x (Unsafe.cast x)) (fn x => (Unsafe.cast x))
2011/04/04(月) 00:35:09.27
type 'a safe = Safe of ('a safe -> 'a);;
let safe (Safe x) = x;;

print_char((fun x -> safe x x) (Safe (fun x -> safe x x)));;
394デフォルトの名無しさん
垢版 |
2011/04/05(火) 21:49:01.21
>>392
OCamlならこんなかんじ?
(fun x -> x (Obj.magic x))(fun x -> x (Obj.magic x));;
2011/04/14(木) 09:44:35.08
OCamlに興味が湧いてとりあえず五十嵐某の書籍買ってみた。
で、技術書買って真っ先にやることと言えば正誤チェック。

つ・・つかえねぇ・・・この本
誤謬の嵐だぜこりゃw
量がハンパネェ
本として機能してない

残念だがゴミ箱へ
2011/04/14(木) 21:22:48.50
>>395
そんなにひどいの?
2011/04/15(金) 00:44:37.03
>>395
うん?
自分にとっては、haskellの学習に大きく寄与したぞ?

コラムの再帰に関する格言と、その本質に言及した言葉が無かったら、関数型言語を挫折してた
(関数型言語の魅力が解らなかっただろう)

自分は、この人にhaskell版を書いて欲しいぞ

今なら言える

手続き型言語は全体的に(それをするには)「どうする」で作り、関数型言語は、全体的に(それは)「何か(あるいは、どんなものか)」で作る言語だと
2011/04/16(土) 12:37:58.03
>>395
俺も最近買ってしまって読んでるんだが、誤植の場所を教えてくれ。
素人でもわかるものなのか?
2011/04/16(土) 12:57:42.57
あれってネット上で読めなかったか
2011/04/16(土) 13:50:43.61
>>395
> 誤謬の嵐だぜこりゃw
>>398
> 俺も最近買ってしまって読んでるんだが、誤植の場所を教えてくれ。

「誤謬」のある本と「誤植」のある本の違いは大きい。
本当はどっち?
401398
垢版 |
2011/04/16(土) 17:02:39.70
>>400
すまん。ちゃんと見てなかった。誤植じゃなくて誤謬か。
で、どこなんだろう。
2011/04/17(日) 20:32:04.80
>>401
両方。誤植も誤謬もある。

http://www.sato.kuis.kyoto-u.ac.jp/~igarashi/OCaml/
技術書でこれだけの間違いがあったら、どうやって本として機能するんだろう?



2011/04/17(日) 21:40:45.30
>>402
そのページ印刷して本に挟んどけよ
2011/04/17(日) 22:50:12.49
間違いは無いに越したことはないけれど、
これぐらいの量の間違いは大したことないと思う。
2011/04/17(日) 22:51:29.38
十分大した事あるな
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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