関数型言語ML(SML, OCaml, etc.), Part 5at TECH
関数型言語ML(SML, OCaml, etc.), Part 5 - 暇つぶし2ch211:デフォルトの名無しさん
08/01/06 23:46:06
URLリンク(www.infoq.com)
ここ見た感じだと結構ちがう言語に見える
yield とかあるんだね

212:デフォルトの名無しさん
08/01/06 23:58:10
>>211
F#の記事ですね。
記者は手続き型でしか考えられない人かな?
forループ連発が意図的なのかよくわからなけど、あまり良い例じゃないなぁ。

213:デフォルトの名無しさん
08/01/07 00:15:51
この記事のforは全部F#独自のシーケンス内包表記でしょ。
書いた人もFoundations of F#の人だし。

214:デフォルトの名無しさん
08/01/07 00:26:33
>>213
for使うと再帰より速度が出るとか?

215:デフォルトの名無しさん
08/01/12 10:03:20
3.10.1でたね。プレステ3でビルドできるみたい?

216:デフォルトの名無しさん
08/01/12 18:38:12
>>215
何の?


217:デフォルトの名無しさん
08/01/13 02:37:14
URLリンク(caml.inria.fr)

The most recent version of Objective Caml is 3.10.1. It was released on 2008-01-11.

Some of the highlights in release 3.10 are:
* Instance variables in classes can be declared virtual and
implemented in subclasses. Syntax is val virtual v : t.
* Printing of stack backtraces on uncaught exceptions,
previously available only for bytecode-compiled programs,
is now supported for native-code programs as well.
(Supported on Intel/AMD and PPC, in 32 and 64 bits).
* New ports: MacOS X, PowerPC, 64 bits; Microsoft Windows 64 bits (x64)
using the Microsoft PSDK toolchain; Microsoft Windows 32 bits using the Visual Studio 2005 toolchain.
* The Camlp4 preprocessor was partially reimplemented and offers a new,
more modular API for syntax extensions.
(Users of third-party syntax extensions may wish to stay with OCaml 3.09 until these extensions are ported to the new API.)
* A new experimental tool, ocamlbuild:
a compilation manager that automates the building of OCaml applications and libraries. See the draft documentation.


218:デフォルトの名無しさん
08/01/13 21:53:45
流れをぶったぎっちゃうけれど、質問させてください
SML#のページにあるSMLFormatってcamlp4みたいなものなの?
説明見てもちょっと理解できなかったので…
サンプルも何か追加で入れないと動かないのもあるみたいなので使ったことある方とか居たら、どんなものか聞かせてください

219:デフォルトの名無しさん
08/01/13 22:32:40
使ったこと無いけど解説読むと普通のフォーマッタ/プリティプリンタじゃないかな。

220:デフォルトの名無しさん
08/01/16 21:14:36
F#版Parsec
URLリンク(www.quanttec.com)

F#版STM
URLリンク(cs.hubfs.net)

221:デフォルトの名無しさん
08/01/16 22:41:00
schemeのiotaみたいなのってocamlにないですかね

222:デフォルトの名無しさん
08/01/17 08:21:32
Arrayにはある。ListにはExtlibにある。

223:デフォルトの名無しさん
08/01/17 23:14:49
トン。

224:デフォルトの名無しさん
08/01/18 00:08:30
できたー。ライブラリインストールに手間取った;;
ExtList.List.init 100 ((+)1);;
結構タイプ量おおいな;;

225:デフォルトの名無しさん
08/01/18 00:27:11
Extlibは基本open ExtListとかして使うものだよ。
ListまでをopenしないのはOCaml流だと思ってあきらめるしかないけど。

226:218
08/01/18 22:06:57
>219
遅くなってごめんなさい

ありがとう

227:デフォルトの名無しさん
08/01/21 20:16:22
>>225
遅くなったけど、ありがとう
ばっちり使わせてもらいます。

228:デフォルトの名無しさん
08/01/22 17:31:49
windows用のexeファイルを作りたいのですがどうすればいいですか?
VC++ expressインストールすればできますか?

229:デフォルトの名無しさん
08/01/23 08:10:53
同梱のドキュメントに書いてあるよ。

230:デフォルトの名無しさん
08/01/23 23:43:03
同じint -> int = <fun>なのに、RandomではException: Invalid_argument "Random.int"がでます
○ExtLib.List.init 10 ((+)1);;
×ExtLib.List.init 10 Random.int;;
説明では、Invalid_argが出るのは初期値(↑だと10)が負の時とあるけど、これってもしかしてバグ?


231:デフォルトの名無しさん
08/01/23 23:46:44
↑無視してくださいRandom.int 0がエラーでした。

232:デフォルトの名無しさん
08/01/24 23:02:51
次スレのタイトルを「関数型言語ML(SML, OCaml, F#, etc.), Part 6」として「【.NET】F#について語れ【OCAML】」スレを合流させれば過疎らなくて済むかねぇ。
ML系過疎り杉w

233:デフォルトの名無しさん
08/01/24 23:03:20
たった今ハマりかけたのでちょっと書いとく。
Array.copyで新規作成されるのは一次元目の配列だけで、
二次元、三次元とかの値は前の値を差し続けてる。
まるごとコピーしたいときはその次元専用のcopyを作った方がいいみたい。


234:デフォルトの名無しさん
08/01/25 03:01:51
228じゃないけどうまくいかないや。
masm32もVC++も入れたしmasmのINCLUDE、LIB、PATHも通したのに。

一応Visual StudioのVCのPATH入れたり
masm32のbinにcl.exeやmspdb80.dll入れてみたりしたけど駄目だった。
う~ん、masmとVC++アンインストしようかしらw

235:デフォルトの名無しさん
08/01/26 00:34:24
エスパー能力を期待しないでくれよ

236:デフォルトの名無しさん
08/01/30 12:53:22
すみません,勉強し始めたばかりで,わからないことがあります.
指定した数だけランダムな数字を出力したいです.
やってみたところ再帰が止まらないです...
どうして>.<b

# let rec print_random n =
if n = 0 then 2 else
begin
print_int (Random.int 2);
print_random n-1;
end;;

237:デフォルトの名無しさん
08/01/30 12:59:31
>print_random n-1;
これが(print_random n)-1;と解釈されるからだな
print_random (n-1);とすればよろし

238:sage
08/01/30 14:49:02
ocamlbuild はゴミ

あれで便利便利って言って喜んでる奴はまだロクなもん書いてない

さらなるゴミ p4 のビルドで必要なのがさらにゴミ
ゴミのおかげで make world の時間がもったいない


239:デフォルトの名無しさん
08/01/30 17:18:38
>>237
ありがとうございます~~~
少しずつ型チェックってなんのかわかってきました.いろいろ書いてみます!

let rec cntRandom n zeroCnt oneCnt=
if n = 0 then zeroCnt else
(
if ((Random.int 2) = 0) then
cntRandom (n-1) (zeroCnt+1) oneCnt else cntRandom (n-1) zeroCnt (oneCnt+1)
);;



240:デフォルトの名無しさん
08/02/02 21:00:52
token listを受け取って整形式XMLなら(string,string) xmlを返すxml_of_tokensを作れ、という問題に
3日ぐらい挑んでいるのですが、わかりません。誰か助けて。

type token = PCDATA of string | Open of string | Close of string;;
type ('a,'b) xml = XLf of 'b option | XBr of 'a * ('a,'b) xml list;;

入力: [Open "a"; Open "b"; Close "b"; Open "c"; PCDATA "Hello"; Close "c"; Close "a"]
出力: XBr ("a", [XBr ("b", []); XBr ("c", [XBr ("Hello", [])])])

入力の型と出力の型が違うのでわけわかりません
閉じタグとか考えてると、スコープが足りないです。
スコップをください。


241:デフォルトの名無しさん
08/02/03 00:21:39
>>240
全然深く考えてないけど,スタック使えばいいんじゃないの?

242:デフォルトの名無しさん
08/02/03 10:32:25
>>240
PCDATAはXLfでなくて良いのか?

exception ParseException of string
let rec parse (xs : token list) (context : string list) (ks : ('a,'b) xml list list) : ('a,'b) xml =
 let add_child ks x =
  match ks with
  | [] -> raise (ParseException "internal error: add_child")
  | (k::ks1) -> (x::k)::ks1
 in
 match xs with
 | [] ->
  if context <> [] then
   raise (ParseException ("some tags are not closed:" ^ (String.concat "," context)))
  else
   hd (hd ks)
 | (PCDATA str)::xs1 ->
  if context = [] then
   raise (ParseException ("toplevel PCDATA:" ^ str))
  else
   parse xs1 context (add_child ks (XBr (str, [])))
 | (Open tag)::xs1 ->
  parse xs1 (tag::context) ([]::ks)
 | (Close tag)::xs1 ->
  if (hd context) <> tag then
   raise (ParseException ("close tag mismatch:" ^ tag ^ " appeared where " ^ (hd context) ^ " expected"))
  else
   parse xs1 (tl context) (add_child (tl ks) (XBr (tag, (rev (hd ks)))))
let run_parse xs = parse xs [] [[]]

243:デフォルトの名無しさん
08/02/03 22:14:54
うおーありがとうございます!
(Open tag)::xs1の箇所で、ひとつ先読みする再帰になるのかと思って
ずっと考えてたけど、全然違った・・
あと、ご指摘のとおりPCDATAはXLfのほうが良さそうですね

上のadd_childみたいな関数が必要になるかどうかの判断って
自分には職人技の世界に思えるんですが
一般的なやり方みたいなのあるんですかね。

とりあえず、上記を参考に自分でも書けるよう頑張ってみます。


244:デフォルトの名無しさん
08/02/05 23:51:48
ねぇねぇ、OCamlでオブジェクトを使わないって人いる?
そういう人ってレコードを拡張したい時どうしているの?




245:デフォルトの名無しさん
08/02/06 00:19:05
OCamlのクラスって副作用ありますか?

246:デフォルトの名無しさん
08/02/06 00:54:00
副作用ありのオブジェクトも作れますし、なしのも作れますよ。

副作用あり
# class point = object
val mutable x : int = 0
method set_x v = x <- v
end;;
class point : object val mutable x : int method set_x : int -> unit end

副作用なし
# class point' = object
val x : int = 0
method set_x v = {< x = v >}
end;;
class point' : object ('a) val x : int method set_x : int -> 'a end


247:デフォルトの名無しさん
08/02/06 02:49:12
OCamlでlet _ = ... とlet () = ... 構文の違いがよくわかりません。
使い分けがあるのでしょうか?

248:デフォルトの名無しさん
08/02/06 21:32:35
let _ =... と let () =... とでは、使える状況が違う。
前者は名前の束縛を省略しただけで右式がどんな型になっても構わないけど、
後者は右式がunit型にならないとダメ。
どちらも print_string のような副作用が目的の式によく使うけど、
私は戻り値が要らないという意味で、let _ =...で統一している。
これだと let _ = Thread.create f () とかでも対応できる。

249:247
08/02/06 23:43:09
>>248
ありがとうございます。

# let () = true;;
Characters 9-13:
let () = true;;
^^^^
This expression has type bool but is here used with type unit

やってみたら確かにそうです。
悩んでいたのでとても参考になります。

250:デフォルトの名無しさん
08/02/07 10:23:25
俺は戻り値がunit じゃない状況を区別するために let () = を使ってる
let _ = は、 ignore @@ Unix.system "rm -rf hoge" とか

251:デフォルトの名無しさん
08/02/07 10:40:36
labelglutを使っていて
GluMat.gluPerspective ~fovy:(45.0) ~aspect:(1.0) ~zNear:(0.1) ~zFar:(100.0)
って書いてもUnbound value GluMat.gluPerspectiveって言われてちゃう

URLリンク(wwwfun.kurims.kyoto-u.ac.jp)
URLリンク(www.opengl.org)
を見て書いたのですがどこがいけないかわかりません>.<b




252:デフォルトの名無しさん
08/02/07 23:12:43
>>251
まさかライブラリの指定を忘れてるなんて落ちはないよな。
ocamlc -I +lablGL lablgl.cma lablglut.cma ...
という感じでコンパイルしなきゃいけないはずだけど?

253:247
08/02/08 02:21:31
>>250
統一するか区別するかOCaml内のコードを調べてみます。
多いほうにしてみます。

254:デフォルトの名無しさん
08/02/08 09:33:48
>>252
大体原因がわかった
exampleにあった
GlMat.ortho ~x:(-1.0, 1.0) ~y:(-1.0, 1.0) ~z:(-1.0,1.0);
を調べてみたら
void glOrtho( GLdouble left,
GLdouble right,
GLdouble bottom,
GLdouble top,
GLdouble nearVal,
GLdouble farVal);
でなっていてGLの引数と違う名前になっていたのね

GluMat.perspective ~fovy:(45.0) ~aspect:(1.0) ~zNear:(0.1) ~zFar(100.0);
GluMat.perspective ~fovy:(45.0) ~aspect:(1.0) ~z(0.1, 100.0);
見たく試してみてもダメだったw

どっかに引数に関してマニュアルないわけ?

255:デフォルトの名無しさん
08/02/09 21:25:54
>> 254
.mli 見ろや:

val perspective : fovy:float -> aspect:float -> z:float * float -> unit


256:デフォルトの名無しさん
08/02/14 01:59:10
cygwin 3.10で実行しています。

while true do
  print_string "debug1\n";
  ignore (Unix.recv sock buf 0 (String.length buf) []);
  print_string buf;
  print_string "debug2\n";
done;;
を実行したのですが、
print_string "debug1\n";
が実行されず、プログラムが停止して、動きません。
コンパイル時にエラーはありませんでした。
何がいけないのでしょうか?

257:デフォルトの名無しさん
08/02/14 06:49:29
>>256
システムに関係なく print_string は buffering されているので
flush stdout が必要。

デバッグには stderr に出力 + flush の prerr_endline をおすすめする。
次の pervasives.mli のコメントをよく読んでくれ:

val print_string : string -> unit
(** Print a string on standard output. *)
val print_endline : string -> unit
(** Print a string, followed by a newline character, on
standard output and flush standard output. *)
val prerr_endline : string -> unit
(** Print a string, followed by a newline character on standard error
and flush standard error. *)

こういう細かいことって日本語の O'Caml の本には書いてないのかな?


258:デフォルトの名無しさん
08/02/14 20:34:46
>257
ありがとうございます。
prerr_endlineを使用したところ、うまく動作するようになりました。

259:デフォルトの名無しさん
08/02/15 16:42:11
OCamlで共有ライブラリを作ったり、それと動的リンクするようなプログラムを作るには、
Makefileにどう書けばいい?

260:デフォルトの名無しさん
08/02/15 17:01:35
>>259
stublib のことなら ocaml のソースの otherlibs/graph などを参考に。
otherlibs/Makefile.shared を include してあるが、そこに大体書いてある。


261:259
08/02/16 16:35:26
>260
ごめん、説明不足だった。

OCamlで書かれたライブラリがあって、それを自分で書いたOCamlのコードから使いたいんだけど、
ライブラリの方がLGPLなのでできれば静的リンクしたくないんだ。

262:デフォルトの名無しさん
08/02/16 16:59:23
>>261
3.10現在、無い。バイトコードだとstubを読みに行く方法があるけど。
OCamlのライブラリは多くの場合LGPLの例外事項が追加されていると思うんだけど、
そういうのはないの? 以下はsexplibの例。

As a special exception to the GNU Lesser General Public License, you
may link, statically or dynamically, a "work that uses the Library"
with a publicly distributed version of the Library to produce an
executable file containing portions of the Library, and distribute that
executable file under terms of your choice, without any of the additional
requirements listed in clause 6 of the GNU Lesser General Public License.


263:259
08/02/16 17:31:46
>262
ありがとう!勉強になった。

調べてみたけど、例外事項は入ってないみたいだ。

ライブラリのメーリングリストを流し読みしたところ、
「オブジェクトファイルを添付すればいいだけなんだから別に問題なくね?」
という結論になった模様orz

まぁ実際そのとおりだから、そうすることにするよ。

264:デフォルトの名無しさん
08/02/17 01:27:40
URLリンク(www.ocaml-tutorial.org)
なんかつながんね

265:デフォルトの名無しさん
08/02/17 01:47:54
>>264
繋がるよ?

266:デフォルトの名無しさん
08/02/17 01:59:31
オレは繋がらない。

267:デフォルトの名無しさん
08/02/17 08:56:08
俺も問題ない

268:デフォルトの名無しさん
08/02/21 12:11:08
Ocamlの入門者ですが、n重のリストの要素数を数えたいと思って
↓のように書いてみたのですがエラーになります。
型推論などまだよくわかってないのですが、Ocamlではこのような関数は書けないのでしょうか。
# let rec moredeeplen = function
  | [] -> 0
  | (hd :: tl) :: rest -> 1 + moredeeplen tl + moredeeplen rest
  | _ :: rest -> 1 + moredeeplen rest;;
This expression has type 'a list but is here used with type 'a list list

269:デフォルトの名無しさん
08/02/21 21:42:05
>>268
自分も勉強中だからはっきりとは言えないけどムリじゃないかな?

まず、n重のリストを関数に適用しようにも、
n=1のリストは'a list
n=2のリストは'a list list
n=3のリストは'a list list list
…ていう用にそれぞれ型が違うのでどんな入れ子リストにでも対応できる関数は書けない。

現実にそういうことがやりたいなら、バリアントとリストを組み合わせることになると思う。

270:デフォルトの名無しさん
08/02/21 21:51:43
>>268
O'Caml の気持ちを代弁すると、
moredeeplen の型は多分 'a list list -> int だと思うんだが、
再帰的に呼ぶ際に moredeeplen tl の所で 'a list -> int という違う型で
使っている。なのでアウト。

普通は 268 が書きたいような、型を利用した再帰関数は ML の多相型では
書けませんな。


271:デフォルトの名無しさん
08/02/21 21:59:39
> ocaml -rectypes
Objective Caml version 3.09.3

# let rec len v = List.fold_left (fun s v -> s + (len v)) 0 v;;
val len : ('a list as 'a) -> int = <fun>
# len (let rec v = [v; v; v] in v);;
Stack overflow during evaluation (looping recursion?).

はっ、初学者を混乱させるだけか...。

272:デフォルトの名無しさん
08/02/22 10:12:55
>>271
その定義は常に 0 を返すのだが。

let rec len v = List.fold_left (fun s v -> s + (len v) + 1) 0 v;;
# len [[[];[]]; []];;
- : int = 4

面白いけど 268 がやりたいこととはちょっと違いますね。


273:268
08/02/22 11:03:06
酷いコードを例示したのに色々考えてくださってありがとうございます。
簡単にはできないということで先に進もうと思います。

274:デフォルトの名無しさん
08/02/25 01:03:08
こちらのスレの方々はどうなのでしょう?
スレリンク(tech板:244番)n

275:デフォルトの名無しさん
08/02/25 23:31:52
>>274
accumulator は後にするかなあ
複雑にならないなら fold とかで済ませたいと思っちゃうけど

276:デフォルトの名無しさん
08/03/13 01:59:47
すいません、↓の記事を見かけたのですが、結局yieldってどんな風に実装するんですか?
URLリンク(itpro.nikkeibp.co.jp)

277:デフォルトの名無しさん
08/03/13 02:33:33
>>276
π-calculusは俺も勉強中なんだが、
この本が役に立つぜ
URLリンク(www.amazon.co.jp)

質問ですが、
GUIライブラリが充実しているネイティブコンパイラ付きの関数型言語はありませんか?
HaskellもOCamlもこれといってまともなGUIライブラリが存在しないので・・・

278:デフォルトの名無しさん
08/03/13 03:02:36
wxHaskellはまともなGUIライブラリに数えてくれないのか

279:デフォルトの名無しさん
08/03/13 09:13:48
yieldの中身の作り方の参考にはならんのでは>ミルナー本

280:デフォルトの名無しさん
08/03/13 10:02:42
wxHaskellは前回の公式リリースからだいぶ時間がたってるしなぁ。
その間にGHCも6.4から6.8になってるわけで…。

久しぶりにSourceforgeのほう見てみたら
wxhaskell-0.10.3-rc1 ってのが出てた。
URLリンク(sourceforge.net)

281:デフォルトの名無しさん
08/03/13 10:20:29
LablGTKは駄目なのか?
URLリンク(wwwfun.kurims.kyoto-u.ac.jp)

282:デフォルトの名無しさん
08/03/13 11:18:21
>>276
・グローバルなunit chan refを一個作る(qとする)
・yieldはqからのrecvとして実装
・トップレベルのプロセスを生成した後に、qにsendし続けるプロセスを生成
という感じでどうだろう

283:デフォルトの名無しさん
08/03/18 01:11:13
>>282
うぅぅ入門 Ocaml 片手の私には動作がイメージできません・・・
recvしてもすぐsendされて別のに切り替わらないとかになりませんか?
とりあえず挑戦してみます。

284:デフォルトの名無しさん
08/04/12 21:49:11
引く手あまたのプログラミング言語は?
URLリンク(slashdot.jp)
---
Java(16479件)、C++(8080件)、C#(7780件)、JavaScript(6749件)、
Perl(5710件)、PHP(2641件)、Python(1408件)、COBOL(1207件)、
Ruby(769件)、Lisp(33件)といった感じらしい。

とりあえずJavaとC/C++/C#、あとJavaScriptを覚えれば、
当分仕事には困らないようである。COBOLのしぶとさも目立つ。

ちなみにHaskellやOCamlの求人は10以下だったそうだ。
---

285:デフォルトの名無しさん
08/04/12 23:05:22
10もあったのか。

286:デフォルトの名無しさん
08/04/12 23:50:30
1000ならbrainf*ckの求人をだす

287:デフォルトの名無しさん
08/04/12 23:54:05
0 じゃないのか・・・。
冒険してる会社もあるもんだな。

288:デフォルトの名無しさん
08/04/13 00:36:55
10以下に0は含まれるがなw

289:デフォルトの名無しさん
08/04/13 10:37:39
理屈上はそうだが、記事として書くなら、
0なら0と書くか話題にも上らないかのどっちかだろう

290:デフォルトの名無しさん
08/04/13 10:56:58
ちなみにCとMLは省かれてます。
検索結果を加工した統計なので。

291:デフォルトの名無しさん
08/04/20 15:48:14
>> 171
Debian or Ubuntuなら、
# apt-get install coqide
でok

292:デフォルトの名無しさん
08/04/20 16:30:04
どちらかが10件あったから、わざわざ10以下と書く場合もあるってことね。

293:デフォルトの名無しさん
08/04/23 21:40:54
関数型言語は、変数への代入もforループも使わずにプログラムできるって聞いたけど
どういうこと???
ここにきても全然わからん。

294:デフォルトの名無しさん
08/04/23 21:42:19
再帰すればループできるじゃん。

295:デフォルトの名無しさん
08/04/23 22:03:38
SML#0.40マダー?チンチン(AA略

296:デフォルトの名無しさん
08/04/24 13:36:36
>>154
# let ( *.. ) a b = range a b;;
val ( *.. ) : int -> int -> int list = <fun>

# 1 *.. 10;;
- : int list = [1; 2; 3; 4; 5; 6; 7; 8; 9; 10]

297:デフォルトの名無しさん
08/04/24 21:59:44
>>293
関数の戻り値を次の関数へ放り込んだり、戻り値の一部だけ次の関数に放り込んで、残りをさらに次の関数に放り込んだりするのだ。


298:デフォルトの名無しさん
08/04/24 22:40:38
>>293
ちょっと富豪的だが、ループは>>296のようなリストで置き換えると
最初は考えやすいと思う。
大雑把な説明だが
for(int i=1;i<=10;++i){printf("%d\n",i);}は
高階関数mapを使ってこう。
List.map print_endline (1 *.. 10)

299:デフォルトの名無しさん
08/04/24 23:05:54
えーintとstringの型あってないし、そこはmapじゃなくてiterじゃないの用途的に

300:デフォルトの名無しさん
08/04/24 23:39:18
うは、俺あほw

301:デフォルトの名無しさん
08/04/24 23:49:18
ちゃんと書いとこう。今Ocamlの処理系ないから部分的にF#で試したコードだけども。

List.iter (fun x -> print_endline (string_of_int x)) (1 *.. 10)



302:デフォルトの名無しさん
08/04/25 00:35:19
書籍の質問いいですか?
プログラミングinOcaml(初版1刷)を読んでるんですが
P65のNewton-Raphson法のとこでベージ下部の式変形が

y = f'(x_i) * x - {f'(x_i) * x_i - f(x_i)}
x軸と交わる点がx_i+1なのでy=0としてxについて解くと
x_i+1 = x_i - {f(x_i)/f'(x_i)} * x_i が得られます

となってるんですが
x_i+1 = x_i - {f(x_i)/f'(x_i)} じゃないですかね?

303:デフォルトの名無しさん
08/04/25 21:29:32
JavaのThread.sleepみたいな関数を探しています。
OCamlで「n秒待つ」関数みたいなのは、何ですか?

次のようなプログラムを書いています。
let rec loop count =
 print_endline (print_int count);
 (* ここで1秒待ちたい *)
 loop (count + 1)

let main =
 loop 0

304:デフォルトの名無しさん
08/04/25 21:41:38
Unix.sleepかThread.delay

305:デフォルトの名無しさん
08/04/25 22:00:51
>>302
とりあえず正誤表にはなかったよ。もっかいコード見直したら?
URLリンク(www.sato.kuis.kyoto-u.ac.jp)

306:デフォルトの名無しさん
08/04/25 22:23:27
>> 304
できました!
どうもありがとうございます!!

307:デフォルトの名無しさん
08/04/26 01:07:52
>>293
ループは再帰のときに引数を変えれば良い。
してifやパターンマッチで止める。
let rec loop i =
if i<0 then () else
(print_int i; loop (i-1));;

代入なくても書けるというのは
lambdaの引数を利用する。

代入がこんな感じなら
let i = 1 in
i + i;;
 こう書ける。
(fun i -> i+i) 1;;

308:デフォルトの名無しさん
08/04/27 01:10:46
letの方はそれ代入じゃない

309:デフォルトの名無しさん
08/04/27 08:38:49
refでやればいいのかよう

310:sakura
08/04/27 11:45:53
こうなんというか深夜亀頭から白濁色の液が滲み ぷっつん。

311:デフォルトの名無しさん
08/04/28 00:36:21
>>302
誰がどう見ても誤植です。どうもありがとうございました。

312:デフォルトの名無しさん
08/04/29 16:34:33
HaMLet v1.3.1
URLリンク(www.ps.uni-sb.de)

SML#にも対応
ベンチマーク用のSML実装としての、あるべき姿か

誰ぞ、SML#をNJ、MLtonとベンチしてたもう


313:デフォルトの名無しさん
08/05/03 13:29:42
関数型言語F#をわかりやすく解説した動画とかないの??

314:[Power of Scala]
08/05/03 16:42:43
>>313
関数型言語Scalaの動画
URLリンク(d.hatena.ne.jp)

315:デフォルトの名無しさん
08/05/03 18:03:03
>>314
関数型言語というよりもオブジェクト指向型の印象が強い言語だな。
カリー化すら出来ないし、代数的データ型すらないじゃないか。
関数型言語の特徴というべき代表的な機能が欠如しているのは関数型言語として致命的。
だから、Scalaはオブジェクト指向型言語だ。

316:デフォルトの名無しさん
08/05/03 19:28:52
制限時間関係なくこの人早口っぽいな~。



317:Objective Caml
08/05/03 20:11:11
>>313
F#じゃないけど

OCamlの動画 - YouTube
URLリンク(www.youtube.com)


318:デフォルトの名無しさん
08/05/04 00:18:19
OCamlをすこしかじってF#にも興味もったんだけど、
F#って.NETのライブラリが使えるのと、オブジェクトが使えないの以外にどんな点がF#と違うの?
文法面はほぼ同じだと聞いたんだけど。

319:デフォルトの名無しさん
08/05/04 00:28:24
F#はHaskell.NET同様その内サポートされなくなるところが違う。
MSの単なるデモンストレーションだから。


320:デフォルトの名無しさん
08/05/04 01:26:50
>>318
データの型が.NET互換になってて、演算子がオーバーロードされる。
例えば +. 演算子はなくなってて実数の足し算でも + 演算子を使う。
クラスは.NETのクラスになるので、クラス定義まわりの文法にだいぶ変更がある。


321:デフォルトの名無しさん
08/05/04 23:20:06
Jane Street Capital謹製のcoreが公開されたね。
Extlibでもcoreでもいいから標準ライブラリに取り込んでくれないかなあ。

322:デフォルトの名無しさん
08/05/05 01:08:14
>>315
いや、あるよ>カリー化&代数的データ型
単に紹介されてないだけ

323:デフォルトの名無しさん
08/05/05 01:13:40
ちゃんと説明するとScalaには代数的データ型そのものは無いけど、
case classという機能をつかってほぼ同等(以上)のことができる。こんな感じ

/* 代数的データ型 */
abstract sealed class Exp
case class Add(a :Exp, b :Exp) extends Exp
case class Num(v :Int) extends Exp
def eval(e :Exp) :Int = e match {//パターンマッチ
case Add(l, r) => eval(l) + eval(r)
case Num(v) => v
}
eval(Add(Num(1), Num(2)))

まあ、MLの代数的データ型の定義に比べて記述が冗長だけど、機能的には
問題ない。

324:デフォルトの名無しさん
08/05/10 10:05:39
>>323
つまりScalaは関数型言語であるっていうこと??

325:デフォルトの名無しさん
08/05/11 22:57:45
>>324
定義によるけど、たぶん言って良いと思う。MLが関数型言語であるというのと
同じ程度には。

326:デフォルトの名無しさん
08/05/12 06:56:30
>>325どうも

327:デフォルトの名無しさん
08/05/12 13:01:46
代数データ型があるかどうかは、関数型かどうかを左右しない。
ただ今時の関数型言語に代数データ型を持っているのが多いというだけ。

328:デフォルトの名無しさん
08/05/12 17:48:27
関数型言語という言葉に明確な定義が無い以上、ある言語が関数型かどうかは
「典型的な関数型言語」にどれくらい似ているかという尺度で測る他無いんじゃね?

329:デフォルトの名無しさん
08/05/12 19:25:20
あなたがそう思うものが関数型言語です。
ただし、他人の同意を得られるとはかぎりません。

330:デフォルトの名無しさん
08/05/12 20:02:47
無意味なレスしてんなよ noob

331:デフォルトの名無しさん
08/05/12 23:17:55
>>319
逆だよ。
F#は製品化が決まって現在仕様の取りまとめ中。

332:デフォルトの名無しさん
08/05/13 08:09:27
>>328
そんなわけないだろw
代数的データ型があるかどうかは、関数型言語かどうかの尺度にはならない。

>>331
あそこは仕様=実装って会社でしょ。
V0.9的な仕様作ってそれでおしまい。

333:デフォルトの名無しさん
08/05/13 09:58:17
もともと仕様と実装が同じ言語から派生した言語に何を求めるのか.



334:デフォルトの名無しさん
08/05/13 14:55:39
>>332
じゃあ、何が尺度になるの?もちろん、代数的データ型*さえあれば*関数型言語
だとは言うつもりは無いけど、関数型言語の定義なんて人によってかなり曖昧な
わけだ。MLとかHaskellとかのまず間違いなく関数型言語だと認定してもらえる言語と
どれだけ同じ機能を持っているかで比較するしか無いんじゃない?

335:デフォルトの名無しさん
08/05/13 16:08:24
プログラムが参照の透明性のある関数だけで構成されていること
でいいんじゃない?

336:デフォルトの名無しさん
08/05/13 16:54:44
stateがないってんじゃ駄目なの?
monadでstateは扱えるけど、
stateがあるわけじゃないよね。

stateがないってことを厳密にいうと、
「ある時にy=f(x)ならば、どんな時でもy=f(x)」ってことでいいのかな?

337:デフォルトの名無しさん
08/05/13 17:17:45
> プログラムが参照の透明性のある関数だけで構成されていること

じゃあ、MLやOCamlはNGじゃん。ref型があるわけだから。

338:デフォルトの名無しさん
08/05/13 17:54:46
>>337
関数だけで構成されていること
でいいんじゃない?

339:デフォルトの名無しさん
08/05/13 20:49:17
>>338

それだとHaskellすらNGだな

340:デフォルトの名無しさん
08/05/13 20:56:34
C++ だって関数型言語なのに!

341:デフォルトの名無しさん
08/05/13 21:44:13
>>340
ないないそれはない

342:デフォルトの名無しさん
08/05/13 21:47:37
それ有名なネタだよ

343:デフォルトの名無しさん
08/05/13 21:49:08
マクロとテンプレートを思いっきり使えば
それらしいコードは書けるかもしれない。

344:デフォルトの名無しさん
08/05/14 07:36:28
omake はええぞ。omake -P を知ったらやめられん。


345:デフォルトの名無しさん
08/05/14 11:58:34
Boost おそるべし

346:デフォルトの名無しさん
08/05/14 19:10:58
でもないw

347:デフォルトの名無しさん
08/05/17 09:53:43
今日職場で出た話題。
以下のOCamlコードが最終行でエラーには
* ならなさそうで、
* でもなりそうで、
* でもやっぱりならない理由と、
この問題の意図を考えなさい。

let id x = x
let unify x y = if true then x else y
let v = id `A
let _ = unify v `B
let _ =
match v with
| `A -> ()


348:デフォルトの名無しさん
08/05/17 10:31:08
なんでエラーになりそうなのかわからない。

349:デフォルトの名無しさん
08/05/17 11:19:41
>| `A -> ()
なんかAAぽい

350:デフォルトの名無しさん
08/05/17 13:48:50
>>349
怒ってため息をついてるね。w

351:デフォルトの名無しさん
08/05/17 15:38:52
標準で関数型プログラミングをサポートする言語=関数型言語じゃね
標準のSTLだけだと関数型プログラミングは厳しいのでC++は入らないと思う

352:デフォルトの名無しさん
08/05/17 17:10:34
Q. 関数型プログラミングとは?
A. 関数型言語が標準でサポートしているプログラミング

353:デフォルトの名無しさん
08/05/17 21:04:26
相互再帰ですか

354:デフォルトの名無しさん
08/05/17 21:44:22
>>353
無限に再帰してて、止まらないわけですね、わかります。

355:デフォルトの名無しさん
08/05/17 22:08:01
再帰なんて簡単だお。

356:デフォルトの名無しさん
08/05/17 22:32:21
>>347
>今日職場で出た話題。
どこの職場ですか?日本ですか?


357:デフォルトの名無しさん
08/05/18 00:30:58
let id x = xと
let v = id `Aと
let _ =
match v with
| `A -> ()
だけみれば`Aと`Aだからエラーにならなそうで
let unify x y = if true then x else y
let _ = unify v `B
もみるとxとyが同じ型じゃないとエラーで`Aと`Bだからエラーになりそう
でも多相バリアントだからエラーにならないみたいな。
なんか問題がわるいな

358:デフォルトの名無しさん
08/05/18 00:32:16
357は>>347へのレス 書き忘れたorz

359:デフォルトの名無しさん
08/05/18 01:16:05
type 'a 関数型言語 =
{ 変数 : 参照透過; 関数 : 高階; 型 : 代数的; } constraint 'a = 多相


360:デフォルトの名無しさん
08/05/18 08:22:31
>>351
個人的にはSTLがどれほど充実しようが、後付けのクロージャが qsort に渡せ
ない時点で除外したい。箱庭の中だけで関数プログラミングをサポートしても、
その言語が関数型とは言い難い。どんな言語でも関数型言語を「実装」する事
は出来るので。


361:デフォルトの名無しさん
08/05/18 12:09:28
std::sort に渡せりゃそれで十分じゃん。

362:デフォルトの名無しさん
08/05/18 16:41:50
qsortのほうがずいぶん遅いしね

363:デフォルトの名無しさん
08/05/18 16:49:38
>>362
プラットフォームによるとqsortの方が団地に早かったりするんですが
どのようなプラットフォームでお仕事をしておいででしょうか?


364:デフォルトの名無しさん
08/05/18 17:12:28
windows。それ、最適化してんの?

365:デフォルトの名無しさん
08/05/18 17:24:49
>>36
qsort() の呼び出しでは関数ポインタの呼び出しが多いから、インラインで置換するコードには負けてしまうと思います。

366:デフォルトの名無しさん
08/05/18 18:25:41
>>363
プラットフォームって、インライン最適化もできない糞コンパイラを使えばって話か?

367:デフォルトの名無しさん
08/05/18 18:46:20
あるいはstd::sortに関数ポインタを渡してるとか

368:デフォルトの名無しさん
08/05/18 20:41:28
おもしろいな。
関数呼び出しコスト以上に速くなる?

369:デフォルトの名無しさん
08/05/19 07:57:36
>>361
qsort はただの例。ライブラリの形で別言語を実装しておいて関数型でございっ
てのが気に入らないってだけ。関数ポインタを要求している所に渡したり、新
しい関数ポインタのインスタンスを実行時に作れないと。


370:デフォルトの名無しさん
08/05/19 08:58:50
> ライブラリの形で別言語を実装しておいて

言語内の機能で実装しているんだぜ?

371:デフォルトの名無しさん
08/05/19 21:49:06
クロージャはファーストクラスじゃないとね

372:デフォルトの名無しさん
08/05/19 22:47:50
>>370
それいうとあらゆる言語が関数型を名乗れるから。

373:デフォルトの名無しさん
08/05/19 23:02:44
>>370
それいったらアセンブラだって関数型だろwww

374:デフォルトの名無しさん
08/05/20 06:52:47
つまらんんこと言っとらんでコード書け。



375:デフォルトの名無しさん
08/05/20 08:27:19
C++のboost:lambdaみたいなのを、
言語の本来の機能で実装できるのってないんじゃねえ?

376:デフォルトの名無しさん
08/05/20 10:04:38
>>375
boost.lambda 見てないんだけど Lisp のマクロ、R6RS のマクロでも無理?


377:デフォルトの名無しさん
08/05/20 11:19:19
関数型は最初からラムダ式があるから必要ないのでは。

zip(list1, list2, _1 + _2) //←こんな感じ。

378:デフォルトの名無しさん
08/05/20 17:44:55
Boostはポリシーによるプログラミングができる
(lambda (lambda (funcname)) (funcname ...))
↑こんなイメージ。これはLISPだったらマクロなしだと実現不可能じゃない?
型システムが閉じてないことが前提だから
OcamlやF#ではこれ、実現不可能だと思う

//ちら裏:自分はBoostが関数型言語やろうと思ったきっかけ

379:デフォルトの名無しさん
08/05/20 17:52:12
>>378
マクロ書けばええやん?
言語本来の機能でっせ、Lisp のマクロは…


380:デフォルトの名無しさん
08/05/20 18:56:16
>>378
>LISPだったらマクロなしだと

その前提が間違い。何の為の S 式だか。

381:デフォルトの名無しさん
08/05/20 22:14:56
すまん、今の流れでマクロなしってのは間違ってるなw
しかし、マクロありでもポリシーによるプログラミングはLISPでは不可能なんじゃね?
ここでS式が出てくるのはなぜ?
静的な型を持つ言語じゃないとコンパイル時型チェックの利点はなくなるし
単なるダックタイピングになってしまう
現時点では閉じていない多態かつ静的な言語って
俺が知る限りC++ぐらいしかないけど他にあるのかな
Template Haskellとかどうなんだろ

382:デフォルトの名無しさん
08/05/20 22:19:20
>>381
>ここでS式が出てくるのはなぜ?

興味無いくせに聞くなよ

383:デフォルトの名無しさん
08/05/20 22:26:20
>>381
declare すりゃいい話だし、元気があればコンパイラ書き換えれば OK
型推論でも何でもできるんじゃないか?


384:デフォルトの名無しさん
08/05/20 22:28:55
ああ、コンパイラ作るのか・・その発想はなかったわw

385:デフォルトの名無しさん
08/05/21 21:52:19
>>384
つか, 処理系自体にシンタックスパーサからコンパイラまで含んでて
そいつらを自前の定義に書き換え可能な言語相手に何を戦ってるんだか


386:デフォルトの名無しさん
08/05/21 23:06:06
>>378
すまんが、このコードで何をしてるのか参考までに教えてくれ・・・

>>385
C++に脳を冒されて、そんな言語が存在することを知るよしもないんだろう

387:デフォルトの名無しさん
08/05/22 05:23:56
>>339
いや、セーフだろ

388:デフォルトの名無しさん
08/05/22 07:28:36
職場で出た話題。
O'Caml で、v == v は真なのに v = v は偽な値 v は存在するか。


389:デフォルトの名無しさん
08/05/22 08:16:39
NaN

390:デフォルトの名無しさん
08/05/22 21:55:52
>>375
>静的な型を持つ言語じゃないとコンパイル時型チェックの利点はなくなるし
OCamlは型推論で静的な型が付くからC++並にコンパイル時型チェック働くよ
型変換がらみのバグ出づらい分むしろ安全だと思うけど。
(* てかboost:lambdaコンパイル遅すぎ *)

391:デフォルトの名無しさん
08/05/22 23:38:28
>>390
OCAMLだとこれに相当することができない(STLC<U>が定義済みの場合だけOCamlでも可能)
C++では定義済みかどうかは関係なく宣言できる

STLライクなデータに対する探索コード
template <template <typename T> class STLC,typename U,typename R>
 bool has_data(STLC<U>&data,const R&value){
  typename STLC<U>::iterator it = std::find(data.begin(),data.end(),value);
  if(it!=data.end())return true;
  else return false;
}

392:デフォルトの名無しさん
08/05/23 00:30:15
begin(data)がイテレータ関数を戻すなら
find(b,v)はdataの型と関係なく定義出来る
(イテレータ関数の型には影響をうける)
クロージャ使えるって忘れてない?

393:デフォルトの名無しさん
08/05/23 01:10:33
>>391
> 宣言できる

「定義できる」かな?
宣言ももちろんできるけど。

394:デフォルトの名無しさん
08/05/23 01:17:03
念のため言っておくけど、上はあくまでどうしてもイテレータ使いたいならの話
リストは、|でパターンマッチして再帰でグルグルが普通

395:デフォルトの名無しさん
08/05/23 01:22:07
要は先に定義が必要だったりはしないので、391は間違ってると思われ

396:デフォルトの名無しさん
08/05/23 01:39:44
>>391の例自体は不適切かもしれんが、C++のテンプレートにできて他の殆どの言語にできないことがあるのは事実だよ
C++のテンプレートの顕著な特徴は
・型検査と名前解決の一部がインスタンス化まで遅延される
・特殊化(テンプレート引数に対するパターンマッチ)ができる
で、メジャーな言語でこれを備えてるのはC++の他にはDくらいしかないはず

397:デフォルトの名無しさん
08/05/23 01:55:42
SFINAE(Substitution Failure Is Not An Error)
URLリンク(en.wikipedia.org)

398:デフォルトの名無しさん
08/05/23 01:59:04
>>396
取り敢えず CL はどっちも出来るな

399:デフォルトの名無しさん
08/05/23 02:06:14
>>398
良く分からん
CLだと引数の型が確定するのは実行時だから、テンプレートみたいなことはやりようが無いんじゃね?

400:デフォルトの名無しさん
08/05/23 02:12:17
GF じゃダメなん?

401:デフォルトの名無しさん
08/05/23 02:17:12
GFって総称関数のこと?
それならやっぱり実行時ディスパッチだからテンプレートとは比較できないだろ

402:デフォルトの名無しさん
08/05/23 04:48:43
>>397
Boostじゃ結構使われてるけど英語しか記事無いのか

403:デフォルトの名無しさん
08/05/23 08:11:36
GFってgeneric functionのことだと思うけど、それだと
>>401の書いてるように、実行時の型に基づくディスパッチだから、
コンパイル時にディスパッチが行われるC++のテンプレートの特殊化
とは全然違うでしょ

404:デフォルトの名無しさん
08/05/23 08:21:47
何で同じ事を2度書く?

405:デフォルトの名無しさん
08/05/23 08:48:42
>>403
packageとcompileで頑張れば、
同じようなものを作れないこともないなあ。
おもしろいかもね。SFINAEはCLOSっぽいね。
まあC++だって総称関数族だから当たり前か。

406:デフォルトの名無しさん
08/06/02 14:56:29
patter match で、

let a = "hoge" in
match a with
a -> "this is hoge"
| "hage" -> "this is hage"
| _ -> "other"

みたいにして、a を "hoge" としてマッチさせることが出来ないのはどうしてなの

407:デフォルトの名無しさん
08/06/02 15:25:34
パタンに変数参照を書けないから。
パタン中に変数書くときは束縛になるじゃん。

408:デフォルトの名無しさん
08/06/02 15:37:05
あ、そうか。束縛と区別できないのか。
ありがとう
でもグローバルに識別子を持っているとき
例えば root_user_name = "hoge" とかあるとして
直接 "hoge" はタイプしたくない場合

match user_name with
eval(root_user_name) -> "root user"
| _ -> "normal user"

とか書きたくなるんだよね
単純なときは if else だけど、複雑なときに書きたくなる

409:デフォルトの名無しさん
08/06/02 19:00:31
つ whenキーワード

410:デフォルトの名無しさん
08/06/02 19:56:37
match user_name with
 | user when user=root_user_name -> "this is root user"
 | "hage" -> "this is hage"
 | _ -> "other"

で合ってる?

411:デフォルトの名無しさん
08/06/02 20:30:39
つ if

412:デフォルトの名無しさん
08/06/03 00:08:07
>409
ありがとー
知らなかった
すげー恥ずかしい

413:デフォルトの名無しさん
08/06/03 02:56:54
>>412
かじりかけじゃしょうがないと思うからがんばれ。


414:デフォルトの名無しさん
08/06/05 08:27:09
パターンマッチにパターンじゃなくて式を書いちゃうのは初心者にはよくあること。
入門書は振れるべきかもわからんね。


415:デフォルトの名無しさん
08/06/05 11:13:11
つ 入門OCaml

416:デフォルトの名無しさん
08/06/05 19:44:14
軸がぶれている

417:デフォルトの名無しさん
08/06/07 10:41:42
質問です、リストの文字を全部つなげるとき

List.fold_left (^) "" ["1"; "2"; "3"]

とか書くとするじゃないですか
でも例えばちょこっと関数を間に挟みたいとき、

let conv x = x ^ "!!" in
List.fold_left (fun a b -> a ^ (conv b)) "" ["1"; "2"; "3"]

とか書くのって違うのかなとか思ってるんですよ

(fun a b ->a ^ (conv b))

の部分をもっとこう関数の合成みたいな感じで短く書く方法ってないですかね

418:デフォルトの名無しさん
08/06/07 12:19:57
十分簡潔に書けていると思う。わかりやすいし。
なぜそんなに短さにこだわる?

419:デフォルトの名無しさん
08/06/07 12:31:55
質問の趣旨とずれているが、そもそも (^) を fold するのはお勧めできない。
文字列コピーが多すぎるから。String.concat とか、 Buffer を使うべし。
上の例は、

String.concat "" (List.map conv ["1"; "2"; "3"])

これで十分だろう。(^) を使うなら417で十分。無理に短く書いて喜ぶ言語ではない。


420:デフォルトの名無しさん
08/06/07 12:36:50
              ,,,,,,,,,,,,,,,,,,,,,,,,,,
             /": : : : : : : : \
           /-─-,,,_: : : : : : : : :\
          /     '''-,,,: : : : : : : :i
          /、      /: : : : : : : : i     ________
         r-、 ,,,,,,,,,,、 /: : : : : : : : : :i    /
         L_, ,   、 \: : : : : : : : :i   /  λ抽象したら
         /●) (●>   |: :__,=-、: / <   負けかなと思ってる
        l イ  '-     |:/ tbノノ    \
        l ,`-=-'\     `l ι';/       \
        ヽトェ-ェェ-:)     -r'          ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
         ヾ=-'     / /  
     ____ヽ::::...   / ::::|
  / ̄ ::::::::::::::l `─''''   :::|


421:デフォルトの名無しさん
08/06/07 14:08:51
>>417
俺だったら先にmapする

422:デフォルトの名無しさん
08/06/07 14:42:08
俺はconvを2引数にしてこんな感じにするかな
List.fold_left conv "1" ["2"; "3"]


423:デフォルトの名無しさん
08/06/07 21:29:56
ありがとうございました
Buffer は知ってたけど、String.concat は知りませんでした
map 先にやって、String.concat で書くことにします

424:デフォルトの名無しさん
08/06/07 23:34:58
OCamlでファイルIOするときUnix.lseekとかが
file_descr -> int -> seek_command -> int
でintで足りない場合が多々あるかと思うのですが、
皆さんは大きなファイルのIOをするときはどうしてますか?
オフセットの計算とかも Int64.add pos (Int64.mul index 4L)
みたいにしてやってますか?


425:デフォルトの名無しさん
08/06/08 01:20:52
Unix.LargeFile

おまいら、ライブラリ関数で迷ったらまず .mli 読むか、grep するか、
ocamlbrowser でも使えよな。



426:デフォルトの名無しさん
08/06/08 01:34:33
>>425
おお、ありがとうございます!

427:デフォルトの名無しさん
08/06/08 17:22:38
>>424
31bitがだめなら63bitがあるじゃない。

# 0xffffffff;;
- : int = 4294967295

428:デフォルトの名無しさん
08/06/09 00:54:23
>>427
つまらん



429:デフォルトの名無しさん
08/06/12 18:32:15
質問。関数型言語の特徴の一つとしてパターンマッチって出てくるけど何が利点なの?
ifの構文糖衣のようにも思えるけど

430:デフォルトの名無しさん
08/06/12 19:07:00
簡潔に書ける

431:デフォルトの名無しさん
08/06/12 19:48:17
>>429
もしパターンマッチがないとすれば、代数的データ型から値を取り出したい場合はどうする?
たとえばHaskellのMaybe型のJust 3という値から、3という値を取り出したい場合はどうする?

432:デフォルトの名無しさん
08/06/12 20:25:17
それはアクセス関数が自動生成されるようにすれば済む話じゃないか

433:デフォルトの名無しさん
08/06/12 20:39:02
>>429
構文糖には何も利点がないとでも?

434:デフォルトの名無しさん
08/06/12 22:33:33
安全なダウンキャストができることとか?

435:デフォルトの名無しさん
08/06/12 22:41:54
>>434
x + yって中間記法、よく出てくるけど何が利点なの?
(+ x y)の構文糖衣のようにも思えるけど


436:デフォルトの名無しさん
08/06/12 22:42:53
>>432
具体的に実装するとすればどうしますか?
MaybeにはNothingという値もあるんですよ。

437:デフォルトの名無しさん
08/06/12 23:11:58
>>436
入力が不適なら例外発生

438:デフォルトの名無しさん
08/06/12 23:24:50
>>437
Maybeは代数的データ型のひとつの定義に過ぎませんよ。
Just aとNothing以外にHogeという値がある別の定義があったらどうするんですか?
定義はいくらでも作れますよ。

439:デフォルトの名無しさん
08/06/12 23:37:45
>>438
言っている意味が分からん
アクセサの自動生成はHaskellが既にやってること(フィールドラベル使ったときに)だし、技術的な問題はないと思うんだが

440:デフォルトの名無しさん
08/06/13 03:16:09
パターンマッチの利点:
簡潔 - 記述しやすい (accessors (or deconstructors) for free)
安全 - non exhaustiveness check
速度 - 分岐が集約されているので最適化が楽 (ifの繰り返しを解析するのにくらべて)
以上。他にあるかな?

(というか、そもそもパターンマッチは関数型言語の特徴ではありません。
関数型言語が採用しているADTの特徴というべきでしょ。)


441:デフォルトの名無しさん
08/06/13 03:29:17
問題

パターンマッチを採用している手続き型言語を挙げよ

442:デフォルトの名無しさん
08/06/13 05:12:14
awkはパターンマッチなのかな

443:デフォルトの名無しさん
08/06/13 08:15:48
マセマティカ
項書換えシステム全般 (論理型も含む)


444:デフォルトの名無しさん
08/06/13 08:24:46
Scalaはcase classがある。
パターンマッチ渡しはできないが、match case文がある。
URLリンク(www.scala-lang.org)
Extractorはユーザ定義もできる。
URLリンク(www.scala-lang.org)

445:デフォルトの名無しさん
08/06/15 00:12:39
SML#はもう開発止まっちゃったの?


446:デフォルトの名無しさん
08/06/16 13:51:28
F#(OCAML系)があるしなあ。

JNI(Java Native Interface)の中の人は、
SML/NJのWin32対応をやっていた人だった。
Modular Monadic Semanticsの人。

447:デフォルトの名無しさん
08/06/16 17:39:37
メンバがわりと沢山ある構造体(record)がいくつか必要な時は皆さん
メンバの名前が被らないように注意してレコード作ってますか?
それともクラスにしますか?

448:デフォルトの名無しさん
08/06/16 21:15:11
>>446
何か勘違いしていると思われ


449:デフォルトの名無しさん
08/06/16 21:15:42
F#があるのとSML#関係なくね?SML.NETの存在は微妙かも知れんけど

450:デフォルトの名無しさん
08/06/16 21:18:34
>>447
モジュール名で区別でおk
OCamlでオブジェクトの濫用はお勧めできない


451:デフォルトの名無しさん
08/06/16 22:45:23
SML#の「#」は、.NETよりも歴史が長い


452:デフォルトの名無しさん
08/06/16 22:45:43
プロジェクト期間終了したから取りあえず一息つきたいんじゃないの?
O堀さんのことだからこれで終りとは思えないが。


453:デフォルトの名無しさん
08/06/17 03:18:35
>>450
おお、目から鱗ですありがとう!
このスレは勉強になります。。
俺もできるならクラスは使いたくなかったので助かりましたわ。

454:デフォルトの名無しさん
08/06/22 02:24:57
SML♯で,配列 data[](要素数 n)と int型の i,j を引数にとって,
要素 data[i] と data[j] を入れ替えた配列 を出力する関数
ってどうやればいいんかいな?

455:デフォルトの名無しさん
08/06/22 22:44:31
宿題ですか?


456:デフォルトの名無しさん
08/06/22 23:37:58
OCamlのStream便利だな。。。何でもかんでもコレ使いたくなっちゃうわ。
何かマズいことあるのかな?

457:デフォルトの名無しさん
08/06/23 01:54:09
マズいことはないけど破壊的なのがなにかと使いにくいと思う。

458:デフォルトの名無しさん
08/06/23 01:56:52
>>457
つまりHaskell最高ってことか?

459:デフォルトの名無しさん
08/06/23 02:57:29
ほとんどのデータがint縛りっていうか、31bit制限があるところがツラいと思うんですが、
色々と工夫というかテクがあるなら教えて頂きたいです。

460:デフォルトの名無しさん
08/06/23 06:54:26
>>456
人生、これストリームなり

461:デフォルトの名無しさん
08/06/23 12:22:57
[1;2;3;4]を入力すると[1;3;6;10]を返す関数sigmaを書いたんですが
sigma関数の箇所、もっと効率的なやり方があるような気がしてむずがゆい感じがしてます。
何かアドバイスいただけないでしょうか

let iota n = List.init n ((+)1) in
let sum lst= List.fold_left (+) 0 lst in
let rec take n lst =
    match n with
    0 -> []
    | 1 -> [List.hd lst]
    | _ -> (List.hd lst)::take (n-1) (List.tl lst) in
let sigma lst =
    List.rev (List.fold_left (fun x y->sum (take y lst)::x) [] (iota (List.length lst))) in
sigma [1;2;3;4;5;6];;

462:デフォルトの名無しさん
08/06/23 13:13:09
累積変数で、これまでの和を持ち運ぶ

463:デフォルトの名無しさん
08/06/23 14:45:07
ありがとう。こんな感じですかね
(途中まで同じ)
let sigma lst =
    let accum = ref [] in
    List.rev (List.fold_left (fun x y-> accum:=y::!accum; sum !accum::x) [] (iota (List.length lst))) in
sigma [1;2;3;4;5;6];;


464:デフォルトの名無しさん
08/06/23 15:38:22
えー。「ここまでの結果」を「引数で」持ちまわるんだよ。再帰終了するところでその引数をそのまま返す。

465:デフォルトの名無しさん
08/06/23 15:59:00
んー、持ち回る引数がfoldの中なので、プログラム全体の形、結構変わりますよね?
こういった変換は慣れていないので、ちょっと時間がかかりそうです

466:デフォルトの名無しさん
08/06/23 17:53:21
iotaとかsumとかtakeとかを使わないで、さらにfoldにこだわらなくて、かつ再帰を使っていいなら
こんなのはどうっすかね?

let sigma l =
let rec sigma' cur r = function
  | [] -> List.rev r
  | x::xs -> let next = cur + x in sigma' next (next :: r) xs in
sigma' 0 [] l


# sigma [];;
- : int list = []
# sigma [1;2;3;4;5;6];;
- : int list = [1; 3; 6; 10; 15; 21]

foldとかを使ったもっとElegante"~{エレガンテ}~"な方法を希望ならスマソ。

467:デフォルトの名無しさん
08/06/23 20:17:29
こんな感じ。

reverse $ snd $ foldl (\(a,xs) b -> let x = a + b in (x,x:xs)) (0,[])

Haskellの構文を使ってるがMLでも同様のはず。

468:デフォルトの名無しさん
08/06/23 20:21:41
pairにする必要ないんじゃ…

tail $ reverse $ foldl (\a b -> (head a + b):a) [0]


469:デフォルトの名無しさん
08/06/23 20:37:13
>>468
おお、こういうのがノータイムで出てくるようになりたいわ。

470:デフォルトの名無しさん
08/06/23 21:44:56
let sigma lst =
let rec sum lst =
match lst with
| [] -> []
| car :: cdr -> (List.fold_left (+) 0 lst) :: (sum cdr) in
List.rev (sum (List.rev lst));;
こんなんどうでっしゃろ?

471:デフォルトの名無しさん
08/06/23 21:48:14
>>467-468
おまいらHaskell大好きだなwwwww

472:デフォルトの名無しさん
08/06/23 22:44:06
MLの構文を知らずにこのスレを覗いてる奴が結構居ると予想

473:デフォルトの名無しさん
08/06/23 22:46:14
関数の中ですぐmatchするのってfunctionで書き直しちゃいたいんだけど。

474:デフォルトの名無しさん
08/06/23 23:08:55
let sigma l =
 let rec aux store = function
 | [] -> []
 | x::xs -> x+store :: aux (x+store) xs
 in
 aux 0 l
これでok。末尾再帰じゃないけど。な。

475:デフォルトの名無しさん
08/06/23 23:31:25
うおお、皆さんありがとう!
いろんなやり方があって勉強になります

476:デフォルトの名無しさん
08/06/23 23:39:06
let ($) g f x = g (f x)
let sigma = (fun s -> rev $ fold_left (fun ys x -> s := x + !s; !s::ys) []) (ref 0)

477:デフォルトの名無しさん
08/06/23 23:43:15
let (@@) f x = f x
let sigma l = (fun s -> rev @@ fold_left (fun ys x -> s := x + !s; !s :: ys) [] l) @@ ref 0

478:デフォルトの名無しさん
08/06/23 23:47:55
let sigma = tl $ rev $ fold_left (fun ys x -> hd ys+x :: ys) [0]

479:Haskell 修業中
08/06/24 04:32:12
すんません。まさに >>472 なんですが…。

import List

sigma = tail.(scanl (+) 0)



480:デフォルトの名無しさん
08/06/24 21:58:08
対象かアーキュムレータの頭を累積値として利用する手もある。

let rec sigma = function
  | [] -> []
  | hd::[] -> hd::[]
  | x::y::tl -> x::(sigma (x+y::tl));;

let sigma_rev l = 
  List.fold_left (fun acc hd ->
    match acc with 
    | [] -> hd::acc
    | last::_ -> hd+last::acc) [] l;;

481:デフォルトの名無しさん
08/06/24 23:31:17
>>479

tail . (scanl (+) 0)

scanl1 (+)
でおっけ

482:Haskell 修業中
08/06/24 23:48:01
>>481
おおっ!そんなのがあるんですね。

やっぱ、Haskellすごいわ
スペースを入れてもわずか10文字w

483:デフォルトの名無しさん
08/06/25 01:45:08
意味不明なライブラリ関数の海で遊んで溺れかけているHaskellianにしか見えない。
逆に、OCamlには関数なさすぎ砂漠なわけだが。


484:デフォルトの名無しさん
08/06/26 17:36:09
Haskellそこらじゅうで大人気だな。
ム板住民の半分はHaskell(かRuby)好きなんじゃないかと思えてくるわ。

OCamlはデフォルトでは関数も文法も少ないけど自分で定義しなさい、みたいな所がCっぽくて好き。

let scanl1 f = function | [] -> [] | (x::xs) -> scanl f x xs
let scanl f x y = List.rev (List.fold_left (fun a b -> (f (List.hd a) b) :: a) [x] y)

scanl1 (+) [1;2;3;4];;
ってできるし。
HaskellとOCamlの差が出てくるのはやっぱりIOとかかね。

485:デフォルトの名無しさん
08/06/26 18:20:16
refを沢山使うprogramをHaskellで書くのは大変。
Ocamlで書くのが大変なのは…特にないな。遅延計算くらいか。

486:デフォルトの名無しさん
08/06/26 18:34:02
ファイルを順々に読んでいく、みたいのはHaskellだと遅延評価だから普通のリストと同じように出来るけど、
OCamlだとバッファリングするとかストリームとか多少は副作用がある方法を使わなきゃいけないかなー。
まあ他の言語ではみんなそうしてるから特に抵抗は無いが。

487:Haskell 修業中
08/06/26 18:35:15
>>485
Streamって遅延計算じゃないんですか?

488:Haskell 修業中
08/06/26 18:37:26
あっ、かぶったw
やっぱりStream使うんですね。

489:デフォルトの名無しさん
08/06/26 18:56:37
Streamはかなり便利だけど、
Haskellでは通常のリスト操作みたいに出来るっていうのはやっぱり魅力だよな。
使い方にもよるがソースがStream.junk ();とかだらけになるのは美しくないので避けたい。


490:デフォルトの名無しさん
08/06/26 20:28:23
>>485
たとえば?
俺がHaskellですっきり書いてやるよ。

491:デフォルトの名無しさん
08/06/27 18:43:09
ocamlcってgccの-O0みたいなオプションないのかな

というかこんなことを平気で聞いてもよさげな初心者スレないのかな

492:デフォルトの名無しさん
08/06/27 22:56:35
というかこんな意味不明なこと平気で聞くなよ。
kwsk


493:デフォルトの名無しさん
08/06/28 01:38:52
>>492
ocamldebugを使ってみた
   ↓
Eventなのに止まらないだと・・・?
   ↓
きっとコンパイラが最適化してるからだ!
   ↓
ocamlのコンパイラって最適化無効にするオプションないのかな←今ここ

ocamldebugのstep実行で止まるはずのポイント飛ばされたり、
プロファイラで使われているはずの関数が未使用と判定されたり、
言語以前にツールの使い方覚えるとこで俺\(^o^)/

494:デフォルトの名無しさん
08/06/28 02:23:23
全然初心者的内容じゃねーじゃん。ocamlc (ocamloptもそうだが) は
最適化みたいなことはほとんどしてないんで。書いたとおりに実行するよ。

優秀なOCamlプログラマを大勢知っていますが、大多数はデバッガの必要を感じていません。
俺もデバッガは使わないので何ともいえんが、何か使いかたを過っているか、
camlの評価順なぞを未理解なのではないかと思われ…


495:デフォルトの名無しさん
08/06/28 03:05:49
>>490
ICFP PC 2007の問題とかどうよ?

RNA実行するだけでも副作用なしだと大変じゃないかな

496:デフォルトの名無しさん
08/06/28 05:35:04
>>494
皆使ってなかったのか・・・
ソース解析する際流れ追うのに使えるかと思ったんだが

>何か使いかたを過っているか、
>camlの評価順なぞを未理解なのではないかと思われ…
どっちも怪しいのでもちっと勉強してくる

497:デフォルトの名無しさん
08/06/28 10:30:39
>>494
そういうのって全部ログコードはいてチェックするんですか?デバッグとそういうやり方併用してるけれど全部それだとチョイきつそう。

498:デフォルトの名無しさん
08/06/28 14:39:27
コードを綺麗に書けば、printf デバッグと、十分なユニットテストで 大抵バグは潰せる。
デバッガでちまちまやる前に、assertion と Printexc.get_backtrace でかなりのことはわかるはずだが。
Cのデバッガのように必須だという認識の人は少ないと思われ。
もちろん使うなとは言わん。ocamldebugはリプレイとか強力。


499:デフォルトの名無しさん
08/06/28 23:12:07
>>498
cの場合は破壊的操作と非破壊的操作をあまり意識せずにプログラミングすることもあるから
余計に必要になってくるのではないか?それに、小さな関数の定義を作って大きくするより、
一つでまとめて操作すると言う習慣も影響してるかも。

500:デフォルトの名無しさん
08/06/28 23:45:19
Cは(普通は)インタプリタがないからっていう部分も大きいと思う。

501:デフォルトの名無しさん
08/06/29 03:08:23
ちょっとcodepadが使えるのか試してみたよ。
URLリンク(codepad.org)

502:デフォルトの名無しさん
08/06/29 03:21:42
C は REPL が無いからね

503:デフォルトの名無しさん
08/06/29 20:22:57
lisp的なREPLを備えたC環境なんてないよな。確かに…

あってもいいんだけど。

504:デフォルトの名無しさん
08/06/29 20:55:26
gdbは?

505:デフォルトの名無しさん
08/06/29 20:58:08
そういえばこんなのがあったの忘れてたわ。

C-REPL
URLリンク(neugierig.org)

506:デフォルトの名無しさん
08/06/29 20:58:59
Haskell製か

507:デフォルトの名無しさん
08/06/29 22:53:12
>>504

>Cのデバッガのように必須だという認識の人は少ないと思われ。

だから普通はそういう事なんだろうなww
まあgdbではlispとかcamlとかみたいに書いて即テストって訳にはいかないがgdbは便利だよな。

508:デフォルトの名無しさん
08/07/05 03:43:57
>>454亀だがちょうど最近覚えたので確認のために
fun swap (date,i,j)=
 let
  val a = Array.sub(date,i)
  val b = Array.sub(date,j)
 in
  Array.update(date,i,b);
  Array.update(date,j,a)
 end
localでArrayをopenしておいたほうが綺麗かも


509:デフォルトの名無しさん
08/07/22 18:35:13
すんまそん、Ocamlで日本語文字は扱えませんか?
例えば正規表現なんかでも使いたいんですが。


510:デフォルトの名無しさん
08/07/22 20:41:48
OCamlのstring型は任意のバイナリが入るので、標準入力とかファイル経由で扱うなら
日本語でもなんでもあり。
ただし、OCamlのソースコードに日本語を埋め込みたいなら、EUC_JP以外使えないと思う。
EUC_JPなら、普通にperl互換正規表現ライブラリのラッパーが使える。
URLリンク(pcre-ocaml.sourceforge.net)
データをUNICODEとして扱うなら、Camomileで日本語「文字」を扱えますね。
URLリンク(camomile.sourceforge.net)

あと、正規表現で日本語を扱う問題はOCamlに限らずどれでも一緒なので、
URLリンク(www.din.or.jp)
あたりをどうぞ。

511:デフォルトの名無しさん
08/07/22 22:03:32
最後のURLは、perlのやり方としては古くて、
(今や\p{Hiragana}という風に"script"を文字クラスとして指定できるので)
「どれも一緒」というよりも、Ocamlだとこのやり方が有効って事になると思います。

512:デフォルトの名無しさん
08/07/22 22:16:11
UTF8 で書いて pcre-ocaml の `UTF8 オプションを使え。あと camomlile。以上。


513:デフォルトの名無しさん
08/07/23 22:25:46
MLtonのFFIを使って、Cのmain関数からSMLを呼びたいのだが、これは
不可能?



514:デフォルトの名無しさん
08/08/10 15:52:08
URLリンク(www.cs.caltech.edu)
こんなのをみっけたけど、ゆうめいなん?

515:デフォルトの名無しさん
08/08/13 08:08:15
OCamlの入門記事
URLリンク(indori.blog32.fc2.com)

516:デフォルトの名無しさん
08/08/13 16:19:54
何よりもピヨが気になる

517:デフォルトの名無しさん
08/08/14 08:38:28
>>515
入門記事というより、入門している記事


518:デフォルトの名無しさん
08/08/14 08:51:30
>> 514
数ヶ月前に見たので、うろ覚えだけど、optional arguments や polymorphic variants が
かなり早期に出てくる。そういう点では、こういう新しい機能をおまけとして解説してきた、
「OCaml を使ってプログラミングを学ぶ」本とは毛色が違い、より OCaml 自体を学ぶ事に
重点が置かれている。class についても最後にかなりページ数が割かれている。


519:デフォルトの名無しさん
08/08/14 09:07:36
>> 518 続き
そういうわけで、ひととおり関数型言語のコンセプトについて理解した人には
OCaml リファレンスとしていいんじゃないかと思う。


520:デフォルトの名無しさん
08/08/14 10:11:59
>>519
解説ありがとう。なるほど他言語をやっていて、始めようとする人向きだということが
分かりました。


521:デフォルトの名無しさん
08/08/17 00:31:48
>>515
Winでパフォーマンス落ちるのはバイトコードの話でしょ?
ネイティブなら問題ない

522:デフォルトの名無しさん
08/08/24 14:59:04
smlからsml#に移行しようとしてるんだけど,
型エラー(?)が出て実行できないのがある.
誰か助けて...

次のレスにエラーが出るプログラムを貼ります.

523:522
08/08/24 15:00:46
リストを使った集合演算のプログラムです.
(他にもエラーが出るプログラムはあるのだけど,
とりあえずある中で一番小さいもの)

まずはシグネチャ

signature SET =
sig

eqtype 'a Set

exception EmptySet

val emptyset : 'a Set
val elem : 'a Set -> 'a * 'a Set
val member : ''a -> ''a Set -> bool
val add : ''a -> ''a Set -> ''a Set
val map : ('a -> 'b) -> 'a Set -> 'b Set
val allelem : ''a Set -> (''a * ''a Set) Set
val fromList : 'a list -> 'a Set
val toList : 'a Set -> 'a list

end;

524:デフォルトの名無しさん
08/08/24 15:01:24
■■学校を作ろう!■■
VIP発でサイトを作ろうと思うんだ。(詳しくはWikiを見てくれ)
パートスレになるんでパー速(GEP)に移動している。
今スタッフを募集しているから、来てくれないか?

■Wiki
URLリンク(www36.atwiki.jp)
■募集スタッフ
プログラム担当(特にErlang、Perl)
デザイナー(サイト上のアイコン、ロゴなど)
WEBデザイナー(サイトデザイン案に沿って、htmlやCSSを書ける)
他にも宣伝担当なども募集している。
■スレ
URLリンク(ex14.vip2ch.com)

525:522
08/08/24 15:02:24
次はストラクチャ(の一部)

structure Set :> SET =
struct

type 'a Set = 'a list;

exception EmptySet;

val emptyset = [];

(* Compute a pair of the element of input lists and rest set *)
fun elem [] = raise EmptySet
| elem (x::xs) = (x,xs);

(* Check whether x is an element of a set *)
fun member _ [] = false
| member x (y::ys) = (x = y orelse member x ys);

526:522
08/08/24 15:05:15
(続き)

(* Add an element to a set *)
fun add a A =
if member a A then A
else a::A;

val map = List.map;

(* Compute {(a,A \ {a}) | a \in A} *)
(* where A is an input set *)
fun allelem A =
let
val (b,B) = elem A
in
add (b,B) (map (fn (c,C) => (c, add b C)) (allelem B))
end
handle EmptySet => emptyset;

fun fromList l = l;
fun toList l = l;

end;

527:522
08/08/24 15:09:53
で,以下を実行するとエラーが出ます.
(SMLでは大丈夫だった)

Set.toList (Set.allelem (Set.fromList [1,2,3,4,5]));

エラーは以下のとおりです.
Diagnoses:
stdIn:12.1-12.49 Diagnosis(typecheckExp 12):
expression type and annotation don't agree
expression type: (int * int Set.Set) Set.Set -> (int * int Set.Set) list
annotation: (int * int Set.Set) Set.Set -> (int * int Set.Set) list
stdIn:12.1-12.49 Diagnosis(typecheckExp 16):
opetator and operand don't agree
operator type: (int * int Set.Set) Set.Set -> (int * int Set.Set) list
operand types: (int * int Set.Set) Set.Set
stdIn:12.1-12.51 Diagnosis(typecheckExp 12):
expression type and annotation don't agree
expression type: (int * int Set.Set -> expression) ->
(int * int Set.Set) list -> expression
annotation: (int * int Set.Set -> expression) ->
(int * int Set.Set) list -> expression
stdIn:12.1-12.51 Diagnosis(typecheckExp 16):
expression type and annotation don't agree
expression type: int * int Set.Set
annotation: int * int Set.Set
stdIn:12.1-12.51 Diagnosis(typecheckExp 12):
expression type and annotation don't agree
expression type: int Set.Set -> expression
annotation: int Set.Set -> expression

528:522
08/08/24 15:11:46
(エラー続き)

stdIn:12.1-12.51 Diagnosis(typecheckExp 16):
expression type and annotation don't agree
expression type: int * int Set.Set
annotation: int * int Set.Set
stdIn:12.1-12.51 Diagnosis(typecheckExp 16):
opetator and operand don't agree
operator type: int Set.Set -> expression
operand types: int Set.Set
stdIn:12.1-12.51 Diagnosis(typecheckExp 16):
opetator and operand don't agree
operator type: (int * int Set.Set -> expression) ->
(int * int Set.Set) list -> expression
operand types: int * int Set.Set -> expression

529:522
08/08/24 15:13:41
(さらに続き)

stdIn:12.1-12.51 Diagnosis(typecheckExp 16):
opetator and operand don't agree
operator type: (int * int Set.Set) list -> expression
operand types: (int * int Set.Set) list
stdIn:12.1-12.51 Diagnosis(typecheckExp 12):
expression type and annotation don't agree
expression type: (int * int Set.Set) list -> expression
annotation: (int * int Set.Set) list -> expression
stdIn:12.1-12.51 Diagnosis(typecheckExp 16):
opetator and operand don't agree
operator type: (int * int Set.Set) list -> expression
operand types: (int * int Set.Set) list
BUG :invalid type

530:デフォルトの名無しさん
08/08/25 02:01:56
数学における記法の話です
大学入試の問題文の冒頭で
「f(x)=x^3+3x^2とする」とあるのですが
この=はC言語と同様に、右辺の関数にfという名前を付けるという
意味での=つまり;=のことでしょうか?

531:デフォルトの名無しさん
08/08/25 02:06:58
C言語では関数に名前をつけるときに=を使わないのでは?

532:デフォルトの名無しさん
08/08/25 02:59:26
>>530 関数型言語MLについて語るスレッドです。

533:デフォルトの名無しさん
08/08/25 04:08:36
>>532
すみません、これだけでいいので分かる方いたら教えてください

534:
08/08/25 05:21:23
WindowsでOCamlを使うには、「MinGW」もしくは「Microsoft Visual C++ and Microsoft Assembler」が必要になります
って読んだんだけどOcamlのコンパイラってCへのトランスレーターなの?

535:デフォルトの名無しさん
08/08/25 07:18:20
アセンブラでsho

536:
08/08/25 16:19:07
アセンブラですか。どうもありがとう。

537:デフォルトの名無しさん
08/08/25 17:17:37
>>530
夏休みも終わりだねえ


538:デフォルトの名無しさん
08/08/25 23:17:08
>>522
閑古鳥の鳴いてるメーリングリストを活性化するために話題を投げてくれ


539:デフォルトの名無しさん
08/08/26 20:17:38
>>522
SML#のバグじゃないかな・・・?
次回アップデートに期待としか。

540:デフォルトの名無しさん
08/08/27 08:46:12
URLリンク(eigenclass.org)


541:デフォルトの名無しさん
08/08/27 08:51:16
warota

542:061123251194.cidr.odn.ne.jp
08/09/19 18:58:37
よいコンパイラの教科書(当然関数型)があれば紹介してください。和英こだわりません。


543:デフォルトの名無しさん
08/09/19 19:00:51
まずはnavi2chのスレをみたほうがいいかもしれない

544:061123251194.cidr.odn.ne.jp
08/09/19 19:05:21
そのようですね。


545:542
08/09/19 19:29:56
おさわがせしました。昔の navi2ch がパスに残っていた、、、ダサいな




546:デフォルトの名無しさん
08/09/19 19:31:39
ところで、
・処理系を関数型言語で書きたい
・関数型言語の処理系を書きたい
どっち?

547:542
08/09/19 19:38:53
コンパイラを書きたい、ですね。(多分書かないけど)


548:デフォルトの名無しさん
08/09/19 19:44:24
ワラ


549:デフォルトの名無しさん
08/09/19 20:24:30
や、だから
・コンパイラを関数型言語で書きたい
・関数型言語のコンパイラを書きたい
のどっちなのかということですよ

550:デフォルトの名無しさん
08/09/19 21:16:48
MLでコンパイラの教科書って有名なの1冊しかないんじゃないの?
いいかどうかは知らない。

551:デフォルトの名無しさん
08/09/19 21:25:48
洋書で青い表紙で虎のやつのこと?モダンなんちゃらだっけ?
EOPLはschemeでML処理系を作るやつだったよね

552:デフォルトの名無しさん
08/09/19 21:27:18
「Modern Compiler Implementation In ML」かな…
持ってるけど、読んでない…

553:デフォルトの名無しさん
08/09/19 22:41:49
まだモダンなのかなぁ

554:デフォルトの名無しさん
08/09/19 23:00:15
近代はずっと近代。もっと新しいのは現代。

555:デフォルトの名無しさん
08/09/20 11:27:06
計算機の本で「コンテンポラリー」を名乗ったものって記憶にないなぁw
なんかあったっけ?

556:デフォルトの名無しさん
08/09/20 11:54:33
まだポスト・モダンが出現してないから。

557:デフォルトの名無しさん
08/09/20 12:10:11
学会のサブタイトルなら見たことある。

558:デフォルトの名無しさん
08/09/20 17:03:51
GODIがインストールできない。bootstrap_stage2で失敗する。

~/Desktop/godi-rocketboost-20080630$ sudo ./bootstrap --prefix /usr/local/godi
...
Bootstrap was successful!
...
Selected GODI section: 3.10
...
~/Desktop/godi-rocketboost-20080630$ PATH=/usr/local/godi/bin:/usr/local/godi/sbin:$PATH
~/Desktop/godi-rocketboost-20080630$ export PATH
~/Desktop/godi-rocketboost-20080630$ sudo ./bootstrap_stage2
.: 1: godi_confdir: not found
Error: Command fails with code 2: /bin/sh
Failure!
~/Desktop/godi-rocketboost-20080630$

なんでだろう。
URLリンク(d.hatena.ne.jp)
の言う通り3.10に対応してないのだろうか?
それとも根本的なところを勘違いしてる?
OCaml初心者ですが、GODIが必要です。

559:デフォルトの名無しさん
08/09/23 09:30:04
> OCaml初心者ですが、GODIが必要です。
この前提が、なんか、もう。


560:デフォルトの名無しさん
08/09/27 19:06:57
NumとかBig_intのプリンタが欲しいとか?

561:デフォルトの名無しさん
08/09/29 10:13:03
たかがそんなもののために GODI が必須で、
GODI がインストールできないから使えない、というのは間違ってますね。

逆に、GODI 依存ユーザからお前のライブラリ GODI にポートしろとか
当然のように言われるのも迷惑です。


562:デフォルトの名無しさん
08/09/29 21:15:32
OCamlってライブラリ関連でコミュニティの足並みそろってないせいで言語の良さがかすんじゃってる感ある。

563:デフォルトの名無しさん
08/09/30 11:52:19
足並み揃えて大きな標準ライブラリ作ればって話は昔からあるし、今もOCamlForgeとかでやってるけど、なかなか成果が出ない。
なんでだろう?

564:デフォルトの名無しさん
08/09/30 13:34:01
これからはHaskellだから

565:デフォルトの名無しさん
08/10/01 16:14:10
windowsXPを使っていて、ML言語を使えるようにしたいので、インストール方法をどなたか教えていただきたいのですが・・・


566:デフォルトの名無しさん
08/10/01 16:17:28
じゃ、f# がいいんじゃない?
インストーラーがあるよ

567:デフォルトの名無しさん
08/10/01 19:53:20
OCamlにだってWindowsのインストーラくらいはさすがにある。

568:デフォルトの名無しさん
08/10/01 23:00:11
>>567
コンパイルできないやつか
コンパイルしても動かないやつしかない

569:デフォルトの名無しさん
08/10/02 08:45:56
>>565
cygwin入れれば標準でocaml入ってるよ。

570:デフォルトの名無しさん
08/10/02 14:34:32
cygwin入れるならデュアルブートか仮想化するなぁ…

571:デフォルトの名無しさん
08/10/03 04:07:14
SML#はプロジェクトのページにインストールから簡単なプログラミングまでチュートリアルがあったはず

572:デフォルトの名無しさん
08/10/03 12:52:15
>>565
こーゆー時のためにURLリンク(ocaml.jp)です。
OCamlのインストール方法からチュートリアルまで揃ってますよ。

573:デフォルトの名無しさん
08/10/03 15:53:52
相変わらずマルチバイト扱いにくいね


574:デフォルトの名無しさん
08/10/03 17:01:09
使い方がさっぱりわからないunicodeライブラリならあるよ

575:デフォルトの名無しさん
08/10/04 00:03:39
>>574
それ扱いやすいって言わないよ~ orz

普段使いで文字列扱うせいでこまるんだよな、言語自体好きなのに。


576:デフォルトの名無しさん
08/10/04 09:44:20
日本語でおk

577:デフォルトの名無しさん
08/10/06 11:30:36
ocamlのコンソールの使いにくさは異常。
pythonならC-b, C-fでカーソルの移動ができたり、
emacsの標準的なキーが使えるから気軽にコンソールでためせる。



578:デフォルトの名無しさん
08/10/06 11:58:55
>>577
ledit使え、と思ったらなんか終わってるらしい。
どうしたものか...

579:デフォルトの名無しさん
08/10/06 12:01:10
rlwrap

580:デフォルトの名無しさん
08/10/06 12:14:31
inf-caml使えばいい

581:577
08/10/06 13:12:12
みなさんありがとうございます。
ためして見たところrlwrapを使うことにしました。

すごいです!!ありがとう!



582:デフォルトの名無しさん
08/10/06 21:34:32
>>578
>ledit使え、と思ったらなんか終わってるらしい。
え、終わってるって、どういうこと?
俺、ledit 使ってるけど

583:デフォルトの名無しさん
08/10/07 12:19:07
>>582
ledit終了 でぐぐるとトップに出てくるブログに書かれてる情報絡みのことじゃないかと

584:デフォルトの名無しさん
08/10/09 11:03:05
3.11 のブランチ release311 が ocaml-cvs に出来ました。おそらくもうすぐリリースですね。

3.11 の目玉

* native判のモジュールの dynamic link
* private abbreviation type
* Printexc.print_backtrace 等、デバッグに役立ちそうな backtrace 系関数数種
* ocamlnat: native の toplevel (デフォルトでは作らないそうな)


585:デフォルトの名無しさん
08/10/09 12:12:17
>native判のモジュールの dynamic link

これって既に10で出来るようになったんじゃなかったけ?
と思ったら、今は dynlink.cmxa をリンクしないといけないのか
これは便利だな

586:デフォルトの名無しさん
08/10/10 12:01:15
法政大学の児玉先生の所におかれている
URLリンク(yk.i.hosei.ac.jp)

をいまどきのSMLNJで動かすにはどう変更したらよいでしょうか.
ord(#"0")はすぐわかりましたが,lookaheadなどがcharを期待してして
いるのが仕様変更になったようで,elem をどうやってやればcharで
使えるのかが判然としません.


587:デフォルトの名無しさん
08/10/15 09:18:45
OCamlの次世代デファクトスタンダードライブラリを目指すBatteriesがα1をリリースしたらしい。

URLリンク(dutherenverseauborddelatable.wordpress.com)

一応前から内容は見ていて、OCamlのベースライブラリをモダンな階層構造に再編集しているのはすばらしいと思う。
ただ、ちょっと既存の外部ライブラリに頼りすぎていて、枝葉になるほど寄せ集め感が否めないのが気になる。
将来これに一本化されていくのかなー?私もこれに乗るのかどうか、今悩み中。


588:デフォルトの名無しさん
08/10/15 15:52:01
過疎ってるからって hatena からそのままコピペするのはよそうよ


589:osiire
08/10/15 19:04:27
誰ですか、私のエントリーをコピペしたのは。
別にいいですけど、一人称くらい変更してくれてもいいのに。

590:デフォルトの名無しさん
08/10/24 21:49:05
3.11の目玉の一つの、private abbreviation type って何でしょか?
private typesでもなくprivate row typesでもない、なにか?まぎらわしー。

591:デフォルトの名無しさん
08/10/26 20:54:39
過疎ってるから
俺がocaml勉強日記を書いてあげようか?

わからないことがあったら答えて下さいね!

592:デフォルトの名無しさん
08/10/26 23:04:30
断る

593:デフォルトの名無しさん
08/10/26 23:12:42
面白くなりそうだったらいいよ。

594:デフォルトの名無しさん
08/10/26 23:21:06
>>591
おう、かいてたらいいよ。

595:デフォルトの名無しさん
08/10/27 10:53:31
module M : sig
type nat = private int
val nat_of_int : int -> nat
val int_of_nat : nat -> int
end = struct
type nat = int
let nat_of_int n =
(assert (n >= 0));
n
let int_of_nat n = n
end


596:デフォルトの名無しさん
08/10/27 15:21:06
>>595
レスどうも。
この例は、signatureでtype natとして隠蔽した場合と何が違うのでしょう?
試してもprinterが<abstr>になるかどうかくらいしか違い分かりませんでした。
どういう利用法があります?

597:デフォルトの名無しさん
08/10/27 15:53:58
ぐぐったらあったorz ↓
URLリンク(d.hatena.ne.jp)
subtypingとは気づかなかった。

598:デフォルトの名無しさん
08/11/01 12:46:43
nullとnilの違いを教えてください。

599:デフォルトの名無しさん
08/11/01 13:20:42
null:物の表面に液や塗料をなすりつけること。
nil:食物を、水または調味料を加えた汁に入れて加熱し、食べられる状態にすること。

600:デフォルトの名無しさん
08/11/01 14:51:15
>>599
スレリンク(tech板)l50

601:デフォルトの名無しさん
08/11/02 02:49:24
SMLにおいて、nullとnilの違いを教えてください。


602:デフォルトの名無しさん
08/11/02 02:53:01
nilは空のリスト。
nullはListストラクチャーの、リストを受け取りnilかどうかをboolで返す関数。

603:デフォルトの名無しさん
08/11/02 03:21:30
nullp

604:デフォルトの名無しさん
08/11/02 03:35:53
>>599
ウケ狙いなら、残念。もう一ひねりホシイ。

605:デフォルトの名無しさん
08/11/02 07:43:26
ウケ狙いならって・・・
他に何があるというのか小1時間(ry

606:デフォルトの名無しさん
08/11/04 06:30:51
独学でSMLの本を使いながら関数言語を学んでいるのですが、上手くできない問題があり困っています。

replicate(4);
と打つと、
val it = [1,2,2,3,3,3,4,4,4,4] : int list
といった感じに1を一つ,2を二つ、3を三つ、4を四つといったリストを
出力されるSMLのリカーシブメソッドを書きたいのですが、上手く行きません。分かる方教えていただけると助かります。

607:デフォルトの名無しさん
08/11/04 07:09:08
うまくいかなかったやつを載せてみてよ。

608:デフォルトの名無しさん
08/11/04 08:14:40
>>606
リカーシブメソッドっていうのが何を差してるのか分からないけど、
入力: 自然数n
出力: 要素が全てnで長さnのリスト
とするサブ関数使えばいいんじゃない?

609:デフォルトの名無しさん
08/11/04 08:21:09
n
[1,2,3,...,n]
[1,22,333,...,n,n,n,n,]
の二行目から三行目で>>608使えばいいな。

610:デフォルトの名無しさん
08/11/04 09:16:29
recursive
再帰だな。

611:608
08/11/04 09:29:59
とりあえず作ってみた。
>>609のやりかたとは違います。
↓にあっぷしてみたので、ご参考までに。
URLリンク(www2.uploda.org)
(パスは sml です)

入力は自然数(0以上)を仮定しています。

612:デフォルトの名無しさん
08/11/04 12:47:57
あー、答えちゃったの?どう読んでも宿題なんだから、自分で考えさせてあげなきゃ。

613:608
08/11/04 18:17:23
>>612
やっぱそうだよねぇ。
「独学で」なんて書いてるから、
にっちもさっちも行かなくなったと思っちゃったんだよね。
やっぱ、寝ないとだめだな。

614:デフォルトの名無しさん
08/11/04 23:34:42
>>612>>613
良く寝て頭を休めろ。

615:デフォルトの名無しさん
08/11/05 00:11:55
SMLならメソッドじゃなくてファンクションだろ、とどうでもいい突っ込み。
再帰関数はn-1番目からn番目を導出する定義をそのまま書くのがコツ。
もう>>606は見てないだろうけど。

616:デフォルトの名無しさん
08/11/05 00:43:05
宿題でも独学でもどっちでもいいのでは。

617:デフォルトの名無しさん
08/11/05 00:55:48
URLリンク(xy.yu.to)
始終荒れまくりの海外サーバ絵チャだ

一人の神プログラマーが強すぎてマクロ荒しが全く太刀打ちできてない。
荒しプログラマーは全員退散!!
誰か倒してくれwwwwww


618:デフォルトの名無しさん
08/11/05 01:15:09
>>611
わざわざお答え頂ありがとうございます。
一応こちらもパターンマッチングでない、if - elseの方法で出来ました。ネストしたループのfunctionの前にletが抜けていただけでした。
参考になりました。

619:デフォルトの名無しさん
08/11/05 04:09:40
>>618
こういう課題は論理型の方がすっきりした定義になるね。

620:デフォルトの名無しさん
08/11/09 12:02:17
すんません教えてください。

(int -> int -> int) -> int

という関数の定義例が分かりません。

(int -> int) -> int -> int なら
たとえば
let func = fun f x -> (f 2) * x;;
でいいことが分かるのですが、

(int -> int -> int) -> int
だとわからなくなります。

『二つのintを引数とし、intを返す関数』を一つの引数としてとり
intを返す関数というふうに理解してます。

コードはどのように考えればよいんでしょうか?

621:デフォルトの名無しさん
08/11/09 12:48:12
なんでもいいけど
let func f = (f 1 2) + 3;;

622:デフォルトの名無しさん
08/11/09 14:05:34
>>621
ありがとうございます。
理解しました。

623:デフォルトの名無しさん
08/12/23 03:10:20
ふと気づいたらOCaml3.11.0キテター

624:デフォルトの名無しさん
08/12/23 10:16:58
おお。
Mozartの64bit版も来ないかなぁ・・・クリスマスプレゼントに

625:デフォルトの名無しさん
08/12/25 13:35:35
mac leopardにsmlインストールしようと長いこと奮闘しているのですが、どうにも上手くいきません。
どなたか導入に関してわかりやすいサイトありましたら、教えてください。

626:デフォルトの名無しさん
08/12/27 16:39:09
Macports使えよ


627:デフォルトの名無しさん
08/12/29 12:31:58
>626
やっと入れられた。ありがとう。

628:デフォルトの名無しさん
08/12/29 12:34:37
>>625
なんだ、お前も最近増えてきたにわかマカか

629:デフォルトの名無しさん
08/12/29 13:04:14
>>628
人生にお疲れのようですね。

630:デフォルトの名無しさん
09/01/01 23:05:22
引く手あまたのプログラミング言語は?
URLリンク(slashdot.jp)
---
Java(16479件)、C++(8080件)、C#(7780件)、JavaScript(6749件)、
Perl(5710件)、PHP(2641件)、Python(1408件)、COBOL(1207件)、
Ruby(769件)、Lisp(33件)といった感じらしい。

とりあえずJavaとC/C++/C#、あとJavaScriptを覚えれば、
当分仕事には困らないようである。COBOLのしぶとさも目立つ。

ちなみにHaskellやOCamlの求人は10以下だったそうだ。
---

631:デフォルトの名無しさん
09/01/03 03:15:13
当然だ。HaskellやOcamlの素晴らしさを理解できる人種は
限られているからな。JavaやC++みたいな糞言語を使う糞グ
ラマがいる限り日本のIT産業の生産性は低いままだろう。
今必要とされているのは我々のような高い能力をもつエンジ
ニアであるにも関わらずスーツ族にはそりがわからんのですよ。
うはwテラガンダムwww俺自重www

こうですかわかりません

632:デフォルトの名無しさん
09/01/03 05:18:13
パラダイムシフトはある日突然のように起こる

633:デフォルトの名無しさん
09/01/03 11:20:18
>>631
職業プログラマは免許制にすればいいんじゃね?

634:デフォルトの名無しさん
09/01/03 11:43:11
>>633
情報処理技術者試験の実務への役立ち度を考えると・・・

635:デフォルトの名無しさん
09/01/03 12:03:45
プログラマの能力なんて知ってる知らないでは計れない。圧倒的多数の凡グラマーとごく一部の神グラマーww

636:デフォルトの名無しさん
09/01/03 13:21:35
>>634
試験は基本中の基本の事柄が出てくるだけだよ。
実務には直接関係ないかもしれないが、その程度のことも知らないようでは
応用性がなくて35歳で定年を迎えるだけ。
ソフトウェア開発を一生仕事にできるのは基本を知っている人間だけだよ。

637:デフォルトの名無しさん
09/01/03 13:42:15
>>636
へえー

638:デフォルトの名無しさん
09/01/03 16:58:45
ソフ開で午後八割くらい午前四割くらいのおれは生きててはだめということですね。わかります

639:デフォルトの名無しさん
09/01/03 17:58:29
>>633
盲目的に試験勉強する人間はもううんざりだな。

640:デフォルトの名無しさん
09/01/03 18:06:33
>>639
たとえばプログラマでも東大院卒と公立高校卒とでは、やはり東大卒のほうが優秀な奴が多いよ。

641:デフォルトの名無しさん
09/01/03 18:59:38
そりゃそうだ
スタートは同じでも高卒と大卒では行き着く先が違う

642:デフォルトの名無しさん
09/01/03 19:50:26
で、高卒は35歳で定年退職です

643:デフォルトの名無しさん
09/01/04 07:25:19
>>642
私のように35才でPrologを始めて、それでプログラマになれたというケースは
どう考えればいいのかな。大学一年で中退してるから、高卒だけど。

644:デフォルトの名無しさん
09/01/04 08:44:37
年齢といい、言語といいそれなりにレアケースかと。
まぁ35ではじめてもいけるとは思うけどね。多分それまでに理論的な思考が身についてないときついと思うが。

645:デフォルトの名無しさん
09/01/04 09:20:24
論理型とか関数型を裏にある数学的な背景も併わせて押えとけば
手続き型でやるより長生きできるのかなーとか思ったり

646:デフォルトの名無しさん
09/01/04 10:09:45
PrologとMLがそんなに差があるわけもないのであって、
40才から始めても大丈夫って言わなくちゃいけないのではないか。
関数型のスレで高卒限定でも35才定年はないと思うよ。

647:デフォルトの名無しさん
09/01/04 12:15:36
>>643
辞めた理由による。
高卒と大学中退は若干違う。

648:デフォルトの名無しさん
09/01/05 18:35:36
35歳でプログラミング始めるのは全然無理ではないし、
業界未経験でPrologのみ扱える35歳が職業プログラマとして入り込めるのも、この業界w
かつての業界成長期にはタクシー運転手や大工から転職してきた人も珍しくなかった。



次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch