関数型言語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/
探検
関数型言語ML (SML, OCaml, etc.), Part 6
■ このスレッドは過去ログ倉庫に格納されています
2009/06/15(月) 07:15:21
541デフォルトの名無しさん
2012/07/25(水) 22:13:31.14542デフォルトの名無しさん
2012/07/28(土) 13:56:10.63 >>541
~-.0.7 と書いても良いね
~-.0.7 と書いても良いね
543デフォルトの名無しさん
2012/07/29(日) 11:24:50.70 いつの間にか OCaml4.00.0
544デフォルトの名無しさん
2012/07/29(日) 12:34:47.25 岡村4.00.0
545デフォルトの名無しさん
2012/07/30(月) 17:15:20.50 OCaml
コンパイルして、nativeなコード吐いて、不思議な実行のさせかたしてるのね
コンパイルして、nativeなコード吐いて、不思議な実行のさせかたしてるのね
546デフォルトの名無しさん
2012/07/30(月) 22:50:31.73 どのへんが不思議なんだ?
547デフォルトの名無しさん
2012/08/12(日) 14:06:23.13 わからない?
548デフォルトの名無しさん
2012/08/12(日) 23:04:07.50 わからない。教えて下さい。お願いします。
549デフォルトの名無しさん
2012/08/13(月) 00:04:10.53 #!/usr/bin/ocamlrun
550デフォルトの名無しさん
2012/08/13(月) 01:29:14.36 nativeの意味を取り違えてない?
551デフォルトの名無しさん
2012/08/13(月) 03:03:42.64 スクリプトじゃないのはdumpすればわかるでしょ
552デフォルトの名無しさん
2012/08/13(月) 11:53:42.11553デフォルトの名無しさん
2012/08/29(水) 23:04:20.96 ねんがんのLittle MLerをてにいれたぞ
OCamlの場合の読み替え方法も載ってるけど、素直にSMLでやった方が良いのかな
てか読んでる人はいるんだろうか・・・
OCamlの場合の読み替え方法も載ってるけど、素直にSMLでやった方が良いのかな
てか読んでる人はいるんだろうか・・・
554デフォルトの名無しさん
2012/09/02(日) 03:59:59.39 以下の関数でprint_int x という文を入れると構文エラーになってしまうのですが、何がいけないのでしょうか?
let hoge x =
print_int x ← これ
if x=0 then 0
else x + 10
let test1 = hoge 0 = 0
let test2 = hoge 10 = 20
# #use "printtest.ml";;
File "printtest.ml", line 3, characters 4-6:
Error: Syntax error ← 原因は?
let hoge x =
print_int x ← これ
if x=0 then 0
else x + 10
let test1 = hoge 0 = 0
let test2 = hoge 10 = 20
# #use "printtest.ml";;
File "printtest.ml", line 3, characters 4-6:
Error: Syntax error ← 原因は?
555デフォルトの名無しさん
2012/09/02(日) 08:57:34.05 print_int x;
556デフォルトの名無しさん
2012/09/02(日) 10:39:53.93557デフォルトの名無しさん
2012/09/02(日) 10:47:02.65 ocamlか。おかのコードはごみごみしくて醜いな
558デフォルトの名無しさん
2012/09/02(日) 10:53:23.84 print_string "あ、OCamlです。言ってませんでしたね。すいません¥n";
559デフォルトの名無しさん
2012/09/02(日) 15:19:34.02 >>556
インタプリタの文の区切りは ;; (セミコロンが2つ)
逐次実行は ; (この場合セミコロンの前の式の型が unit でない場合警告が出る)
配列の区切りも ; (これは配列の括弧 [ ] の中でのみ出現する)
インタプリタの文の区切りは ;; (セミコロンが2つ)
逐次実行は ; (この場合セミコロンの前の式の型が unit でない場合警告が出る)
配列の区切りも ; (これは配列の括弧 [ ] の中でのみ出現する)
560デフォルトの名無しさん
2012/09/28(金) 23:37:26.16 .net におけるOcamlがF#ですが、
JVM上でのOcaml相当のものはないのでしょうか?
JVM上でのOcaml相当のものはないのでしょうか?
561デフォルトの名無しさん
2012/09/29(土) 11:26:57.28 OCaml-Javaは? http://ocamljava.x9c.fr/
562デフォルトの名無しさん
2012/09/30(日) 17:21:46.18563デフォルトの名無しさん
2012/10/03(水) 00:49:32.12 http://www.lexifi.com/ml2012/
今年のMLワークショップでもocaml-javaの紹介してたみたい。
どのぐらい出来てるんだろう。
パフォーマンスの話も載ってた。
1/3ぐらい?
今年のMLワークショップでもocaml-javaの紹介してたみたい。
どのぐらい出来てるんだろう。
パフォーマンスの話も載ってた。
1/3ぐらい?
564デフォルトの名無しさん
2012/10/12(金) 11:22:15.18 # type t = int * t;;
Error: The type abbreviation u is cyclic
# type t = { x: int; y: t };;
type t = { x : int; y : t; }
# type u = u option;;
Error: The type abbreviation u is cyclic
# type u = Some of u | None;;
type u = Some of u | None
だれか解説してくれ。
Error: The type abbreviation u is cyclic
# type t = { x: int; y: t };;
type t = { x : int; y : t; }
# type u = u option;;
Error: The type abbreviation u is cyclic
# type u = Some of u | None;;
type u = Some of u | None
だれか解説してくれ。
565デフォルトの名無しさん
2012/10/12(金) 12:17:07.41 >>563
http://shootout.alioth.debian.org/
の中くらいのサイズのやつを8つベンチマーク。
0.96倍から7.14倍の実行速度。
3倍内に収まったのが6つあるぜ。
intを扱うベンチが遅い。boxingされちゃうから。
そういうベンチを省くと平均で倍は遅くない。
http://shootout.alioth.debian.org/
の中くらいのサイズのやつを8つベンチマーク。
0.96倍から7.14倍の実行速度。
3倍内に収まったのが6つあるぜ。
intを扱うベンチが遅い。boxingされちゃうから。
そういうベンチを省くと平均で倍は遅くない。
566デフォルトの名無しさん
2012/10/12(金) 12:26:46.91567デフォルトの名無しさん
2012/10/12(金) 17:55:16.91 >>564
(**** スマンがOCamlは久しく触っていないので、SMLで解説してみる -- 処理系は SML/NJ ****)
- type t = int * t;
Error: unbound type constructor: t
(* まだ束縛されていない型構成子 t を右辺の型式内で参照しているからエラー *)
- type t = { x: int, y: t};
Error: unbound type constructor: t
(* 最初の例と同様に、型構成子 t はまだ束縛されていないのでエラー *)
- type u = u option;
Error: unbound type constructor: u
(* これも同じ理由でエラー *)
- datatype u = Some of u | None;
datatype u = None | Some of u
(* 上記のtype宣言文とは異なり、datatype宣言文であれば再帰的なデータ型定義が許されている *)
(**** 以上だけど、SMLなら不可解な振る舞いは無く、現象を明解に説明できるよ.... ****)
(**** スマンがOCamlは久しく触っていないので、SMLで解説してみる -- 処理系は SML/NJ ****)
- type t = int * t;
Error: unbound type constructor: t
(* まだ束縛されていない型構成子 t を右辺の型式内で参照しているからエラー *)
- type t = { x: int, y: t};
Error: unbound type constructor: t
(* 最初の例と同様に、型構成子 t はまだ束縛されていないのでエラー *)
- type u = u option;
Error: unbound type constructor: u
(* これも同じ理由でエラー *)
- datatype u = Some of u | None;
datatype u = None | Some of u
(* 上記のtype宣言文とは異なり、datatype宣言文であれば再帰的なデータ型定義が許されている *)
(**** 以上だけど、SMLなら不可解な振る舞いは無く、現象を明解に説明できるよ.... ****)
568デフォルトの名無しさん
2012/10/12(金) 18:44:39.63 >>564
abbreviationではない新しい型がcyclicかどうかは仕様を決める人が自由に決める
一方、タプルとoptionがcyclicではないという仕様は既に決まっているので
タプルのabbreviationとoptionのabbreviationはcyclicではないはず
abbreviationではない新しい型がcyclicかどうかは仕様を決める人が自由に決める
一方、タプルとoptionがcyclicではないという仕様は既に決まっているので
タプルのabbreviationとoptionのabbreviationはcyclicではないはず
569デフォルトの名無しさん
2012/10/12(金) 19:52:28.31 >>565
おお、ちゃんと動くもんなんだね!
おお、ちゃんと動くもんなんだね!
570デフォルトの名無しさん
2012/10/13(土) 10:18:23.39 おお。皆さん回答ありがとう。
>> 566
値を作れないわけではなかったりする。
# type t = { x: int; y: t };;
type t = { x : int; y : t; }
# let rec loop () = loop ();;
val loop : unit -> 'a = <fun>
# { x = 0; y = { x = 1; y = loop () } };;
いや、作れてはいないんだけど、型は付く。
CPS っぽい感じのプログラムで最後に exit するような場合、こういう型が出現することもある…気がする。
tuple で許されず、 record で許されるのに何か理由があるのかと思ったけど、
>>567 さんの通り、 SML ではどちらも許されないそうだし、あんまり深い意味はないのかな。
>>568
人(言語仕様)が自由に決めるとして、なんでこんなチグハグに(素人目には)見える仕様に
なってるのかなーという。 record が通るってことは、どっちの仕様でも型安全性は保証されるのだよね?
それぞれの仕様の pros/cons が知りたい。
あと、 option の方は、処理系が option の内容を辿るように頑張って実装すればイケるのか、
型理論的になにか問題があるのかよく分からない。
>> 566
値を作れないわけではなかったりする。
# type t = { x: int; y: t };;
type t = { x : int; y : t; }
# let rec loop () = loop ();;
val loop : unit -> 'a = <fun>
# { x = 0; y = { x = 1; y = loop () } };;
いや、作れてはいないんだけど、型は付く。
CPS っぽい感じのプログラムで最後に exit するような場合、こういう型が出現することもある…気がする。
tuple で許されず、 record で許されるのに何か理由があるのかと思ったけど、
>>567 さんの通り、 SML ではどちらも許されないそうだし、あんまり深い意味はないのかな。
>>568
人(言語仕様)が自由に決めるとして、なんでこんなチグハグに(素人目には)見える仕様に
なってるのかなーという。 record が通るってことは、どっちの仕様でも型安全性は保証されるのだよね?
それぞれの仕様の pros/cons が知りたい。
あと、 option の方は、処理系が option の内容を辿るように頑張って実装すればイケるのか、
型理論的になにか問題があるのかよく分からない。
571デフォルトの名無しさん
2012/10/13(土) 10:30:56.43 ああ書いていて気づいた。 record は mutable なフィールドを許すから、
# type t = { x: int; mutable y: t };;
type t = { x : int; mutable y : t; }
# let rec v = { x = 0; y = v };;
こういう循環している値を使うことが普通にあるわけで、 cyclic な型を認めておいた方が便利なのだ。
一方で tuple は常に immutable だから、無限ループになるような通常は起こりにくい状況でしか
cyclic な型が出てこない。
たぶん。
# type t = { x: int; mutable y: t };;
type t = { x : int; mutable y : t; }
# let rec v = { x = 0; y = v };;
こういう循環している値を使うことが普通にあるわけで、 cyclic な型を認めておいた方が便利なのだ。
一方で tuple は常に immutable だから、無限ループになるような通常は起こりにくい状況でしか
cyclic な型が出てこない。
たぶん。
572デフォルトの名無しさん
2012/11/03(土) 17:26:40.17 久々にtuareg-mode使ったけど、インデントが変わったのな。
昔のはletをネストするとだんだん右に行って見づらかった
昔のはletをネストするとだんだん右に行って見づらかった
573デフォルトの名無しさん
2012/11/07(水) 04:55:27.01 Ocaml関数引数の省略説明って簡単に嵌ってしまた
let plus x y = x + y
let incr = plus 1
incr 1
2
let minus x y = x - y
let decr = minus 1
decr 2
-1 ????
let decr = plus -1
error
let decr = plus (-1)
decr 2
1
let decr x = minus x 1
decr 2
1
こんな感じww
途中で
val incr : int -> int = <fun>
こんな説明出てくるけど、何それ?ってw
let plus x y = x + y
let incr = plus 1
incr 1
2
let minus x y = x - y
let decr = minus 1
decr 2
-1 ????
let decr = plus -1
error
let decr = plus (-1)
decr 2
1
let decr x = minus x 1
decr 2
1
こんな感じww
途中で
val incr : int -> int = <fun>
こんな説明出てくるけど、何それ?ってw
574デフォルトの名無しさん
2012/11/07(水) 19:10:06.18 そうですね。
575デフォルトの名無しさん
2012/11/08(木) 20:48:16.69 例えばこの例は間際らしい
let capitalize = function
| 'a' .. 'z' as letter -> Char.uppercase letter
| 'A' .. 'Z' as letter -> letter
| _ -> failwith "Not a valid letter"
これを、こう書き換えても問題ない
let capitalize = function
| 'a' .. 'z' as lett -> Char.uppercase lett
| 'A' .. 'Z' as lette -> lette
| _ -> failwith "Not a valid letter"
何が言いたいかと言うと、初見の場合as letter が何か特別な予約語に思えて混乱する(letterの綴りが省略されていないため)
で、下のように書き換えて動作を確認した
let capitalize = function
| 'a' .. 'z' as letter -> Char.uppercase letter
| 'A' .. 'Z' as letter -> letter
| _ -> failwith "Not a valid letter"
これを、こう書き換えても問題ない
let capitalize = function
| 'a' .. 'z' as lett -> Char.uppercase lett
| 'A' .. 'Z' as lette -> lette
| _ -> failwith "Not a valid letter"
何が言いたいかと言うと、初見の場合as letter が何か特別な予約語に思えて混乱する(letterの綴りが省略されていないため)
で、下のように書き換えて動作を確認した
576デフォルトの名無しさん
2012/11/11(日) 07:45:41.63 これ
let head_head = function
| [] -> failwith "the list is empty"
| []::_ -> failwith "the head is the empty list"
| (h::_)::_ -> h
head_head [[1;2;3];[4;5;6]]
1
とか、listのlistから、頭のlistの頭を取り出す関数なんだけど
head_head []
head_head [[];[1]]
とかはエラーを返すけど
head_head [1;2;3]
とかするとlistの要素がlistじゃないってエラーが出てくる
この場合を検出してエラーを返す書き方が思いつかない
検出する意味も必要もないのかどうかも分からない
let head_head = function
| [] -> failwith "the list is empty"
| []::_ -> failwith "the head is the empty list"
| (h::_)::_ -> h
head_head [[1;2;3];[4;5;6]]
1
とか、listのlistから、頭のlistの頭を取り出す関数なんだけど
head_head []
head_head [[];[1]]
とかはエラーを返すけど
head_head [1;2;3]
とかするとlistの要素がlistじゃないってエラーが出てくる
この場合を検出してエラーを返す書き方が思いつかない
検出する意味も必要もないのかどうかも分からない
577デフォルトの名無しさん
2012/11/11(日) 08:04:45.04 head_headの型を理解してるか?
578デフォルトの名無しさん
2012/11/11(日) 09:47:55.90 はい、たぶん
基本[[];[]]な形式、list のlist構造
でも、なんか色々自由がありそうと感じる分、制約とか制限についての認識が欠落してしまう
制約制限がないと意味不明のバクが爆発するから必須なんだけど
なのに、魂が叫ぶ、もっと自由にやらせろ
間違って[1;2;3]な通常のlistを渡したときなんとか出来そうな思い込みをしてしまう。
[]要素のないlist
[[];[1;]] listの最初のlistが[]なlist
[[];[]] 同上
[1;2;3] 必要な要件を全然満たさないlist構造
基本[[];[]]な形式、list のlist構造
でも、なんか色々自由がありそうと感じる分、制約とか制限についての認識が欠落してしまう
制約制限がないと意味不明のバクが爆発するから必須なんだけど
なのに、魂が叫ぶ、もっと自由にやらせろ
間違って[1;2;3]な通常のlistを渡したときなんとか出来そうな思い込みをしてしまう。
[]要素のないlist
[[];[1;]] listの最初のlistが[]なlist
[[];[]] 同上
[1;2;3] 必要な要件を全然満たさないlist構造
579デフォルトの名無しさん
2012/11/11(日) 14:45:44.54 型が違えば処理系に弾かれてお終い
580デフォルトの名無しさん
2012/11/11(日) 18:10:18.79 考え方が動的型付けに染まってる印象。
581デフォルトの名無しさん
2012/11/12(月) 02:30:05.37582デフォルトの名無しさん
2012/11/17(土) 14:20:04.43 let f = function
| [] -> failwith "empty list"
| [| _; (_, x) |]::_ -> x
| _ -> failwith "the first array should be of size two"
に
f [[|(1,2);(3,4)|];[|(5,6);(7,8)|]];;
でint = 4の結果が得られる
でも、 エラー"the first array should be of size two"が表示される引数が上手く作れない
システムが先にエラーを吐き出す。
| [] -> failwith "empty list"
| [| _; (_, x) |]::_ -> x
| _ -> failwith "the first array should be of size two"
に
f [[|(1,2);(3,4)|];[|(5,6);(7,8)|]];;
でint = 4の結果が得られる
でも、 エラー"the first array should be of size two"が表示される引数が上手く作れない
システムが先にエラーを吐き出す。
583デフォルトの名無しさん
2012/11/17(土) 18:42:30.31 # f [[|(1,2)|];[|(5,6);(7,8)|]];;
Exception: Failure "the first array should be of size two".
いかんのか?
Exception: Failure "the first array should be of size two".
いかんのか?
584デフォルトの名無しさん
2012/11/17(土) 19:34:18.32 >>583
ありがとうございます。
出来ました。
関数fの受け付ける
('a * 'b) array list -> 'b = <fun>
の形式がどの様な表現なのか直感的に理解できなかったので助かりました。
('a * 'b) array list形式の引数が与えられると
2番目の条件にマッチングできなくて、3つ目の条件で"the first ~~ two"が表示されるんですね。
[[|(1,2)|]] の様に表現するとタイプミスマッチとか処理系がエラーを出すと思っていました。
でも、('a * 'b) array list形式なので引数としては間違っていない。
ありがとうございます。
出来ました。
関数fの受け付ける
('a * 'b) array list -> 'b = <fun>
の形式がどの様な表現なのか直感的に理解できなかったので助かりました。
('a * 'b) array list形式の引数が与えられると
2番目の条件にマッチングできなくて、3つ目の条件で"the first ~~ two"が表示されるんですね。
[[|(1,2)|]] の様に表現するとタイプミスマッチとか処理系がエラーを出すと思っていました。
でも、('a * 'b) array list形式なので引数としては間違っていない。
585デフォルトの名無しさん
2012/11/19(月) 03:26:09.19 結局、[1,2]と入力すると[(1,2)]と返ってくるのでlistの要素構造を勘違いしてた(この部分"[(1,2)]"を見落とし)
[1;2]は整数1と2によるlist、これと[(1,2)]の省略した入力[1,2]と混同してた
だから、[1;(2,3)]とか入力してエラー出されて??な感じ。
正しくは、[(1,4);(2,3)]と表現しないといけない。
[1,4;2,3]とタイプしても正しく[(1,4);(2,3)]と返ってくる
こんな初歩的な部分で躓くとは、これではソースが読めないわけだ。
[1;2]は整数1と2によるlist、これと[(1,2)]の省略した入力[1,2]と混同してた
だから、[1;(2,3)]とか入力してエラー出されて??な感じ。
正しくは、[(1,4);(2,3)]と表現しないといけない。
[1,4;2,3]とタイプしても正しく[(1,4);(2,3)]と返ってくる
こんな初歩的な部分で躓くとは、これではソースが読めないわけだ。
586デフォルトの名無しさん
2012/12/02(日) 17:11:41.64 http://caml.inria.fr/pub/docs/manual-ocaml-4.00/expr.html
には書いてないけど、+ や +. って - -. と同じく二項演算子かつ単項演算子じゃないのか?
+. (1.0 + 2.0);; とか通るし。
には書いてないけど、+ や +. って - -. と同じく二項演算子かつ単項演算子じゃないのか?
+. (1.0 + 2.0);; とか通るし。
587デフォルトの名無しさん
2012/12/02(日) 17:46:32.55 Characters 4-7:
+. (1.0 + 2.0);;
^^^
Error: This expression has type float but an expression was expected of type
int
+. (1.0 + 2.0);;
^^^
Error: This expression has type float but an expression was expected of type
int
588デフォルトの名無しさん
2012/12/02(日) 17:57:04.40 +. (1.0 +. 2.0);;
589デフォルトの名無しさん
2012/12/03(月) 01:35:54.04 Characters 0-2:
+. (1.0 +. 2.0);;
^^
Error: Syntax error
+. (1.0 +. 2.0);;
^^
Error: Syntax error
590デフォルトの名無しさん
2012/12/03(月) 01:37:54.28 parsing/parser.mliを見ると確かにそうらしい
| subtractive expr %prec prec_unary_minus
{ mkuminus $1 $2 }
| additive expr %prec prec_unary_plus
{ mkuplus $1 $2 }
| subtractive expr %prec prec_unary_minus
{ mkuminus $1 $2 }
| additive expr %prec prec_unary_plus
{ mkuplus $1 $2 }
591デフォルトの名無しさん
2012/12/03(月) 16:07:32.97 pervasives.mliにこんなん書かれてた
147 external ( ~- ) : int -> int = "%negint"
148 (** Unary negation. You can also write [- e] instead of [~- e]. *)
147 external ( ~- ) : int -> int = "%negint"
148 (** Unary negation. You can also write [- e] instead of [~- e]. *)
592デフォルトの名無しさん
2012/12/03(月) 17:08:25.93 むしろ、
http://caml.inria.fr/pub/docs/manual-ocaml-4.00/libref/Pervasives.html
> val (~+) : int -> int
> Unary addition. You can also write + e instead of ~+ e.
> Since 3.12.0
> val (~+.) : float -> float
> Unary addition. You can also write +. e instead of ~+. e.
> Since 3.12.0
言語拡張が間に合わなかった感じだねこれ
Ad-hockぽいし
http://caml.inria.fr/pub/docs/manual-ocaml-4.00/libref/Pervasives.html
> val (~+) : int -> int
> Unary addition. You can also write + e instead of ~+ e.
> Since 3.12.0
> val (~+.) : float -> float
> Unary addition. You can also write +. e instead of ~+. e.
> Since 3.12.0
言語拡張が間に合わなかった感じだねこれ
Ad-hockぽいし
593デフォルトの名無しさん
2012/12/03(月) 17:48:39.20 なるほど。+. が単項opとして機能するのは Since 3.12.0 からの拡張なのか。
で間に合ってないというのは 589 の環境のことか。最新の ocaml では通る。
色々ありがとうございました。
で間に合ってないというのは 589 の環境のことか。最新の ocaml では通る。
色々ありがとうございました。
594デフォルトの名無しさん
2013/02/10(日) 19:42:11.39 最近、OCamlを勉強し始めたんだけど、標準関数で int listを印字する方法ってありますか?
REPLの出力みたいのを求めているんですが。
REPLの出力みたいのを求めているんですが。
595デフォルトの名無しさん
2013/02/28(木) 00:26:28.39 >>594 コンパイラ内部の関数をごにょごにょすれば別かもしれないけど基本的にない。
対象がint listって決まってるなら、自分で書いたほうが楽だと思う。
対象がint listって決まってるなら、自分で書いたほうが楽だと思う。
596デフォルトの名無しさん
2013/02/28(木) 01:13:07.87 REPL環境に限定すれば実はREPLのプリティプリンタを使えたりするんだけど、
使ってしまうと単独の実行ファイルにできなくなる罠。
使ってしまうと単独の実行ファイルにできなくなる罠。
597デフォルトの名無しさん
2013/03/24(日) 17:14:56.10 OCamlで、(=)等を渡す
let check b f = if b then f 1 1 else f 1.0 1.0
みたいな関数を定義したいんですけど、こういったやり方は駄目ですか?
そのままだとfはintを取ると推論されて?エラーになるので、
型を(f: 'a -> 'a -> bool)と指定してみたんですが変わりませんでした。
let check b f = if b then f 1 1 else f 1.0 1.0
みたいな関数を定義したいんですけど、こういったやり方は駄目ですか?
そのままだとfはintを取ると推論されて?エラーになるので、
型を(f: 'a -> 'a -> bool)と指定してみたんですが変わりませんでした。
598デフォルトの名無しさん
2013/04/20(土) 01:56:05.49 >>597
よくわからないけど、型環境に intかつfloat みたいなのが積めないからだめなんじゃない?
確かこういうときはヴァリアントを使えばよかったはず
type intfloat = E | I of int | F of float
let check b (f: intfloat -> intfloat -> bool) = if b then f (I 1) (I 1) else f (F 1.0) (F 1.0)
よくわからないけど、型環境に intかつfloat みたいなのが積めないからだめなんじゃない?
確かこういうときはヴァリアントを使えばよかったはず
type intfloat = E | I of int | F of float
let check b (f: intfloat -> intfloat -> bool) = if b then f (I 1) (I 1) else f (F 1.0) (F 1.0)
599デフォルトの名無しさん
2013/06/09(日) 21:47:36.26 OCaml のはなしです。
module type IO =
sig
type 'a t
val write: string -> unit t
val read: string t
val run: 'a t -> 'a
val bind: 'a t -> ('a -> 'b t) -> 'b t
end
module MyIO : IO =
struct
type 'a t = unit -> 'a
let read = read_line
let write str = fun () -> print_string str
let run m = m ()
let bind m f = fun () -> (run (f (run m)))
end
で Haskell の IO monad 風にできるのはわかったけど、
'a t を x -> b という関数の形じゃなくて、バリアント型で実現したい。
read に対応したアクションまたは write に対応したアクション、という感じで。
けど、どうやってもうまくいかない。誰か教えてくださいませ。
module type IO =
sig
type 'a t
val write: string -> unit t
val read: string t
val run: 'a t -> 'a
val bind: 'a t -> ('a -> 'b t) -> 'b t
end
module MyIO : IO =
struct
type 'a t = unit -> 'a
let read = read_line
let write str = fun () -> print_string str
let run m = m ()
let bind m f = fun () -> (run (f (run m)))
end
で Haskell の IO monad 風にできるのはわかったけど、
'a t を x -> b という関数の形じゃなくて、バリアント型で実現したい。
read に対応したアクションまたは write に対応したアクション、という感じで。
けど、どうやってもうまくいかない。誰か教えてくださいませ。
600デフォルトの名無しさん
2013/06/16(日) 21:34:59.42 opamを導入して適当なモジュール(今回はextlib)をインストールして
ソースコードにopen Extlibと書いたところExtlibが見つからないと言われてしまいました
何かパス通しのようなものが必要なのでしょうか
OSはmacでhomebrewを使っています
ソースコードにopen Extlibと書いたところExtlibが見つからないと言われてしまいました
何かパス通しのようなものが必要なのでしょうか
OSはmacでhomebrewを使っています
601デフォルトの名無しさん
2013/06/16(日) 22:08:09.11 よくわかりませんがOCamlFindを使えば良いのですね
ocamlfind ocamlc -package extlib -linkpkg test.ml
で通りました
ocamlfind ocamlc -package extlib -linkpkg test.ml
で通りました
602デフォルトの名無しさん
2013/06/16(日) 23:27:52.03 あとopen ExtLibがタイポしてました
603デフォルトの名無しさん
2013/07/23(火) NY:AN:NY.AN Coqもここでいいの?
604デフォルトの名無しさん
2013/07/23(火) NY:AN:NY.AN605デフォルトの名無しさん
2013/08/13(火) NY:AN:NY.AN 活気が無いように見えるのはきっと皆コーディングに夢中なんだ。きっとそうだ。
606デフォルトの名無しさん
2013/08/13(火) NY:AN:NY.AN MLに限った事じゃないけど、関数型言語を学び始めて思ったのは、なんで一次元(線形)リストベースに作られてるのかなって。
一番シンプルな一次元から始めたとして、その先にn次元、までは行かなくても2次元・3次元にして言語体型を考えてみるとかやった人いないのかな。
既にトライして無意味と分かったとか、今まさに挑戦中とか、そう言う話はあるのかい?
メモリ空間が一次元空間だから、やるだけ無駄なんだろうか?
一番シンプルな一次元から始めたとして、その先にn次元、までは行かなくても2次元・3次元にして言語体型を考えてみるとかやった人いないのかな。
既にトライして無意味と分かったとか、今まさに挑戦中とか、そう言う話はあるのかい?
メモリ空間が一次元空間だから、やるだけ無駄なんだろうか?
607デフォルトの名無しさん
2013/08/13(火) NY:AN:NY.AN608デフォルトの名無しさん
2013/08/13(火) NY:AN:NY.AN >>606
Linked List は一次元じゃないと思う。
Linked List は一次元じゃないと思う。
609デフォルトの名無しさん
2013/08/13(火) NY:AN:NY.AN >>607
だったら再帰の考え方も拡張すればいい。別にデータ構造をベースにする意図ではない。
考え方の向きは相互に変わって良いし、そうする事で何が見えてくるか、こないとしたら何故なのかを考えるきっかけにすればよい。
だったら再帰の考え方も拡張すればいい。別にデータ構造をベースにする意図ではない。
考え方の向きは相互に変わって良いし、そうする事で何が見えてくるか、こないとしたら何故なのかを考えるきっかけにすればよい。
610デフォルトの名無しさん
2013/08/13(火) NY:AN:NY.AN >>609
考え方の向きが一方向なのは、関数(写像)が集合間における一方向のn:1関係だから。
もし双方向やn:m関係を扱いたいのなら、述語論理をベースにした言語にすればいい。
論理型言語であれば、リストも順序性がある一方向関係として自然に扱える。
考え方の向きが一方向なのは、関数(写像)が集合間における一方向のn:1関係だから。
もし双方向やn:m関係を扱いたいのなら、述語論理をベースにした言語にすればいい。
論理型言語であれば、リストも順序性がある一方向関係として自然に扱える。
611デフォルトの名無しさん
2013/08/13(火) NY:AN:NY.AN そう言う話じゃなく、考えたかの向きってのは再帰→リストと発想する考え方の逆向き、と言う意味です。
これ以上の議論は無意味のようですね。終わり
これ以上の議論は無意味のようですね。終わり
612デフォルトの名無しさん
2013/08/13(火) NY:AN:NY.AN 消えてくれてありがとう
613デフォルトの名無しさん
2013/08/13(火) NY:AN:NY.AN >>609
関数型言語を学び始めてどれくらいだ。第一印象でリストベースなのかと感じても3日もすればそんなことないって分かるだろうに。
きっと俺と同じように慣れない酒で益体もないことを考えているんだろうけど。
n次元のリストを捉えるのに再帰が不十分なら拡張とか考えるけどさ、n-1次元のリストを再帰的に処理すればいいだけの話であって、拡張なんて必要ない。
再帰という概念の拡張に1次元->n次元の拡張は使えない。何の需要も喚起しない。
関数型言語を学び始めてどれくらいだ。第一印象でリストベースなのかと感じても3日もすればそんなことないって分かるだろうに。
きっと俺と同じように慣れない酒で益体もないことを考えているんだろうけど。
n次元のリストを捉えるのに再帰が不十分なら拡張とか考えるけどさ、n-1次元のリストを再帰的に処理すればいいだけの話であって、拡張なんて必要ない。
再帰という概念の拡張に1次元->n次元の拡張は使えない。何の需要も喚起しない。
614デフォルトの名無しさん
2013/08/14(水) NY:AN:NY.AN >>613
なれない酒で頭がいかれてるお馬鹿さんさようなら
なれない酒で頭がいかれてるお馬鹿さんさようなら
615デフォルトの名無しさん
2013/08/21(水) NY:AN:NY.AN ひどいなこりゃ。
616デフォルトの名無しさん
2013/08/21(水) NY:AN:NY.AN 「ひどい」と不平を言うよりも、進んでネタを振りましょう。
617デフォルトの名無しさん
2013/08/27(火) NY:AN:NY.AN 正直関数型言語がどんなところで優位を持っているのかわからん
618デフォルトの名無しさん
2013/08/31(土) NY:AN:NY.AN リスト内包表記ってOCcamlでできるの?
619デフォルトの名無しさん
2013/08/31(土) NY:AN:NY.AN Camlp4でできる
620デフォルトの名無しさん
2013/09/02(月) 01:13:00.20 OCaml でのゲームプログラミングに興味がわいて
MLGame http://mlgame.sourceforge.net/
ってライブラリを導入しようと思ったのですが
準備段階であるSDL, OCamlSDL の cygwin への導入で
もうよくわからなくなってしまいました。
http://sourceforge.net/projects/mlgame/files/mlgame/cross-platform%20devel%20util/
cygwin ごと入ってるらしいパックもためそうとしましたが
cygwin コンソールの起動ができません。
あきらめてCで初心者向けのDXLibrary でもつかって
適当にやってればいいのでしょうか?
MLGame http://mlgame.sourceforge.net/
ってライブラリを導入しようと思ったのですが
準備段階であるSDL, OCamlSDL の cygwin への導入で
もうよくわからなくなってしまいました。
http://sourceforge.net/projects/mlgame/files/mlgame/cross-platform%20devel%20util/
cygwin ごと入ってるらしいパックもためそうとしましたが
cygwin コンソールの起動ができません。
あきらめてCで初心者向けのDXLibrary でもつかって
適当にやってればいいのでしょうか?
621デフォルトの名無しさん
2013/09/02(月) 01:55:09.13 やる前から自分が興味を持ったことを投げ出すなよ
やってみて、思っていたのと違ったらそのときに別の方法を考えればいい
要は関数型言語でゲームプログラミングをしたいんだろ?
ならF# + DirectXを試してみたら?
もしくはCygwinを捨ててLinux環境でMLGameに挑戦してみるとか
MLGameなんて地雷臭がするから、いろいろと苦労しそう。その分、力は付くかもしれないけど。
どんな方法をとるにせよ、まずはある程度のところまで突き詰めたほうがいい
やってみて、思っていたのと違ったらそのときに別の方法を考えればいい
要は関数型言語でゲームプログラミングをしたいんだろ?
ならF# + DirectXを試してみたら?
もしくはCygwinを捨ててLinux環境でMLGameに挑戦してみるとか
MLGameなんて地雷臭がするから、いろいろと苦労しそう。その分、力は付くかもしれないけど。
どんな方法をとるにせよ、まずはある程度のところまで突き詰めたほうがいい
622デフォルトの名無しさん
2013/09/02(月) 01:59:44.29 「プログラミングする」という観点においては
Windowsはウンコということを肝に命じた方が良い
Windowsはウンコということを肝に命じた方が良い
623デフォルトの名無しさん
2013/09/02(月) 02:33:30.43 なんで?.NETは便利だぞ
624デフォルトの名無しさん
2013/09/02(月) 02:47:12.09 >>621-622
素早い返答ありがとうございます。
とりあえず OCaml + cygwin + へんなの は捨てて
F# + DirectX をためしてみます。
windoes はプログラム書くのにうんこなのですね?
Ubuntu いちおう VMware でつかえるけど
とりあえず win に F# インストールしてねます
明日
http://www.codeproject.com/Articles/121194/Managed-DirectX-via-F
でもよもう
素早い返答ありがとうございます。
とりあえず OCaml + cygwin + へんなの は捨てて
F# + DirectX をためしてみます。
windoes はプログラム書くのにうんこなのですね?
Ubuntu いちおう VMware でつかえるけど
とりあえず win に F# インストールしてねます
明日
http://www.codeproject.com/Articles/121194/Managed-DirectX-via-F
でもよもう
625デフォルトの名無しさん
2013/09/02(月) 09:36:30.13 そっか F#だとAPIが叩けるんだな
プログラム自体を関数型言語から入ると
なかなかできない発想だなと思った
プログラム自体を関数型言語から入ると
なかなかできない発想だなと思った
626デフォルトの名無しさん
2013/09/03(火) 01:42:29.15 let foo () =
let bar = baz () in begin
(* fooを使ってunitを返すような処理がいくつか *)
bar
end
個人的にこれはダサいと思うんですけど他の書き方が思いつきません
何かありませんか?
let bar = baz () in begin
(* fooを使ってunitを返すような処理がいくつか *)
bar
end
個人的にこれはダサいと思うんですけど他の書き方が思いつきません
何かありませんか?
627デフォルトの名無しさん
2013/09/03(火) 08:33:35.63 何がダサいと感じるのかよくわからんので何も言えない
628デフォルトの名無しさん
2013/09/03(火) 10:22:05.74 endの直前にbarをもう一度書かないといけないところがダサいと思うのです
629デフォルトの名無しさん
2013/09/03(火) 13:34:18.83 tap や finally で書けない?
630デフォルトの名無しさん
2013/09/04(水) 19:54:28.33 #load "dynlink.cma";;
#load "camlp4o.cma";;
#load "Camlp4Parsers/Camlp4ListComprehension.cmo";;
[x | x <- [1;2;3] ];;
- : int list = [1; 2; 3]
できた! すげー感動
#load "camlp4o.cma";;
#load "Camlp4Parsers/Camlp4ListComprehension.cmo";;
[x | x <- [1;2;3] ];;
- : int list = [1; 2; 3]
できた! すげー感動
631デフォルトの名無しさん
2013/09/04(水) 20:04:23.38 [(x,y,z)|x<-[1;2;3;4;5;6;7;8;9;10];y<-[1;2;3;4;5;6;7;8;9;10];z<-[1;2;3;4;5;6;7;8;9;10];x*x+y*y=z*z;x+y+z=24];;
haskellの すごHの問題もできた! うおー俺は猛烈に感動している
ところでhaskellの[1,2..10]って書いて[1;2;3;4;5;6;7;8;9;10]のリストを一瞬で作る機能は流石にないよな
haskellの すごHの問題もできた! うおー俺は猛烈に感動している
ところでhaskellの[1,2..10]って書いて[1;2;3;4;5;6;7;8;9;10]のリストを一瞬で作る機能は流石にないよな
632デフォルトの名無しさん
2013/09/04(水) 20:10:09.50633デフォルトの名無しさん
2013/09/04(水) 20:16:21.51 うん 楽しい
関数型言語は最高やでぇぇ
関数型言語は最高やでぇぇ
634デフォルトの名無しさん
2013/09/04(水) 20:45:29.31 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10103970335
こんな問題もサクっと4つの組
(85,71,59,50)が出てくる
凄いよぉぉぉ マヂで小学生からプログラムやるべきだな
こんな問題もサクっと4つの組
(85,71,59,50)が出てくる
凄いよぉぉぉ マヂで小学生からプログラムやるべきだな
635デフォルトの名無しさん
2013/09/04(水) 21:02:36.14 日本語が理解できない
自然数の集合から無作為に選んだ4個の数が存在して、この4つの中から、さらに無作為に3個を選んで和を取り、それを4回試行したところ、
180, 194, 206, 215
になった、ってことでいいの?
自然数の集合から無作為に選んだ4個の数が存在して、この4つの中から、さらに無作為に3個を選んで和を取り、それを4回試行したところ、
180, 194, 206, 215
になった、ってことでいいの?
636デフォルトの名無しさん
2013/09/04(水) 21:18:35.37 こいつこの調子でずっと喋り続ける気?
637デフォルトの名無しさん
2013/09/04(水) 22:22:27.90638デフォルトの名無しさん
2013/09/04(水) 22:47:24.97639デフォルトの名無しさん
2013/09/05(木) 01:56:06.71 camlp4で今ある文法を制限することって出来ますか?
括弧無しのタプルを排除してリストの区切りをコロンにしたいのですが。
括弧無しのタプルを排除してリストの区切りをコロンにしたいのですが。
640デフォルトの名無しさん
2013/09/07(土) 03:15:14.14■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【中国外務省】日中関係悪化は高市氏に責任と名指しで非難… [BFU★]
- 【中国外務省】日中関係悪化は高市氏に責任と名指しで非難… ★2 [BFU★]
- 外務省局長は無言で厳しい表情…日中の高官協議終了か 高市首相“台湾”発言で中国が強硬対応 発言撤回求めたか…★2 [BFU★]
- 小野田紀美・経済安保担当相「何か気に入らないことがあればすぐに経済的威圧をする国への依存はリスク」 [Hitzeschleier★]
- 政府、株式の配当など金融所得を高齢者の医療保険料や窓口負担に反映する方針を固めた [バイト歴50年★]
- 【維新】吉村知事「中国人観光客だけに頼るビジネスモデル変えていかないといけない」「高市総理の発言は撤回する必要はない」 [Hitzeschleier★]
- 【悲報】日本人「俺以外の日本人が中国と戦ってくれるぞ!」 [616817505]
- 中国高官と話す外務省局長の表情、やばい [175344491]
- 中国外務省「日中関係の悪化は高市早苗首相が原因」と名指しで強く非難。キタ━(゚∀゚)━! [153490809]
- 維新の吉村代表「高市総理に中国総領事の国外退去を要請した。今後、知事として中国イベントには出席しない」 [359572271]
- 日本政府「高市総理の発言は問題ないと伝え、中国総領事のSNS投稿は問題があると中国に伝えました😊」 [931948549]
- 【悲報】あまりにも高市早苗の頭が悪過ぎて「これは確かに野党が配慮して質問するべきだったのでは」と結論が出てしまう [517791167]
