関数型言語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
2009/06/15(月) 19:45:36
プログラミングの初心者が最初に学習する言語としても優れているのに、
学習者が増えないのはなぜなの?
学習者が増えないのはなぜなの?
2009/06/15(月) 19:57:50
>>2
教える側が理解していないから。
教える側が理解していないから。
2009/06/15(月) 20:04:59
>>2
初心者が日常で使うにはハードルが高いからかな
初心者が日常で使うにはハードルが高いからかな
2009/06/16(火) 01:24:50
前スレでもあったけどOcamlとHaskellってどっちが初心者に向いてるのかな?
Lispいじってた俺にとってはOcamlの方が見た感じ楽そうに見えるけど
Lisp、Ocaml、Haskellマスターの意見が聞いてみたいな
Lispいじってた俺にとってはOcamlの方が見た感じ楽そうに見えるけど
Lisp、Ocaml、Haskellマスターの意見が聞いてみたいな
2009/06/16(火) 09:59:16
standard MLをさらっとやってから決めれば。
7デフォルトの名無しさん
2009/06/16(火) 22:59:258デフォルトの名無しさん
2009/06/16(火) 23:52:08 オブジェクトを使わずにステートマシンを作るのによい方法はありますか?
勉強のためにStateパターンをモジュールを使ってやってみようと思ったのですが、
相互依存を回避するうまい方法が思いつきません。
また、状態をそれぞれ別モジュールにするにせよ、一箇所にまとめるにせよ、動的に切り替えるためには
結局パターンマッチさせてそれらを呼び出すようになると思いますが、もっとスマートな方法はありますか?
勉強のためにStateパターンをモジュールを使ってやってみようと思ったのですが、
相互依存を回避するうまい方法が思いつきません。
また、状態をそれぞれ別モジュールにするにせよ、一箇所にまとめるにせよ、動的に切り替えるためには
結局パターンマッチさせてそれらを呼び出すようになると思いますが、もっとスマートな方法はありますか?
2009/06/17(水) 10:23:08
>>8
まずは具体的な実装例を挙げてみたら?
まずは具体的な実装例を挙げてみたら?
2009/06/17(水) 10:43:32
うん、なんか簡単な問題例を出してくれないとわかんないよ。
2009/06/17(水) 10:51:36
state machineの問題例というとよくあるのはストップウォッチとか。
128
2009/06/17(水) 12:36:14 実際の問題を簡単にした問題例です。
流れ:
キャラクタがバイトをして財布がいっぱいになったら銀行へ行く
ということを目標金額まで繰り返し、到達したらその金がなくなるまで
家でごろ寝し、なくなったらまた働く
キャラクタは
・バイトをする : 手持ちが1増える
・銀行で貯金をする : 手持ちを0にし、貯金が1増える
・家で寝る : 貯金が1減る
の状態を取ります。
財布の許容量は3、目標貯金額は5とします。
Ocaml的な解決方法のアドバイスをいただけると幸いです。
ちなみに元々の問題は「実例で学ぶゲームAIプログラミング」
という本の2章に出てくる、上記の問題例にいくつか余分な状態を
追加したようなものです。
元々の問題をとりあえず実装してみたソースとサンプルソースも
あげてみました。
http://www1.axfc.net/uploader/Sc/so/9827.lzh
流れ:
キャラクタがバイトをして財布がいっぱいになったら銀行へ行く
ということを目標金額まで繰り返し、到達したらその金がなくなるまで
家でごろ寝し、なくなったらまた働く
キャラクタは
・バイトをする : 手持ちが1増える
・銀行で貯金をする : 手持ちを0にし、貯金が1増える
・家で寝る : 貯金が1減る
の状態を取ります。
財布の許容量は3、目標貯金額は5とします。
Ocaml的な解決方法のアドバイスをいただけると幸いです。
ちなみに元々の問題は「実例で学ぶゲームAIプログラミング」
という本の2章に出てくる、上記の問題例にいくつか余分な状態を
追加したようなものです。
元々の問題をとりあえず実装してみたソースとサンプルソースも
あげてみました。
http://www1.axfc.net/uploader/Sc/so/9827.lzh
138
2009/06/17(水) 12:42:44 スレ違いではありますが、もう1つ後学のために質問をさせてください。
アップロードするのは初めてでよくわからないままaxfcを
使用したのですが、プログラム板で一般的に使用されている
アップローダーというものはあるのでしょうか?
アップロードするのは初めてでよくわからないままaxfcを
使用したのですが、プログラム板で一般的に使用されている
アップローダーというものはあるのでしょうか?
2009/06/17(水) 14:43:02
>12
その手の奴って素直に状態保持した方が色々スッキリしそうなんだけどどうなのエロイ人
その手の奴って素直に状態保持した方が色々スッキリしそうなんだけどどうなのエロイ人
2009/06/17(水) 16:54:33
>>12
> キャラクタは
> ・バイトをする : 手持ちが1増える
> ・銀行で貯金をする : 手持ちを0にし、貯金が1増える
> ・家で寝る : 貯金が1減る
> の状態を取ります。
ニート解:
キャラクタはバイトせず取り敢えず銀行へ行く
ということを目標金額まで繰り返し、到達したらその金がなくなるまで
家でごろ寝し、なくなったらまた働かずにまた銀行へ行く
> キャラクタは
> ・バイトをする : 手持ちが1増える
> ・銀行で貯金をする : 手持ちを0にし、貯金が1増える
> ・家で寝る : 貯金が1減る
> の状態を取ります。
ニート解:
キャラクタはバイトせず取り敢えず銀行へ行く
ということを目標金額まで繰り返し、到達したらその金がなくなるまで
家でごろ寝し、なくなったらまた働かずにまた銀行へ行く
2009/06/17(水) 17:28:06
継続っぽくすればいいんじゃない?
2009/06/17(水) 22:02:12
コードを晒すにはここがいいよ
http://codepad.org/
http://codepad.org/
18デフォルトの名無しさん
2009/06/17(水) 22:22:20 なんで12の問題にStateパターンが適してるのかよくわからない。。
19デフォルトの名無しさん
2009/06/17(水) 22:31:48 interface State { void whatToDoNext(); } みたいなインターフェイスがあって、
class RichState implements State { public void whatToDoNext() { goToTheBank(); }
class PoorState implements State { public void whatToDoNext() { work(); }
...
みたいなイメージですか?
class RichState implements State { public void whatToDoNext() { goToTheBank(); }
class PoorState implements State { public void whatToDoNext() { work(); }
...
みたいなイメージですか?
2009/06/17(水) 23:05:02
これくらいなら引数に状態を持たせて各状態を手続きで表せばよくね?
2009/06/17(水) 23:07:47
>>20のやり方がいいんじゃねーかな
たぶん>>16も同じこと?
たぶん両者が言ってるのはこんな感じ?(1/2)
type action =
| Work // バイトをする
| Deposite // 銀行で貯金をする
| Rest;; // 家で寝る
type life_state =
| Working // …ということを目標金額まで繰り返し
| Resting;; // ごろ寝
let sigma event state =
match (event, state) with
// バイトをする: 手持ちが1増える
| (Work, (budget, account)) -> (budget + 1, account)
// 銀行で貯金をする: 手持ちを0にし、貯金が1増える
| (Deposite, (budget, account)) -> (0, account + 1)
// 家で寝る: 貯金が1減る
| (Rest, (budget, account)) -> (budget, account - 1);;
たぶん>>16も同じこと?
たぶん両者が言ってるのはこんな感じ?(1/2)
type action =
| Work // バイトをする
| Deposite // 銀行で貯金をする
| Rest;; // 家で寝る
type life_state =
| Working // …ということを目標金額まで繰り返し
| Resting;; // ごろ寝
let sigma event state =
match (event, state) with
// バイトをする: 手持ちが1増える
| (Work, (budget, account)) -> (budget + 1, account)
// 銀行で貯金をする: 手持ちを0にし、貯金が1増える
| (Deposite, (budget, account)) -> (0, account + 1)
// 家で寝る: 貯金が1減る
| (Rest, (budget, account)) -> (budget, account - 1);;
2009/06/17(水) 23:09:23
(2/2)
let rec life state days =
printfn "%A" (state, days);
if days = 0
then ()
else
match state with
// 財布がいっぱいになったら銀行へ行く
| (Working, (3, account)) -> life (Working, sigma Deposite (3, account)) (days - 1)
// ということを目標金額まで繰り返し
| (Working, (budget, 5)) -> life (Resting, sigma Rest (budget, 5)) (days - 1)
// (財布がいっぱいになるまでは働く)
| (Working, s) -> life (Working, sigma Work s) (days - 1)
// 到達したらその金がなくなるまで家でごろ寝し、なくなったらまた働く
| (Resting, (budget, 0)) -> life (Working, sigma Work (budget, 0)) (days - 1)
// (なくなるまではごろ寝する)
| (Resting, s) -> life (Resting, sigma Rest s) (days - 1);;
改行が…まぁいいか
ちなみにF#です
let rec life state days =
printfn "%A" (state, days);
if days = 0
then ()
else
match state with
// 財布がいっぱいになったら銀行へ行く
| (Working, (3, account)) -> life (Working, sigma Deposite (3, account)) (days - 1)
// ということを目標金額まで繰り返し
| (Working, (budget, 5)) -> life (Resting, sigma Rest (budget, 5)) (days - 1)
// (財布がいっぱいになるまでは働く)
| (Working, s) -> life (Working, sigma Work s) (days - 1)
// 到達したらその金がなくなるまで家でごろ寝し、なくなったらまた働く
| (Resting, (budget, 0)) -> life (Working, sigma Work (budget, 0)) (days - 1)
// (なくなるまではごろ寝する)
| (Resting, s) -> life (Resting, sigma Rest s) (days - 1);;
改行が…まぁいいか
ちなみにF#です
238
2009/06/18(木) 00:21:17 >>16
継続について調べてみます。
>>17
ありがとうございます。今度コードを晒すときに使ってみます。
>>19
おそらくそのイメージで合っていると思います。
(とはいってもJavaはよくわからないのですが・・・)
トップレベルでキャラクタクラスのUpdateを呼び出すと、保持している
派生状態クラスのインターフェースに自身を渡して実行。あとはよろしく。
状態の切り替えも勝手にお願いね。
的なコードが元々のサンプルコードです。
>>21
コードを書いていただきありがとうございます。
例題を簡略化したせいで反ってわかりにくくなってしまい、すみませんでした。
とりあえず継続というものを調べつつもう少し考えて見ます。
皆様ありがとうございました。
継続について調べてみます。
>>17
ありがとうございます。今度コードを晒すときに使ってみます。
>>19
おそらくそのイメージで合っていると思います。
(とはいってもJavaはよくわからないのですが・・・)
トップレベルでキャラクタクラスのUpdateを呼び出すと、保持している
派生状態クラスのインターフェースに自身を渡して実行。あとはよろしく。
状態の切り替えも勝手にお願いね。
的なコードが元々のサンプルコードです。
>>21
コードを書いていただきありがとうございます。
例題を簡略化したせいで反ってわかりにくくなってしまい、すみませんでした。
とりあえず継続というものを調べつつもう少し考えて見ます。
皆様ありがとうございました。
24デフォルトの名無しさん
2009/06/18(木) 22:18:10 考えてみたけどこれじゃだめ?
(* 1/2 *)
type state = { cash: int; deposit: int; action: unit -> state }
let rec work_state cash deposit = {
cash = cash;
deposit = deposit;
action = (fun () ->
print_endline "work";
let cash' = succ cash in
if cash' < 3 then work_state cash' deposit
else rich_state cash' deposit
)}
and rich_state cash deposit = {
cash = cash;
deposit = deposit;
action = (fun () ->
print_endline "go to the bank";
let deposit' = succ deposit in
if deposit' < 5 then work_state 0 deposit'
else neet_state 0 deposit'
)}
(* 1/2 *)
type state = { cash: int; deposit: int; action: unit -> state }
let rec work_state cash deposit = {
cash = cash;
deposit = deposit;
action = (fun () ->
print_endline "work";
let cash' = succ cash in
if cash' < 3 then work_state cash' deposit
else rich_state cash' deposit
)}
and rich_state cash deposit = {
cash = cash;
deposit = deposit;
action = (fun () ->
print_endline "go to the bank";
let deposit' = succ deposit in
if deposit' < 5 then work_state 0 deposit'
else neet_state 0 deposit'
)}
25デフォルトの名無しさん
2009/06/18(木) 22:19:23 (* 2/2 *)
and neet_state cash deposit = {
cash = cash;
deposit = deposit;
action = (fun () ->
print_endline "sleep";
let deposit' = pred deposit in
if deposit' > 0 then neet_state cash deposit'
else work_state cash deposit'
)}
let initial_state = work_state 0 0
and neet_state cash deposit = {
cash = cash;
deposit = deposit;
action = (fun () ->
print_endline "sleep";
let deposit' = pred deposit in
if deposit' > 0 then neet_state cash deposit'
else work_state cash deposit'
)}
let initial_state = work_state 0 0
2009/06/19(金) 09:08:15
この規模だといいけど、
行動の結果と選択を独立に実装できる方が
将来の拡張にはよいんじゃないかな、
特に質問者はゲームAIの本読んでるらしいし。
行動の結果と選択を独立に実装できる方が
将来の拡張にはよいんじゃないかな、
特に質問者はゲームAIの本読んでるらしいし。
2009/06/19(金) 14:59:30
いつのまにやらObjective Caml is 3.11.1でてる
2009/06/20(土) 12:20:07
OCamlで副作用のあるライブラリを使っていて、
クロージャの(環境の)合成がしたくなったのですが失敗します
再現コードを書くと
ma,mbは期待通りですがmcは毎回1が出力されます
環境の中の環境ってのは呼ばれるごとに新しい環境になるからってことですかね
let a x f=
let r = ref x in
fun ()->Printf.printf "%d" !r;f(); r:=!r+1;;
let b x f=
let r = ref x in
fun ()->Printf.printf "%d" !r;f(); r:=2* !r;;
let c x f =
fun ()->(a x (b x f))();;
let ma = a 0 (fun ()->Printf.printf "a\n" );;
let mb = b 1 (fun ()->Printf.printf "b\n");;
let mc = c 1 (fun ()->Printf.printf "c\n");;
ma();;ma();;ma();;
mb();;mb();;mb();;
mc();;mc();;mc();;
てことはOCamlのオブジェクト指向部分ちゃんと覚えないとだめかな
by poor man
クロージャの(環境の)合成がしたくなったのですが失敗します
再現コードを書くと
ma,mbは期待通りですがmcは毎回1が出力されます
環境の中の環境ってのは呼ばれるごとに新しい環境になるからってことですかね
let a x f=
let r = ref x in
fun ()->Printf.printf "%d" !r;f(); r:=!r+1;;
let b x f=
let r = ref x in
fun ()->Printf.printf "%d" !r;f(); r:=2* !r;;
let c x f =
fun ()->(a x (b x f))();;
let ma = a 0 (fun ()->Printf.printf "a\n" );;
let mb = b 1 (fun ()->Printf.printf "b\n");;
let mc = c 1 (fun ()->Printf.printf "c\n");;
ma();;ma();;ma();;
mb();;mb();;mb();;
mc();;mc();;mc();;
てことはOCamlのオブジェクト指向部分ちゃんと覚えないとだめかな
by poor man
2009/06/20(土) 16:54:49
let rec length list =
match list with
[] -> 0
| x::rest -> 1 + length rest;;
このリストの長さを返す再帰関数の動きなんですが、下へ展開していって
ループが終了したら、上に値が戻ってくるイメージでOKですか?
length [2; 1; 3] = match [2; 1; 3] with
| 2 :: [1; 3] -> 1 +
length [1; 3] = match [1; 3] with
| 1 :: [3] -> 1 +
length [3] = match [3] with
| 3 :: [] -> 1 +
length [] = match [] with
[] -> 0
1 + 0
1 + 1
1 + 2
length [2; 1; 3] = 3
match list with
[] -> 0
| x::rest -> 1 + length rest;;
このリストの長さを返す再帰関数の動きなんですが、下へ展開していって
ループが終了したら、上に値が戻ってくるイメージでOKですか?
length [2; 1; 3] = match [2; 1; 3] with
| 2 :: [1; 3] -> 1 +
length [1; 3] = match [1; 3] with
| 1 :: [3] -> 1 +
length [3] = match [3] with
| 3 :: [] -> 1 +
length [] = match [] with
[] -> 0
1 + 0
1 + 1
1 + 2
length [2; 1; 3] = 3
2009/06/20(土) 17:01:54
上とか下でなくて、行って戻ってくるイメージですね。ブーメランみたいな。
2009/06/20(土) 17:02:56
IDないんですね。29,30,31は、29です。
2009/06/20(土) 17:16:19
インデントを浅くしろw
基本的に再帰は漸化式と同じと考えれば良い。
それで合ってるが、一々動作を深く考えずに関数を定義出来るようになるのが
最初の一歩だから精進すべし。
基本的に再帰は漸化式と同じと考えれば良い。
それで合ってるが、一々動作を深く考えずに関数を定義出来るようになるのが
最初の一歩だから精進すべし。
33129
2009/06/20(土) 17:41:30 ども。インデントはあれかなぁと書いた後に思いました。
命令型言語だとカウントする変数を作ってa = a + 1みたいな
イメージが強くて直感的にこのソース見て理解出来なかったので。
書いて見ると理解出来るもんですね。精進します。
命令型言語だとカウントする変数を作ってa = a + 1みたいな
イメージが強くて直感的にこのソース見て理解出来なかったので。
書いて見ると理解出来るもんですね。精進します。
2009/06/20(土) 21:21:43
>>29
ocamlのトップレベルには#traceというディレクティブがあって、
指定した関数の動きが表示される
再帰関数の動きを確認するのにはやや便利だから使ってみて
# #trace length;;
length is now traced.
# length [1;2;3];;
length <-- [<poly>; <poly>; <poly>]
length <-- [<poly>; <poly>]
length <-- [<poly>]
length <-- []
length --> 0
length --> 1
length --> 2
length --> 3
- : int = 3
ocamlのトップレベルには#traceというディレクティブがあって、
指定した関数の動きが表示される
再帰関数の動きを確認するのにはやや便利だから使ってみて
# #trace length;;
length is now traced.
# length [1;2;3];;
length <-- [<poly>; <poly>; <poly>]
length <-- [<poly>; <poly>]
length <-- [<poly>]
length <-- []
length --> 0
length --> 1
length --> 2
length --> 3
- : int = 3
2009/06/21(日) 13:16:20
2009/06/21(日) 19:21:20
前スレって埋まる前に落ちたんですか?
2009/06/21(日) 19:24:33
うん
2009/06/22(月) 09:18:56
2009/06/23(火) 09:00:15
ttp://flyingfrogblog.blogspot.com/2009/03/hlvm-has-been-released.html
HLVMってのはLLVMの関数型特化版、みたいなイメージ?
OCamlはこっちになるの? おしえてエロいひと
HLVMってのはLLVMの関数型特化版、みたいなイメージ?
OCamlはこっちになるの? おしえてエロいひと
2009/06/23(火) 10:34:57
釣りなの?釣りなの?
> HLVMってのはLLVMの関数型特化版、みたいなイメージ?
そういう理解でいい。
HLVM そのものの批判は詳細を知らないのでできないけど、
- Caml team は HLVM プロジェクトには全く噛んでない。
- Caml team と consortium が関知しない code generation の総入れ替えはありえない。
- HLVM で騒いでいる奴は各種言語メーリングリストの有名粘着。何かというとすぐ自分の有料メールマガジンに誘導。
- なんかちょっとした toy example が出来るたびに大騒ぎ。正直みんな食傷している。
将来化ける事もあるかもしれない。が、今は放置をお薦め。時間の無駄。
> HLVMってのはLLVMの関数型特化版、みたいなイメージ?
そういう理解でいい。
HLVM そのものの批判は詳細を知らないのでできないけど、
- Caml team は HLVM プロジェクトには全く噛んでない。
- Caml team と consortium が関知しない code generation の総入れ替えはありえない。
- HLVM で騒いでいる奴は各種言語メーリングリストの有名粘着。何かというとすぐ自分の有料メールマガジンに誘導。
- なんかちょっとした toy example が出来るたびに大騒ぎ。正直みんな食傷している。
将来化ける事もあるかもしれない。が、今は放置をお薦め。時間の無駄。
2009/06/23(火) 13:27:16
>>41
前スレでも話題になってたHarropのこと?
前スレでも話題になってたHarropのこと?
2009/06/23(火) 16:00:15
ttp://www.infoq.com/jp/news/2008/03/revoerability-and-testing-oo-fp
ここに
「Feathers氏に反対する人の多くは、関数型のコード乱雑になる原因は、
関数型ではないイディオムを関数型言語に持ち込んだこと以外にはないと
信じている。」
っていう記述があるけど、関数型言語のイディオム(とかデザインパターン)って
どんなのがあるの?おしえてエロいひとー
ここに
「Feathers氏に反対する人の多くは、関数型のコード乱雑になる原因は、
関数型ではないイディオムを関数型言語に持ち込んだこと以外にはないと
信じている。」
っていう記述があるけど、関数型言語のイディオム(とかデザインパターン)って
どんなのがあるの?おしえてエロいひとー
2009/06/23(火) 16:23:20
2009/06/23(火) 17:28:56
>>43
そうだとするとあまりに漠然としていて多少の窮屈感が欲しくなるな。
ノーパンでスカートを穿いているような、あるいは力戦になって次に
なにを指せばいいのかわからない、そんな感じ。
そのうちそういうのがまとめられればいいなぁ。
そうだとするとあまりに漠然としていて多少の窮屈感が欲しくなるな。
ノーパンでスカートを穿いているような、あるいは力戦になって次に
なにを指せばいいのかわからない、そんな感じ。
そのうちそういうのがまとめられればいいなぁ。
2009/06/23(火) 17:29:56
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- ネット殺到「高市総理の責任」「完全に高市リスク」「高市さん負けるな」中国が水産物輸入停止→流石に総理批判の声も「どう責任取る?」 [樽悶★]
- 高市首相答弁を“引き出した”立民・岡田克也氏が改めて説明「なぜ慎重な答弁をされなかったのか。非常に残念に思っている」 ★10 [ぐれ★]
- 【為替】対ドルで157円台、対ユーロ181円台に下落 財政悪化を警戒 [蚤の市★]
- トランプ氏「台湾侵攻すれば北京爆撃」“過激予告発言”報道がXで再燃「高市氏の1億倍やばい」 [七波羅探題★]
- フィフィ、中国の“日本産水産物輸入停止”措置に私見「中国依存しないとやっていけない企業は考えを改めて」 [Anonymous★]
- 「母の部屋に安倍氏が表紙の機関誌が」「(安倍氏が被害者なのは)不思議に思いませんでした」山上被告の妹が証言 ★2 [おっさん友の会★]
- 【悲報】倉田真由美「なんで高市は子供がいる家庭に2万円給付するの?子供がいる家庭ばかり優遇するのおかしくね?」 [802034645]
- 中国報道、高市首相を「毒苗」と中傷😡 [399259198]
- 【悲報】高市早苗「“なり得る”って言っただけでなんでそんなに叩くの?私女なんですけど!」 [616817505]
- 【高市悲報】🇨🇳中国「日本への報復措置? 他にいくらでも方法はある。 まだまだやめないよ」 😨😱 [485983549]
- 松田聖子👈今思うとこいつがデビューした時の衝撃って凄かったよな [977261419]
- 【高市点字】 ローカル鉄道会社「ホームに点字ブロックかぁ…。 150m施工すると1500万円!?😱 そんな金ないよぉ……」 [485983549]
