計算機科学の基礎は集合論であるという。
ならば、集合論に基づいた言語を作れば美しい言語になるのでは?
そんな発想から徹底的に集合論的思想で言語仕様を考えるスレです。
探検
集合論に基づいた言語を作りたい
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2014/08/10(日) 21:27:16.56ID:x7G32Sd02014/08/14(木) 07:53:05.12ID:18xo22zy
2014/08/14(木) 22:20:55.55ID:ao1eYSCw
「全貌はともあれこういうことをこうカッコよく書けそう」みたいなのをみたい
2014/08/15(金) 12:53:42.95ID:Aqg845W8
831
2014/08/16(土) 08:32:34.29ID:ceF43G6L2014/08/16(土) 09:06:38.11ID:/1p3o6vn
意味不明。雰囲気だけで語るな。
2014/08/16(土) 09:20:19.06ID:atIrV/RU
Peggyでいいじゃん。
2014/08/16(土) 09:21:32.20ID:InfE8TR8
だからせめて記述例を書けよ お前の脳内は読めねえ
871
2014/08/16(土) 09:37:02.60ID:ceF43G6L だから具体的な案はまだないんだって。
881
2014/08/16(土) 10:17:23.81ID:ceF43G6L 有限オートマトンの遷移関数を書くのに、関数の引数のパターンマッチは欲しいかな。
891
2014/08/16(土) 10:35:06.72ID:ceF43G6L と、おもったけどそんなめんどくさいことしなくても連想配列でもいいのか。
2014/08/16(土) 10:41:17.00ID:eWpr12Q+
>>87
ここはお前の日記帳じゃないんだから、具体的にまとまってから書いてくれ
ここはお前の日記帳じゃないんだから、具体的にまとまってから書いてくれ
911
2014/08/16(土) 11:51:35.82ID:ceF43G6L 俺が持ってる教科書、マイケルシプサの計算理論の基礎っていう本の38,39ページに載ってる
A={w|wは少なくとも一つの1を含み最後に現れる1の後に偶数個の0が存在する}
っていう言語を受理するオートマトンの実装例は以下のような感じかな。かなりC++ぽいが。
enum State {q1,q2,q3};
set<State> Q={q1,q2,q3};
set<char> Σ={'0','1'};
map<pair<State,char>,State> δ={
(q1,'0')=>q1,
(q1,'1')=>q2,
(q2,'0')=>q3,
(q2,'1')=>q2,
(q3,'0')=>q2,
(q3,'1')=>q2
};
set<State> F={q2};
class Automaton {
set<State> Q;
set<char> Σ;
map<pair<State,char>,State> δ;
State start;
set<State> F;
bool accept(char *str){
State state=start;
while(str){
state=δ[(state,*str)];
str++;
}
return F.include(state);
}
} M = (Q,Σ,δ,q1,F);
A={w|wは少なくとも一つの1を含み最後に現れる1の後に偶数個の0が存在する}
っていう言語を受理するオートマトンの実装例は以下のような感じかな。かなりC++ぽいが。
enum State {q1,q2,q3};
set<State> Q={q1,q2,q3};
set<char> Σ={'0','1'};
map<pair<State,char>,State> δ={
(q1,'0')=>q1,
(q1,'1')=>q2,
(q2,'0')=>q3,
(q2,'1')=>q2,
(q3,'0')=>q2,
(q3,'1')=>q2
};
set<State> F={q2};
class Automaton {
set<State> Q;
set<char> Σ;
map<pair<State,char>,State> δ;
State start;
set<State> F;
bool accept(char *str){
State state=start;
while(str){
state=δ[(state,*str)];
str++;
}
return F.include(state);
}
} M = (Q,Σ,δ,q1,F);
921
2014/08/16(土) 11:54:15.04ID:ceF43G6L あれ、空白ミスってんな。
プレビューでみたらちゃんと空白になってたと思ったけど。
プレビューでみたらちゃんと空白になってたと思ったけど。
931
2014/08/16(土) 11:57:01.89ID:ceF43G6L まあ、いいや。インデントなしで再投稿
enum State {q1,q2,q3};
set<State> Q={q1,q2,q3};
set<char> Σ={'0','1'};
map<pair<State,char>,State> δ={
(q1,'0')=>q1,
(q1,'1')=>q2,
(q2,'0')=>q3,
(q2,'1')=>q2,
(q3,'0')=>q2,
(q3,'1')=>q2
};
set<State> F={q2};
class Automaton {
set<State> Q;
set<char> Σ;
map<pair<State,char>,State> δ;
State start;
set<State> F;
bool accept(char *str){
State state=start;
while(str){
state=δ[(state,*str)];
str++;
}
return F.include(state);
}
} M = (Q,Σ,δ,q1,F);
enum State {q1,q2,q3};
set<State> Q={q1,q2,q3};
set<char> Σ={'0','1'};
map<pair<State,char>,State> δ={
(q1,'0')=>q1,
(q1,'1')=>q2,
(q2,'0')=>q3,
(q2,'1')=>q2,
(q3,'0')=>q2,
(q3,'1')=>q2
};
set<State> F={q2};
class Automaton {
set<State> Q;
set<char> Σ;
map<pair<State,char>,State> δ;
State start;
set<State> F;
bool accept(char *str){
State state=start;
while(str){
state=δ[(state,*str)];
str++;
}
return F.include(state);
}
} M = (Q,Σ,δ,q1,F);
2014/08/16(土) 13:25:37.77ID:atIrV/RU
Ragelでいいじゃん。
951
2014/08/16(土) 15:25:06.91ID:ceF43G6L とりあえず、集合と連想配列と組のリテラル表記は欲しいな。
型さえ一致してれば組はクラスに暗黙のキャストできる感じで。
型さえ一致してれば組はクラスに暗黙のキャストできる感じで。
2014/08/16(土) 17:30:42.83ID:wloQcISK
目新しいものがないな。なんとなく美しくなりそうってのは天才的センスがないと実現しない。
天才か凡才かを確定させるためにさっさと作ってしまおう。
天才か凡才かを確定させるためにさっさと作ってしまおう。
971
2014/08/16(土) 17:44:24.71ID:ceF43G6L まじかw
言語仕様きめるだけでも結構大変だぞw
さくっと作れるみたいなこと言うなw
言語仕様きめるだけでも結構大変だぞw
さくっと作れるみたいなこと言うなw
2014/08/16(土) 17:45:22.16ID:0H8IvnJl
結局、見た目の問題でしかないの?
新しいパラダイムもなにも無いなら、わざわざ言語を作る意味が無いよ
新しいパラダイムもなにも無いなら、わざわざ言語を作る意味が無いよ
991
2014/08/16(土) 17:56:17.24ID:ceF43G6L いまのところシンタックスシュガーの問題の域をでてないな。
オートマトンだけじゃなくてもっと色んな問題を考察していけば
なんか出てくるのかもしれないが。
とにかく、今のプログラミング言語において集合は不当に冷遇されてる気がする。
もっと集合を活躍させるべき、というのがこのスレの発端です。
オートマトンだけじゃなくてもっと色んな問題を考察していけば
なんか出てくるのかもしれないが。
とにかく、今のプログラミング言語において集合は不当に冷遇されてる気がする。
もっと集合を活躍させるべき、というのがこのスレの発端です。
100デフォルトの名無しさん
2014/08/16(土) 17:59:58.20ID:0E9vEosE >>75を具体的に語って欲しい
1011
2014/08/16(土) 18:04:10.41ID:ceF43G6L 型のキャストって結構不自由じゃない?
集合論に基づいた型の表記法が一致したらバンバンキャストできるようにしちゃうとか。
集合論に基づいた型の表記法が一致したらバンバンキャストできるようにしちゃうとか。
102デフォルトの名無しさん
2014/08/16(土) 18:09:17.80ID:ceF43G6L103デフォルトの名無しさん
2014/08/17(日) 00:08:28.60ID:rJnEUKU4 OCamlのvariantみたいなことがしたいのかなあ?
1041
2014/08/17(日) 00:17:38.28ID:wbAX39n3 OCamlは触ったことがないけど面白そうな雰囲気ですね。
本でもかってくるかな。
本でもかってくるかな。
105デフォルトの名無しさん
2014/08/17(日) 00:38:59.38ID:rJnEUKU4 >>1はCライクな言語しか触ったこと無いの?
だったら、もっと色々な言語を知るべきだよ。
その上でLispなり何なりで好きなようにDSLを実装すればいい。
少なくとも、集合が不当に冷遇されてるなんてことはない。ありえない。
だったら、もっと色々な言語を知るべきだよ。
その上でLispなり何なりで好きなようにDSLを実装すればいい。
少なくとも、集合が不当に冷遇されてるなんてことはない。ありえない。
106デフォルトの名無しさん
2014/08/17(日) 05:17:10.40ID:ruDVRpF3 集合論よりかは圏論のほうが良くないか。厳密には違うが、ほぼ集合論の一般化でプログラム言語として利用する上では不具合無いだろ。
Haskell/圏論 - Wikibooks
http://ja.wikibooks.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:Simple-cat.png
http://ja.wikibooks.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:Functor.png
http://ja.wikibooks.org/wiki/Haskell/%E5%9C%8F%E8%AB%96
Scala で圏論入門
https://github.com/scalajp/introduction-to-category-theory-in-scala-jp/wiki
Coq を始めよう
このチュートリアルでは定理証明支援系言語である Coq について解説をします。
読者の前提知識としては OCaml や Haskell などの関数型言語でプログラミングできることを想定します。
また、本文書において Coq のプログラムとの比較には Haskell と OCaml を用いますが、Haskell や OCaml を書いたことがなくても他の関数型言語に触れていれば理解できるような内容を心がけます。
http://www.iij-ii.co.jp/lab/techdoc/coqt/coqt1.html
圏論は数学をするための「高級言語」
http://www.is.s.u-tokyo.ac.jp/isnavi/images/logic/picture04.gif
http://www.is.s.u-tokyo.ac.jp/isnavi/logic06.html
Haskell/圏論 - Wikibooks
http://ja.wikibooks.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:Simple-cat.png
http://ja.wikibooks.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB:Functor.png
http://ja.wikibooks.org/wiki/Haskell/%E5%9C%8F%E8%AB%96
Scala で圏論入門
https://github.com/scalajp/introduction-to-category-theory-in-scala-jp/wiki
Coq を始めよう
このチュートリアルでは定理証明支援系言語である Coq について解説をします。
読者の前提知識としては OCaml や Haskell などの関数型言語でプログラミングできることを想定します。
また、本文書において Coq のプログラムとの比較には Haskell と OCaml を用いますが、Haskell や OCaml を書いたことがなくても他の関数型言語に触れていれば理解できるような内容を心がけます。
http://www.iij-ii.co.jp/lab/techdoc/coqt/coqt1.html
圏論は数学をするための「高級言語」
http://www.is.s.u-tokyo.ac.jp/isnavi/images/logic/picture04.gif
http://www.is.s.u-tokyo.ac.jp/isnavi/logic06.html
107デフォルトの名無しさん
2014/08/17(日) 07:09:05.41ID:YbL+7IWD メニー・コアの時代にはそういう言語が流行るんだろな。
108デフォルトの名無しさん
2014/08/17(日) 07:29:25.82ID:ruDVRpF3 圏論 - Wikipedia
圏論(けんろん、category theory)は、数学的構造とその間の関係を抽象的に扱う数学理論の 1 つである。
さらに一般的な圏論、つまり、意味論的な柔軟性をもち高階論理との親和性があるようなより現代的な普遍的代数が発展し、現在では数学全体を通して応用されている。
トポスと呼ばれる特別な種類の圏は、数学基礎論としての公理的集合論に取って代わることすら可能である。
実際構成的数学を記述する手段としても、トポスは非常に精緻に機能することが示されている。
集合論 - Wikipedia
さまざまな数学の問題に対応した構造を理解するときには、個々の対象が具体的にどんな集合として定義されたかということよりも、
類似の構造を持つほかの数学的対象との関係性の方がしばしば重要になる。
この関係性は対象間の写像のうちで「構造を保つ」ようなものによって定式化される。このような考え方を扱うために圏論が発達した。
集合論の著しい特徴は集合間の写像たちまでが再び集合として実現できることだが、こういった性質を圏論的に定式化することで
集合論の圏論化・幾何化ともいうべきトポスの概念がえられる。
圏論(けんろん、category theory)は、数学的構造とその間の関係を抽象的に扱う数学理論の 1 つである。
さらに一般的な圏論、つまり、意味論的な柔軟性をもち高階論理との親和性があるようなより現代的な普遍的代数が発展し、現在では数学全体を通して応用されている。
トポスと呼ばれる特別な種類の圏は、数学基礎論としての公理的集合論に取って代わることすら可能である。
実際構成的数学を記述する手段としても、トポスは非常に精緻に機能することが示されている。
集合論 - Wikipedia
さまざまな数学の問題に対応した構造を理解するときには、個々の対象が具体的にどんな集合として定義されたかということよりも、
類似の構造を持つほかの数学的対象との関係性の方がしばしば重要になる。
この関係性は対象間の写像のうちで「構造を保つ」ようなものによって定式化される。このような考え方を扱うために圏論が発達した。
集合論の著しい特徴は集合間の写像たちまでが再び集合として実現できることだが、こういった性質を圏論的に定式化することで
集合論の圏論化・幾何化ともいうべきトポスの概念がえられる。
1091
2014/08/17(日) 09:26:36.14ID:wbAX39n3110デフォルトの名無しさん
2014/08/17(日) 09:41:10.85ID:ruDVRpF3 集合が{○、●、◎、□、■}とすると、
圏は{→(1)、→(2)、→(3)、→(4)、→(5)}>
圏は{→(1)、→(2)、→(3)、→(4)、→(5)}>
111デフォルトの名無しさん
2014/08/17(日) 09:51:19.75ID:ruDVRpF3 途中で送信した。
(ある条件をみたす)全ての集合に対して、(ある条件をみたす)全ての集合の写像の集まりが圏。
圏論は、集合間の写像に注目したもの。
厳密なことは知らないが、どんな集合も圏として扱えるはずだろう。
集合{○、●、◎、□、■}に対して、圏{○→○、●→●、◎→◎、□→□、■→■}、(f(x)=xとなる写像)が作れる。
(ある条件をみたす)全ての集合に対して、(ある条件をみたす)全ての集合の写像の集まりが圏。
圏論は、集合間の写像に注目したもの。
厳密なことは知らないが、どんな集合も圏として扱えるはずだろう。
集合{○、●、◎、□、■}に対して、圏{○→○、●→●、◎→◎、□→□、■→■}、(f(x)=xとなる写像)が作れる。
112デフォルトの名無しさん
2014/08/17(日) 09:52:50.76ID:wbAX39n31131
2014/08/17(日) 09:53:56.42ID:wbAX39n3 うおリロードしてなかった。
114デフォルトの名無しさん
2014/08/17(日) 10:02:50.89ID:ruDVRpF3 圏の主人公って「対象」なのかな?「射」なのかな? | TETRA'S MATH
「しりとりの圏」を圏とみなそうとするとき、まず、1字1字があって、
http://artet-math.img.jugem.jp/20101201_1468744.jpg
それを始域、終域とする文字列を考えるのか。
http://artet-math.img.jugem.jp/20101201_1468743.jpg
それとも、まず文字列ありきで、
http://artet-math.img.jugem.jp/20101201_1468745.jpg
始域、終域の一致でそれらの関係をひとまとまりのものとして捉えるのか…
http://artet-math.img.jugem.jp/20101201_1468746.jpg
どっちのイメージが圏の本質に近いのだろう?
で、検索していたら、檜山さんの有限集合と写像の圏もJavaScriptで書いてみた、遊んでみてねにて、「圏の主役は射です。」と書いてあるのを発見。なるほど。
http://math.artet.net/?eid=1306322
「しりとりの圏」を圏とみなそうとするとき、まず、1字1字があって、
http://artet-math.img.jugem.jp/20101201_1468744.jpg
それを始域、終域とする文字列を考えるのか。
http://artet-math.img.jugem.jp/20101201_1468743.jpg
それとも、まず文字列ありきで、
http://artet-math.img.jugem.jp/20101201_1468745.jpg
始域、終域の一致でそれらの関係をひとまとまりのものとして捉えるのか…
http://artet-math.img.jugem.jp/20101201_1468746.jpg
どっちのイメージが圏の本質に近いのだろう?
で、検索していたら、檜山さんの有限集合と写像の圏もJavaScriptで書いてみた、遊んでみてねにて、「圏の主役は射です。」と書いてあるのを発見。なるほど。
http://math.artet.net/?eid=1306322
1151
2014/08/17(日) 10:17:17.51ID:wbAX39n3 TODOが一気にふえたな。
とりあえず、Ocamlの本買ってきます。
圏論を理解できるようになるのは相当先かな〜。
とりあえず、Ocamlの本買ってきます。
圏論を理解できるようになるのは相当先かな〜。
116デフォルトの名無しさん
2014/08/17(日) 10:34:34.27ID:kLc8LA2s >>1はやりたいことが沢山あって圧倒される段階か。その後何年かして夢見た事はすべてやり尽くした段階になる。
能力が足りないとそうなるまえに死んでしまうがね。
能力が足りないとそうなるまえに死んでしまうがね。
117デフォルトの名無しさん
2014/08/17(日) 10:36:45.62ID:ruDVRpF3 Ocamlは副作用があって純粋な関数型でない。副作用ありでいいならJavascriptも関数型言語でJavascriptで関数型の勉強可能。
純粋関数型プログラミングとは
関数が純粋であるというのは、副作用がないということである。副作用とは、関数が、内部で、なんらかの状態を隠しもつことをいう。
OCamlのようなML由来の言語は"ほぼ純粋"である。副作用を、参照や配列の形で使えるけども、大抵は、書いたコードは純粋関数型に落ち着くことが多い。
Haskellもまた、関数型言語で、純粋関数型だ。OCamlは、より実用的といえる。純粋でない関数もときには便利だからだ。
http://ocaml.org/learn/tutorials/functional_programming.ja.html
JavaScriptで学ぶ関数型プログラミング
http://hamasyou.com/blog/2014/02/21/functional-javascript/
JavaScript はプロトタイプベースのオブジェクト指向言語ですが、関数型言語の機能も備えています。
http://www.geocities.jp/m_hiroi/light/js03.html
JavaScript - Javascrptで関数型プログラミングの入門 - Qiita
http://qiita.com/takeharu/items/cf98d352ff574c5ac536
JavaScriptは関数型言語の特徴を取り入れていると思いますが、純粋な関数型言語ではありません。しかし今、そしてこれからのトレンドは関数型言語と言われています。
そこでJavaScriptでより関数型言語的なプログラミングを可能にするfn.jsを使ってみましょう。
http://www.moongift.jp/2014/02/fn-js-javascript%E3%82%92%E9%96%A2%E6%95%B0%E5%9E%8B%E8%A8%80%E8%AA%9E%E3%81%AE%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB%E3%81%A7%E6%9B%B8%E3%81%8F%EF%BC%81/
CoffeeScript と Node.js による関数型の JavaScript
http://www.ibm.com/developerworks/jp/java/library/j-coffeescript/
Functional JavaScript
https://gist.github.com/ympbyc/5564146
純粋関数型プログラミングとは
関数が純粋であるというのは、副作用がないということである。副作用とは、関数が、内部で、なんらかの状態を隠しもつことをいう。
OCamlのようなML由来の言語は"ほぼ純粋"である。副作用を、参照や配列の形で使えるけども、大抵は、書いたコードは純粋関数型に落ち着くことが多い。
Haskellもまた、関数型言語で、純粋関数型だ。OCamlは、より実用的といえる。純粋でない関数もときには便利だからだ。
http://ocaml.org/learn/tutorials/functional_programming.ja.html
JavaScriptで学ぶ関数型プログラミング
http://hamasyou.com/blog/2014/02/21/functional-javascript/
JavaScript はプロトタイプベースのオブジェクト指向言語ですが、関数型言語の機能も備えています。
http://www.geocities.jp/m_hiroi/light/js03.html
JavaScript - Javascrptで関数型プログラミングの入門 - Qiita
http://qiita.com/takeharu/items/cf98d352ff574c5ac536
JavaScriptは関数型言語の特徴を取り入れていると思いますが、純粋な関数型言語ではありません。しかし今、そしてこれからのトレンドは関数型言語と言われています。
そこでJavaScriptでより関数型言語的なプログラミングを可能にするfn.jsを使ってみましょう。
http://www.moongift.jp/2014/02/fn-js-javascript%E3%82%92%E9%96%A2%E6%95%B0%E5%9E%8B%E8%A8%80%E8%AA%9E%E3%81%AE%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB%E3%81%A7%E6%9B%B8%E3%81%8F%EF%BC%81/
CoffeeScript と Node.js による関数型の JavaScript
http://www.ibm.com/developerworks/jp/java/library/j-coffeescript/
Functional JavaScript
https://gist.github.com/ympbyc/5564146
118デフォルトの名無しさん
2014/08/17(日) 10:45:48.55ID:ruDVRpF3 この記事では、クイックソート・アルゴリズムの実装について、 様々な言語で書かれた関数型プログラミングのコードを紹介しています
なお、この記事の内容は、 2ちゃんねる掲示板 のプログラム板にあるスレッド 【PHP,Python】スクリプト, バトルロワイヤル36【Perl,Ruby】 で行われた議論を整理、加筆したものです。
関数型言語が関数型プログラミングを何の苦もなく実践できるのは、当たり前の話です。
Haskell
quicksort [] = []
quicksort (pivot:xs) = quicksort littles ++ pivot:(quicksort bigs)
where
f x (ls, bs) = if x < pivot then (x:ls, bs) else (ls, x:bs)
(littles, bigs) = foldr f ([], []) xs
この節で取り上げる Ruby, JavaScript, Python はどれも関数型言語には分類されていませんが、関数型の特性を取り入れていると言われています。
それでは、これら言語の関数型プログラミング・スタイルを見ていくことにしましょう。
JavaScript
function quicksort(xs) {
function f(xs) {
var pivot = xs[0];
function g(pair, x) {
var ls = pair[0], bs = pair[1]
return x < pivot ? [ls.concat([x]), bs] : [ls, bs.concat([x])];
}
var pair = xs.slice(1).reduce(g, [[], []]);
var littles = pair[0], bigs = pair[1];
return [].concat(
quicksort(littles), [pivot], quicksort(bigs)
); }
return xs.length <= 1 ? xs : f(xs); }
http://www.h6.dion.ne.jp/~machan/misc/qsort-in-fp.html
なお、この記事の内容は、 2ちゃんねる掲示板 のプログラム板にあるスレッド 【PHP,Python】スクリプト, バトルロワイヤル36【Perl,Ruby】 で行われた議論を整理、加筆したものです。
関数型言語が関数型プログラミングを何の苦もなく実践できるのは、当たり前の話です。
Haskell
quicksort [] = []
quicksort (pivot:xs) = quicksort littles ++ pivot:(quicksort bigs)
where
f x (ls, bs) = if x < pivot then (x:ls, bs) else (ls, x:bs)
(littles, bigs) = foldr f ([], []) xs
この節で取り上げる Ruby, JavaScript, Python はどれも関数型言語には分類されていませんが、関数型の特性を取り入れていると言われています。
それでは、これら言語の関数型プログラミング・スタイルを見ていくことにしましょう。
JavaScript
function quicksort(xs) {
function f(xs) {
var pivot = xs[0];
function g(pair, x) {
var ls = pair[0], bs = pair[1]
return x < pivot ? [ls.concat([x]), bs] : [ls, bs.concat([x])];
}
var pair = xs.slice(1).reduce(g, [[], []]);
var littles = pair[0], bigs = pair[1];
return [].concat(
quicksort(littles), [pivot], quicksort(bigs)
); }
return xs.length <= 1 ? xs : f(xs); }
http://www.h6.dion.ne.jp/~machan/misc/qsort-in-fp.html
119デフォルトの名無しさん
2014/08/17(日) 10:51:34.94ID:ruDVRpF3 こっちのクイックソートのほうが短くわかりやすかった。
クイックソート - NullPointer's Blog
Erlangで書くと…
quicksort([]) -> [];
quicksort([Head|Tail]) ->
quicksort([X || X <- Tail, X < Head ]) ++ [Head] ++ quicksort([X || X <- Tail, X >= Head]).
小さいのを左に集めて、大きいのを右に集めて、繰り返し…、アルゴリズムの説明そのままのコードになる。
簡単すぎ。アルゴリズムを理解するという目的であれば、関数型のコードの方が10000倍理解しやすい。
関数型っぽい書き方は、最近のJavaScriptならばサクッと書けますが…
function quickSort(array) {
if (array.length <= 1) return array;
var pivot = array.pop();
var lt = array.filter(function(a){ return a < pivot });
var ge = array.filter(function(a){ return a >= pivot });
return quickSort(lt).concat([pivot]).concat(quickSort(ge))
}
http://paulownia.hatenablog.com/entry/20111204/1323015703
クイックソート - NullPointer's Blog
Erlangで書くと…
quicksort([]) -> [];
quicksort([Head|Tail]) ->
quicksort([X || X <- Tail, X < Head ]) ++ [Head] ++ quicksort([X || X <- Tail, X >= Head]).
小さいのを左に集めて、大きいのを右に集めて、繰り返し…、アルゴリズムの説明そのままのコードになる。
簡単すぎ。アルゴリズムを理解するという目的であれば、関数型のコードの方が10000倍理解しやすい。
関数型っぽい書き方は、最近のJavaScriptならばサクッと書けますが…
function quickSort(array) {
if (array.length <= 1) return array;
var pivot = array.pop();
var lt = array.filter(function(a){ return a < pivot });
var ge = array.filter(function(a){ return a >= pivot });
return quickSort(lt).concat([pivot]).concat(quickSort(ge))
}
http://paulownia.hatenablog.com/entry/20111204/1323015703
1201
2014/08/17(日) 15:08:45.66ID:wbAX39n3 本屋めぐってきたけどOcamlの本なかったわー
廃れてしまった言語なん?
しかたないからwebで情報探すか。
廃れてしまった言語なん?
しかたないからwebで情報探すか。
121デフォルトの名無しさん
2014/08/17(日) 15:31:49.05ID:8WbwPRMF ググれば数秒でみつかるのに。
http://caml.inria.fr/resources/index.en.html
http://caml.inria.fr/resources/index.en.html
122デフォルトの名無しさん
2014/08/17(日) 16:03:30.63ID:PGXi6tC21231
2014/08/25(月) 19:07:11.02ID:DrxGPTGS とりあえず、Ocamlでconnect4のルールだけ作ってみた。
だれか添削たのむ。
http://www.age2.tv/rd05/src/up3979.txt
connect4はこことかで遊べます。
http://www.connectfour.org/connect-4-online.php
だれか添削たのむ。
http://www.age2.tv/rd05/src/up3979.txt
connect4はこことかで遊べます。
http://www.connectfour.org/connect-4-online.php
124デフォルトの名無しさん
2014/08/25(月) 19:28:01.77ID:vcy2nNqb 以下>>1がOCamlを勉強するスレ
1251
2014/08/25(月) 19:30:28.60ID:DrxGPTGS いやw今はそうだけど、そのうち本題に戻りたいとは思ってる。
126デフォルトの名無しさん
2014/08/25(月) 20:06:42.36ID:l0tzbBCe この思考エンジンで。GUIはすでにあるから思考部だけ。
http://www.vector.co.jp/soft/win95/game/se401975.html
石を7つ直線に並べた方が勝ちという五目並べに、囲碁の石を取るという概念を加えた新しいゲーム「囲連星」。CPU戦も対人戦も楽しめる。
ルールは簡単!
1) 黒白交互に打っていき、先に縦・横・斜めに7つ石を並べたほうが勝ち
2) その間に相手の石を囲んで取ることが出来る
http://www.vector.co.jp/soft/win95/game/se401975.html
石を7つ直線に並べた方が勝ちという五目並べに、囲碁の石を取るという概念を加えた新しいゲーム「囲連星」。CPU戦も対人戦も楽しめる。
ルールは簡単!
1) 黒白交互に打っていき、先に縦・横・斜めに7つ石を並べたほうが勝ち
2) その間に相手の石を囲んで取ることが出来る
1271
2014/08/25(月) 20:15:54.91ID:DrxGPTGS ばかやろーw
囲連星つったら今までまともなAI作れたの2人しかいない難題じゃねーかw
もっと簡単な奴にしろw
囲連星つったら今までまともなAI作れたの2人しかいない難題じゃねーかw
もっと簡単な奴にしろw
128デフォルトの名無しさん
2014/08/26(火) 17:44:18.47ID:Yj5Hd+B/ 総当たりができなければモンテカルロでやりゃ良いじゃん
もっと素晴らしいのを見つけて欲しいな
もっと素晴らしいのを見つけて欲しいな
1291
2014/08/26(火) 19:40:10.91ID:FDxVWnbU モンテカルロなら簡単だとおもってるな?
そんな甘くないから。
今のLV3のプログラムは相当レベル高いから。
そんな甘くないから。
今のLV3のプログラムは相当レベル高いから。
130デフォルトの名無しさん
2014/08/26(火) 20:14:52.44ID:k5rL1v3w >>1程度の習熟度だとそうかもな
132デフォルトの名無しさん
2014/08/26(火) 20:44:26.53ID:k5rL1v3w133デフォルトの名無しさん
2014/08/26(火) 20:54:37.89ID:FDxVWnbU134デフォルトの名無しさん
2014/08/26(火) 21:07:11.73ID:k5rL1v3w1351
2014/08/26(火) 21:15:57.51ID:FDxVWnbU まあ、一応スレタイの通りだな。
スレの方向はずれてきているが。
とりあえず、関数型言語を触ってみてるところだ。
スレの方向はずれてきているが。
とりあえず、関数型言語を触ってみてるところだ。
136デフォルトの名無しさん
2014/08/26(火) 21:47:40.66ID:UhLj/9Xy LV3は大して強くない。手動でほぼ100%勝てる。
たぶんプログラムでも勝てると思う。
これは囲碁と違って有効手が見付けやすくモンテカルロ法は向いていないと思う。
たぶんプログラムでも勝てると思う。
これは囲碁と違って有効手が見付けやすくモンテカルロ法は向いていないと思う。
137デフォルトの名無しさん
2014/08/26(火) 22:01:43.24ID:2ww4+7z5 ダメダメだな。いつまでたっても何もできそうにない
1381
2014/08/26(火) 22:10:51.94ID:FDxVWnbU139デフォルトの名無しさん
2014/08/26(火) 22:21:22.44ID:2ww4+7z5 ふーん。ならスレ終了でOKだな
141デフォルトの名無しさん
2014/08/27(水) 19:44:52.25ID:FS966Rgy はあ?これ以上妄言を垂れ流すならブログでやれば?
142デフォルトの名無しさん
2014/08/27(水) 21:12:10.16ID:sWLZW0su 1のスレだし見たくないやつが来なければ済む
1431
2014/08/28(木) 19:02:16.77ID:NyU3eawL しかしOcamlはプログラム組みにくいな。
ちょっとしたことやるにも再帰関数つかうっぽいし。
慣れてないだけかもしれんが。
ちょっとしたことやるにも再帰関数つかうっぽいし。
慣れてないだけかもしれんが。
144デフォルトの名無しさん
2014/08/28(木) 19:15:00.80ID:Qmt6TOBF 慣れてないだけ。
145デフォルトの名無しさん
2014/08/28(木) 19:38:25.81ID:RkFVOWz21461
2014/08/28(木) 20:42:22.39ID:NyU3eawL147デフォルトの名無しさん
2014/08/28(木) 22:22:22.57ID:wWKXD6ik 純粋関数型でない、参照透過性がないのは、手続き+αの手続き型言語。
148デフォルトの名無しさん
2014/08/28(木) 22:43:29.27ID:wWKXD6ik 2032 年の FPGA: 20年後の FPGA の未来像
Tabula 社社長兼 CTO の Steve Teig 氏は、次のように断言しました。
「FPGA のプログラミングに関して言えば、RTL は適していません。しかし、C はさらに問題があります。
直列実行から並列実行への移行でさえも低レベルすぎます。
Haskell のような関数型言語の方がましですが、ほとんどの関数型言語がベースとしている数学的抽象化であるラムダ計算も最適な抽象化とは思えません」
Blainey 氏も同じ意見のようで、ソフトウェアを FPGA 構造に変換するライブラリおよびコンパイラを備えた明示的並行言語が広く普及するとともに、
特定の種類の問題を扱う関数型言語プログラマのエリートが現れることになると予想しました。
http://www.altera.co.jp/technology/system-design/articles/2012/fpgas-in-2032-the-acm-fpga-2012-workshop.html
現状でさえマルチスレッドプログラミングは開発の困難さが指摘されている分野である。
Sweeney氏は、これは現在主流の開発言語であるC++の手続き型言語としての特性に由来すると指摘する。
Sweeney氏は、この問題を解決するためには、ゲーム開発言語として純粋関数型の言語が必要になるだろうと言う。
この種の処理系では、C++のような共有メモリのアクセスや、I/O操作は基本的に行なえない。
その引き替えとして、各関数のアトミック性が構造的に保証されており、安全に並列実行できるのだ。
しかも、コンパイラが対応さえすれば、関数を自動的に多数のコアに分散処理させることができるというスケーラブルな実行バイナリを作り出せる。
Sweeney氏はそのひな形として言語“Haskel”を挙げているが、ゲーム開発のメインストリームたり得る言語はまだ登場しておらず、将来に期待しているという。
http://game.watch.impress.co.jp/docs/20080911/epic.htm
Tabula 社社長兼 CTO の Steve Teig 氏は、次のように断言しました。
「FPGA のプログラミングに関して言えば、RTL は適していません。しかし、C はさらに問題があります。
直列実行から並列実行への移行でさえも低レベルすぎます。
Haskell のような関数型言語の方がましですが、ほとんどの関数型言語がベースとしている数学的抽象化であるラムダ計算も最適な抽象化とは思えません」
Blainey 氏も同じ意見のようで、ソフトウェアを FPGA 構造に変換するライブラリおよびコンパイラを備えた明示的並行言語が広く普及するとともに、
特定の種類の問題を扱う関数型言語プログラマのエリートが現れることになると予想しました。
http://www.altera.co.jp/technology/system-design/articles/2012/fpgas-in-2032-the-acm-fpga-2012-workshop.html
現状でさえマルチスレッドプログラミングは開発の困難さが指摘されている分野である。
Sweeney氏は、これは現在主流の開発言語であるC++の手続き型言語としての特性に由来すると指摘する。
Sweeney氏は、この問題を解決するためには、ゲーム開発言語として純粋関数型の言語が必要になるだろうと言う。
この種の処理系では、C++のような共有メモリのアクセスや、I/O操作は基本的に行なえない。
その引き替えとして、各関数のアトミック性が構造的に保証されており、安全に並列実行できるのだ。
しかも、コンパイラが対応さえすれば、関数を自動的に多数のコアに分散処理させることができるというスケーラブルな実行バイナリを作り出せる。
Sweeney氏はそのひな形として言語“Haskel”を挙げているが、ゲーム開発のメインストリームたり得る言語はまだ登場しておらず、将来に期待しているという。
http://game.watch.impress.co.jp/docs/20080911/epic.htm
1491
2014/08/28(木) 23:08:29.08ID:NyU3eawL150デフォルトの名無しさん
2014/08/29(金) 00:59:50.98ID:4AjKkLEL >>149
コア数、5760基
2014年7月22日掲載
ビデオカード単体の価格を下回る破格のロープライスで発売中! 安い、安すぎる! NVIDIA史上最速「GeForce GTX TITAN Z」搭載ゲーミングPCが299,799円!?
「GeForce GTX TITAN Z」は、1枚のカードに「GK110」コアを2基搭載する、NVIDIAの最上位デュアルGPU。
12GBのGDDR5メモリーを搭載するほか、CUDAコアは計5760基で、演算性能は8TFLOPSをうたうウルトラハイエンドGPUです。
デルによると、このGPUを搭載する「ALIENWARE Aurora TITAN Z」は、3840×2160の4K環境で60fpsを超えるパフォーマンスを叩き出し、
「グラフィックス設定を最大にして4Kを有効にすることで、2014年6月に発売され全世界で記録的なセールスを更新中のオープンワールド型アクションゲーム『ウォッチドッグス』も、
すべてのエレメントがさらにシャープで滑らかで鮮明になり、開発元であるUbisoft Montrealの意図通りのディテールをすべて体験することができる」とのことです。
http://magazine.kakaku.com/mag/pc/id=1687/
コア数、5760基
2014年7月22日掲載
ビデオカード単体の価格を下回る破格のロープライスで発売中! 安い、安すぎる! NVIDIA史上最速「GeForce GTX TITAN Z」搭載ゲーミングPCが299,799円!?
「GeForce GTX TITAN Z」は、1枚のカードに「GK110」コアを2基搭載する、NVIDIAの最上位デュアルGPU。
12GBのGDDR5メモリーを搭載するほか、CUDAコアは計5760基で、演算性能は8TFLOPSをうたうウルトラハイエンドGPUです。
デルによると、このGPUを搭載する「ALIENWARE Aurora TITAN Z」は、3840×2160の4K環境で60fpsを超えるパフォーマンスを叩き出し、
「グラフィックス設定を最大にして4Kを有効にすることで、2014年6月に発売され全世界で記録的なセールスを更新中のオープンワールド型アクションゲーム『ウォッチドッグス』も、
すべてのエレメントがさらにシャープで滑らかで鮮明になり、開発元であるUbisoft Montrealの意図通りのディテールをすべて体験することができる」とのことです。
http://magazine.kakaku.com/mag/pc/id=1687/
151デフォルトの名無しさん
2014/08/29(金) 14:03:44.10ID:/HNlnXLI >>146
停止性問題さえ知らないのか。
参照透明性はプログラムを解析しやすくする。
C/C++ で const の少ないソースを見たら気を付けろ。
実用でいえば、コンパイラが最適化するときに全ての中間式に仮の名前を付けて const 変数として扱い、
例えばループの外に追い出すためのスコープ中で不変な部分を探すために使ったりするが、
これは参照透明な範囲を見つけるためだと言えるだろう。
手続型でプログラムをしていても、なるべく参照透明を保った方がいいし、参照透明な範囲を意識しておいた方がいい。
停止性問題さえ知らないのか。
参照透明性はプログラムを解析しやすくする。
C/C++ で const の少ないソースを見たら気を付けろ。
実用でいえば、コンパイラが最適化するときに全ての中間式に仮の名前を付けて const 変数として扱い、
例えばループの外に追い出すためのスコープ中で不変な部分を探すために使ったりするが、
これは参照透明な範囲を見つけるためだと言えるだろう。
手続型でプログラムをしていても、なるべく参照透明を保った方がいいし、参照透明な範囲を意識しておいた方がいい。
1521
2014/08/29(金) 19:54:56.85ID:5NUrtg1w153デフォルトの名無しさん
2014/08/29(金) 20:31:28.66ID:6XulYCBt >>148
【Python】スクリプト バトルロワイヤル45【pl,rb,php,js】
http://peace.2ch.net/test/read.cgi/tech/1405874605/670-680
【Python】スクリプト バトルロワイヤル45【pl,rb,php,js】
http://peace.2ch.net/test/read.cgi/tech/1405874605/670-680
154デフォルトの名無しさん
2014/08/31(日) 04:44:55.96ID:igojaLD4 >>148
こいつら夢と理想を語ってる時点で1の妄言と大差ないわ。
こいつら夢と理想を語ってる時点で1の妄言と大差ないわ。
155デフォルトの名無しさん
2014/08/31(日) 04:46:10.77ID:igojaLD4 夢と理想を描くくらいなら一昔前の俺のレベル。
1561
2014/09/03(水) 19:05:09.17ID:pp7cuLBa 結局、関数型言語って何がいいのかいまいちわからんな。
もうちょっと修行が必要か。。。
もうちょっと修行が必要か。。。
157デフォルトの名無しさん
2014/09/03(水) 19:21:58.87ID:0ir9kNKt 関数型の良さは手続き型でなく、計算順序(手続き)がなく、副作用がないところ。
(実際は計算時間が掛かるけれど)入力に対し瞬時に応答が返るというイメージ。
(実際は計算時間が掛かるけれど)入力に対し瞬時に応答が返るというイメージ。
1581
2014/09/03(水) 20:06:29.19ID:pp7cuLBa 副作用がないってのが今一信用できないんだよなぁ
デカいオブジェクトの一部を更新しようとしたら丸コピーするんでしょ?
まあ、ハードが進歩したらどうなるかわからんが、
副作用なしで十分速いコードを書くのは難しくない?
デカいオブジェクトの一部を更新しようとしたら丸コピーするんでしょ?
まあ、ハードが進歩したらどうなるかわからんが、
副作用なしで十分速いコードを書くのは難しくない?
159デフォルトの名無しさん
2014/09/03(水) 20:49:03.08ID:z1Y/3x7f >>158
>デカいオブジェクトの一部を更新しようとしたら丸コピーするんでしょ?
そんな馬鹿はしない
更新した項目(名前と更新値のペア)が新しい環境へ追加されるだけ
それ以外の項目は古い環境をさかのぼって検索すれば参照できる
(一般には検索結果はメモ化されるから、2回目以降の検索は遅くならない)
ただし副作用のない世界におけるデータ構造に関する
効率的な実装アルゴリズムは発展途上にある
(世の中の歴史的なアルゴリズムの大半は副作用を前提にしているからね)
たとえばこんなのが分かりやすいと思う
・20分でわかる Purely Functional Data Structures - Kmonos.net
http://www.kmonos.net/pub/Presen/PFDS.pdf
>デカいオブジェクトの一部を更新しようとしたら丸コピーするんでしょ?
そんな馬鹿はしない
更新した項目(名前と更新値のペア)が新しい環境へ追加されるだけ
それ以外の項目は古い環境をさかのぼって検索すれば参照できる
(一般には検索結果はメモ化されるから、2回目以降の検索は遅くならない)
ただし副作用のない世界におけるデータ構造に関する
効率的な実装アルゴリズムは発展途上にある
(世の中の歴史的なアルゴリズムの大半は副作用を前提にしているからね)
たとえばこんなのが分かりやすいと思う
・20分でわかる Purely Functional Data Structures - Kmonos.net
http://www.kmonos.net/pub/Presen/PFDS.pdf
160デフォルトの名無しさん
2014/09/03(水) 20:52:47.28ID:gtOXQwRF162デフォルトの名無しさん
2014/09/04(木) 12:51:46.22ID:Azi8pMDh クリス・オカサキさんはsimonpjとかに並ぶ神レベルの御方のひとり。
163デフォルトの名無しさん
2014/09/05(金) 06:58:20.44ID:vJ702ivD164デフォルトの名無しさん
2014/09/05(金) 09:55:29.84ID:qmuQRxyX 正確には、結果が得られるとしたら計算順序によらない(チャーチ=ロッサ性)だな。
1651
2014/09/05(金) 19:53:29.10ID:Y4VtbNiL166デフォルトの名無しさん
2014/09/05(金) 20:18:53.62ID:qmuQRxyX リンク先のPDFをよく読んだか?
コンパイラがやってくれるという話じゃなくて、そういうようにデータ構造を設計する、
という話だから(ある程度はHaskellコンパイラの最適化のおかげも入ってるけど)。
コンパイラがやってくれるという話じゃなくて、そういうようにデータ構造を設計する、
という話だから(ある程度はHaskellコンパイラの最適化のおかげも入ってるけど)。
1671
2014/09/05(金) 20:50:15.22ID:Y4VtbNiL 自力で実装するのか。
参照透過性を保つのはしんどそうだな。
参照透過性を保つのはしんどそうだな。
168デフォルトの名無しさん
2014/09/05(金) 21:21:29.17ID:Ne6tWzRJ 関数型言語を、参照透過性がないC言語で実装可能だし、
C言語ソースコードにコンバートすることも可能。
実行時の中身の動作は関係がない。
C言語ソースコードにコンバートすることも可能。
実行時の中身の動作は関係がない。
1691
2014/09/05(金) 21:38:10.90ID:Y4VtbNiL170デフォルトの名無しさん
2014/09/05(金) 21:46:10.50ID:Ne6tWzRJ 参照透過性はハードウェアの物理的な制約でない。
現状、普及しているパソコンもノイマン型、手続き型でアセンブラ・機械語で動作している。
ハードウェアまでが完全に関数型として動くわけでない。
現状、普及しているパソコンもノイマン型、手続き型でアセンブラ・機械語で動作している。
ハードウェアまでが完全に関数型として動くわけでない。
1711
2014/09/05(金) 22:11:28.48ID:Y4VtbNiL 物理的な制約ではないったって、参照透過性をノイマン型コンピュータで
効率よく実装できないんならそれは物理的な制約みたいなもんでしょ。
丸コピーに勝る最適化が実装されないと、信用できないなぁ。
効率よく実装できないんならそれは物理的な制約みたいなもんでしょ。
丸コピーに勝る最適化が実装されないと、信用できないなぁ。
172デフォルトの名無しさん
2014/09/05(金) 22:11:40.10ID:u2C0iLEX173デフォルトの名無しさん
2014/09/05(金) 22:27:04.06ID:vJ702ivD174デフォルトの名無しさん
2014/09/05(金) 23:09:43.43ID:rtobVFDF175デフォルトの名無しさん
2014/09/06(土) 09:24:36.23ID:2eQ4pr9G176デフォルトの名無しさん
2014/09/06(土) 09:26:57.68ID:2eQ4pr9G つーかconsセルに破壊代入する関数型言語なんて腐る程あるし
この馬鹿は何を自慢したいのだろう?馬鹿すぎて理解できない
この馬鹿は何を自慢したいのだろう?馬鹿すぎて理解できない
177デフォルトの名無しさん
2014/09/06(土) 09:48:13.12ID:VC7+V5v8178デフォルトの名無しさん
2014/09/06(土) 19:13:42.33ID:2eQ4pr9G おー、華麗な勝利宣言だwww
キモ!
キモ!
179デフォルトの名無しさん
2014/09/06(土) 21:11:07.40ID:VC7+V5v8 >>178
キモとしか書けなくて悔しいね w
キモとしか書けなくて悔しいね w
180デフォルトの名無しさん
2014/09/07(日) 08:03:05.89ID:EoKvJO+q ハスケラって初心者のくせにハスケル知ってるというだけでエラソーしてるけど
あれって宗教か何かなのか?
あれって宗教か何かなのか?
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- なぜリベラルは人気がないのか 斎藤幸平さんが指し示す未来への道筋:朝日新聞 ★4 [少考さん★]
- 鈴木農相「おこめ券はお米しか買えないわけではない。例えば卵、味噌、しょうゆ、こうした購入に利用可能」 ★3 [Hitzeschleier★]
- 三谷幸喜氏 温泉嫌いの理由を熱弁「知らない人の股間を素通りしたお湯なんですよ」「おじさんの肛門を通り過ぎたお湯が自分の前に」 [Ailuropoda melanoleuca★]
- 「ヒートテックに寿命があります」ユニクロが明かした“3年劣化”の理由 暖かさが落ちる意外な原因とは [ぐれ★]
- サナエノミクスについて力説 積極的な財政出動で「所得増える 消費マインド上がる 税収増える」片山さつき財務大臣 [少考さん★]
- 【芸能】粗品 「間違ったお笑いの常識が放送されている」「テレビ見てる素人って、笑い声でしか面白いかどうか判断できない。可哀想」 [冬月記者★]
- 他サポ2025-301
- 他サポ2025-300
- 他サポ2025-302
- 阪神競馬5回4日目 阪神JF
- 【NJPW】新日本プロレスワールド part.2431
- 第80回甲子園ボウル 立命館大学 vs 関西学院大学★1
- 『リトルナイトメア』がラバーマットのフィギュア化キタ━━━━(゚∀゚)━━━━!! [807617777]
- 喜多川海夢(その着せ替え人形は恋をする)純白ドレスでプライズのフィギュア化キタ━━━━(゚∀゚)━━━━!!​ [395563314]
- 【神展開】安倍晋三「高市早苗からわーくにを救うために私は地獄からカムバックいたしました」 [517791167]
- 喜多川海夢​(その着せ替え人形は恋をする)純白ドレスでプライズのフィギュア化キタ━━━━(゚∀゚)━━━━!!​ [395563314]
- 喜多川海夢(その着せ替え人形は恋をする)水着シーンのフィギュア化キタ━━━━(゚∀゚)━━━━! [723839345]
- 初めての🍆の使い道教えろ
