集合論に基づいた言語を作りたいat TECH
集合論に基づいた言語を作りたい - 暇つぶし2ch102:デフォルトの名無しさん
14/08/16 18:09:17.80 ceF43G6L
>>100
いや、>>75を具体的に語ったのが>>93なんだけども。
残念ながら教科書コピペとはほど遠いC++チックなコードになっちゃったけど
教科書の定義にはなるべく従ったコードにしたつもり。

103:デフォルトの名無しさん
14/08/17 00:08:28.60 rJnEUKU4
OCamlのvariantみたいなことがしたいのかなあ?

104:1
14/08/17 00:17:38.28 wbAX39n3
OCamlは触ったことがないけど面白そうな雰囲気ですね。
本でもかってくるかな。

105:デフォルトの名無しさん
14/08/17 00:38:59.38 rJnEUKU4
>>1はCライクな言語しか触ったこと無いの?
だったら、もっと色々な言語を知るべきだよ。
その上でLispなり何なりで好きなようにDSLを実装すればいい。

少なくとも、集合が不当に冷遇されてるなんてことはない。ありえない。

106:デフォルトの名無しさん
14/08/17 05:17:10.40 ruDVRpF3
集合論よりかは圏論のほうが良くないか。厳密には違うが、ほぼ集合論の一般化でプログラム言語として利用する上では不具合無いだろ。


Haskell/圏論 - Wikibooks
URLリンク(ja.wikibooks.org)
URLリンク(ja.wikibooks.org)
URLリンク(ja.wikibooks.org)

Scala で圏論入門
URLリンク(github.com)


Coq を始めよう
このチュートリアルでは定理証明支援系言語である Coq について解説をします。
読者の前提知識としては OCaml や Haskell などの関数型言語でプログラミングできることを想定します。
また、本文書において Coq のプログラムとの比較には Haskell と OCaml を用いますが、Haskell や OCaml を書いたことがなくても他の関数型言語に触れていれば理解できるような内容を心がけます。
URLリンク(www.iij-ii.co.jp)



圏論は数学をするための「高級言語」 
URLリンク(www.is.s.u-tokyo.ac.jp)
URLリンク(www.is.s.u-tokyo.ac.jp)

107:デフォルトの名無しさん
14/08/17 07:09:05.41 YbL+7IWD
メニー・コアの時代にはそういう言語が流行るんだろな。

108:デフォルトの名無しさん
14/08/17 07:29:25.82 ruDVRpF3
圏論 - Wikipedia
圏論(けんろん、category theory)は、数学的構造とその間の関係を抽象的に扱う数学理論の 1 つである。
さらに一般的な圏論、つまり、意味論的な柔軟性をもち高階論理との親和性があるようなより現代的な普遍的代数が発展し、現在では数学全体を通して応用されている。
トポスと呼ばれる特別な種類の圏は、数学基礎論としての公理的集合論に取って代わることすら可能である。
実際構成的数学を記述する手段としても、トポスは非常に精緻に機能することが示されている。



集合論 - Wikipedia
さまざまな数学の問題に対応した構造を理解するときには、個々の対象が具体的にどんな集合として定義されたかということよりも、
類似の構造を持つほかの数学的対象との関係性の方がしばしば重要になる。
この関係性は対象間の写像のうちで「構造を保つ」ようなものによって定式化される。このような考え方を扱うために圏論が発達した。
集合論の著しい特徴は集合間の写像たちまでが再び集合として実現できることだが、こういった性質を圏論的に定式化することで
集合論の圏論化・幾何化ともいうべきトポスの概念がえられる。

109:1
14/08/17 09:26:36.14 wbAX39n3
>>105
私の使用言語は主にC/C++ですね。
あとはRubyを少々。JavaやC#はかじった程度。
関数型言語は触ったことないですね。

>少なくとも、集合が不当に冷遇されてるなんてことはない。ありえない。

うーん。そうなんですか。でもそれだとこのスレが終わってしまうw

>>106
圏論は知らないですね。なんか難しそうってイメージです。
はたして独学で勉強できるかどうか。。。

110:デフォルトの名無しさん
14/08/17 09:41:10.85 ruDVRpF3
集合が{○、●、◎、□、■}とすると、
圏は{→(1)、→(2)、→(3)、→(4)、→(5)}>

111:デフォルトの名無しさん
14/08/17 09:51:19.75 ruDVRpF3
途中で送信した。
(ある条件をみたす)全ての集合に対して、(ある条件をみたす)全ての集合の写像の集まりが圏。
圏論は、集合間の写像に注目したもの。
厳密なことは知らないが、どんな集合も圏として扱えるはずだろう。
集合{○、●、◎、□、■}に対して、圏{○→○、●→●、◎→◎、□→□、■→■}、(f(x)=xとなる写像)が作れる。

112:デフォルトの名無しさん
14/08/17 09:52:50.76 wbAX39n3
>>110
→の意味がわからないw
あと最後の>は必要なの?

113:1
14/08/17 09:53:56.42 wbAX39n3
うおリロードしてなかった。

114:デフォルトの名無しさん
14/08/17 10:02:50.89 ruDVRpF3
圏の主人公って「対象」なのかな?「射」なのかな? | TETRA'S MATH


「しりとりの圏」を圏とみなそうとするとき、まず、1字1字があって、
URLリンク(artet-math.img.jugem.jp)

 それを始域、終域とする文字列を考えるのか。
URLリンク(artet-math.img.jugem.jp)

それとも、まず文字列ありきで、
URLリンク(artet-math.img.jugem.jp)

始域、終域の一致でそれらの関係をひとまとまりのものとして捉えるのか…
URLリンク(artet-math.img.jugem.jp)

どっちのイメージが圏の本質に近いのだろう?

で、検索していたら、檜山さんの有限集合と写像の圏もJavaScriptで書いてみた、遊んでみてねにて、「圏の主役は射です。」と書いてあるのを発見。なるほど。
URLリンク(math.artet.net)

115:1
14/08/17 10:17:17.51 wbAX39n3
TODOが一気にふえたな。
とりあえず、Ocamlの本買ってきます。
圏論を理解できるようになるのは相当先かな~。

116:デフォルトの名無しさん
14/08/17 10:34:34.27 kLc8LA2s
>>1はやりたいことが沢山あって圧倒される段階か。その後何年かして夢見た事はすべてやり尽くした段階になる。
能力が足りないとそうなるまえに死んでしまうがね。

117:デフォルトの名無しさん
14/08/17 10:36:45.62 ruDVRpF3
Ocamlは副作用があって純粋な関数型でない。副作用ありでいいならJavascriptも関数型言語でJavascriptで関数型の勉強可能。



純粋関数型プログラミングとは
関数が純粋であるというのは、副作用がないということである。副作用とは、関数が、内部で、なんらかの状態を隠しもつことをいう。
OCamlのようなML由来の言語は"ほぼ純粋"である。副作用を、参照や配列の形で使えるけども、大抵は、書いたコードは純粋関数型に落ち着くことが多い。
Haskellもまた、関数型言語で、純粋関数型だ。OCamlは、より実用的といえる。純粋でない関数もときには便利だからだ。
URLリンク(ocaml.org)


JavaScriptで学ぶ関数型プログラミング
URLリンク(hamasyou.com)

JavaScript はプロトタイプベースのオブジェクト指向言語ですが、関数型言語の機能も備えています。
URLリンク(www.geocities.jp)


JavaScript - Javascrptで関数型プログラミングの入門 - Qiita
URLリンク(qiita.com)

JavaScriptは関数型言語の特徴を取り入れていると思いますが、純粋な関数型言語ではありません。しかし今、そしてこれからのトレンドは関数型言語と言われています。
そこでJavaScriptでより関数型言語的なプログラミングを可能にするfn.jsを使ってみましょう。
URLリンク(www.moongift.jp)

CoffeeScript と Node.js による関数型の JavaScript
URLリンク(www.ibm.com)

Functional JavaScript
URLリンク(gist.github.com)

118:デフォルトの名無しさん
14/08/17 10:45:48.55 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); }

URLリンク(www.h6.dion.ne.jp)

119:デフォルトの名無しさん
14/08/17 10:51:34.94 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))
}

URLリンク(paulownia.hatenablog.com)

120:1
14/08/17 15:08:45.66 wbAX39n3
本屋めぐってきたけどOcamlの本なかったわー
廃れてしまった言語なん?
しかたないからwebで情報探すか。

121:デフォルトの名無しさん
14/08/17 15:31:49.05 8WbwPRMF
ググれば数秒でみつかるのに。
URLリンク(caml.inria.fr)

122:デフォルトの名無しさん
14/08/17 16:03:30.63 PGXi6tC2
>>109
> うーん。そうなんですか。でもそれだとこのスレが終わってしまうw
いいことじゃん。
続きはブログでやってくれ。


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