集合論に基づいた言語を作りたい

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2014/08/10(日) 21:27:16.56ID:x7G32Sd0
計算機科学の基礎は集合論であるという。
ならば、集合論に基づいた言語を作れば美しい言語になるのでは?
そんな発想から徹底的に集合論的思想で言語仕様を考えるスレです。
2014/09/09(火) 10:33:24.25ID:iSgMgqSE
> 実際、シッタカ多いだろ、ハスケラ界隈。

うん。カタカナで書く奴とか、>>199 のように、長期連載記事を全くそれと認識できてない
ほどのニワカだということを自分で自慢して自爆しちゃう奴とか。
2014/09/09(火) 14:38:16.53ID:ukX/qMIS
>>199と、「本物のプログラマは…」が長期連載記事であることは全く矛盾しないけど、
どうして>>202は199は長期連載と認識していないと思い込んじゃったのかな?
エスパーですか?
2014/09/09(火) 23:09:21.92ID:u4pMEKRn
>>201
ほう、「>>158に書いてある程度の永続データ構造は
不純関数型どころか手続き型でも普通に使われている」のか、それは知らなんだ

関数型を名乗る言語の大半では(=少なくとも自分の知る限りすべての関数型言語では)、
始祖 Lisp の時代から本質的に永続性を持つリストと呼ばれるデータ構造を基本としている
だから関数型言語では、普通に(=暗黙のうちに)永続データ構造が使われていると言える(>>172)

一方、手続き型言語で基本的なデータ構造といえばレコード(=構造体)と配列だと思うけど、
>>201の住んでいる異次元世界では、レコードや配列が永続データ構造で実装されているんだね
興味深い話だから、ぜひ kwsk 説明してもらえると嬉しいなあ....(棒
2014/09/09(火) 23:32:43.42ID:iSgMgqSE
見事に知ったかが消えたな
2014/09/10(水) 07:01:46.89ID:nz1QrfPP
>>204
知らないって、幸せなことなんだなあw
ある言語で永続データ構造が使えるからといって、
その言語の全てのデータ型が永続データ構造で実現されていることにはならないことぐらい
中学生レベルの論理を知っていればわかりそうなものなんだけどなあw

copy on write的なデータ構造は多くの手続き型言語のライブラリで使われていて
そこにはLISPで培われた永続データ構造の技術が使われてるよ。
2014/09/10(水) 11:12:44.60ID:2lSvEqyn
どんどん言ってることがズレてくな
2014/09/10(水) 11:51:44.84ID:2N2PVK/b
関数ムラの住民は世間が狭いね
2014/09/10(水) 22:45:00.45ID:MIzNsnl2
>>204
> copy on write的なデータ構造は多くの手続き型言語のライブラリで使われていて

ほう、これまた面白い話が聞けた
>>206がいる異次元世界だと、その「copy on write的なデータ構造」を使う
ライブラリが手続き型言語プログラマの間では「ふつうに(>>201)」使われているんだ

関数型言語で「ふつうに」リスト操作している(>>172)のと同様に
手続き型でも永続データ構造が使われているとは、
>>206のいる異次元世界はプログラマにとって理想郷だね!!(棒
210桃白白 ◆9Jro6YFwm650
垢版 |
2014/09/10(水) 22:56:17.03ID:6zdXUVOl
>>209
Stringとか
2014/09/10(水) 23:05:15.07ID:MIzNsnl2
>>210
String は単純型だからデータ構造やライブラリには含まれない
もし String を含めるのなら Integer もデータ構造の一種になってしまう
212桃白白 ◆9Jro6YFwm650
垢版 |
2014/09/10(水) 23:08:58.07ID:6zdXUVOl
>>211
単純型ってなんすか?
BigIntとか
2014/09/10(水) 23:20:47.47ID:MIzNsnl2
>>212
単純型とは、他の型から構成されることのないデータ型であり、
文字列型の他には、論理型、文字型、列挙型、数値型がある
関数型言語の Lisp や論理型言語の Prolog だとアトムとも呼ばれる
214桃白白 ◆9Jro6YFwm650
垢版 |
2014/09/10(水) 23:22:03.29ID:6zdXUVOl
>>213
他の型から構成されることがないってどういう意味っすか?
2014/09/10(水) 23:32:19.53ID:MIzNsnl2
>>214
たとえばレコード型(C言語であれば構造体)は、
単純型、配列型、別のレコード型といった「他の(複数の)型から構成」される
また配列型も整数型、文字型、レコード型といった「他の型(の反復)から構成」される
そしてレコード型や配列型は、要素となった他の型に分解できる

それに対して、単純型は「他の型から構成されることがない」
言い換えると、単純型は(他の型へ)分解できない根源的なデータ型になる
>>213で書いたアトムも、物理学の(分解できない)原子が語源になっている
2014/09/10(水) 23:45:56.12ID:ADC46RWM
単純型‥もう、アーキュムレータとかその他レジスタに載る型、ということにしては?
2014/09/11(木) 06:06:05.80ID:/5wQig/e
>>211
Stringが内部データ構造を持っていたりライブラリで提供されている言語や処理系なんて山ほどあるだろ。
StringがCharのリストとして実現されている言語や処理系も多い。
関数ムラの住民はやっぱりムラの外の事情には疎いんだね。よーーーーくわかりましたw
2014/09/11(木) 10:27:37.46ID:ZRdF18oF
>>217
関数型でもCharのリストで扱う言語あった気が
2014/09/11(木) 12:11:59.58ID:/5wQig/e
むしろStringが単純型なのはLISP系ぐらいでは
2014/09/11(木) 12:59:06.68ID:ThP8Tlio
>>216 型理論(型システム)的には全く無意味だからそれ
2014/09/11(木) 12:59:52.98ID:ThP8Tlio
> 関数ムラの住民はやっぱりムラの外の事情には疎いんだね。よーーーーくわかりましたw

自分がバカっぷりをさらしてることはわからないんだねw
2014/09/11(木) 13:06:24.74ID:ThP8Tlio
ていうか、関数型ムラに居て、HaskellのStringが[Char]だと知らない奴がいるもんかw

あと、流石に効率が悪いことも多いってんで、最近はText型とその周辺の実装が進められてる。
2014/09/11(木) 13:39:24.40ID:/5wQig/e
ハァ?誰もHaskellの話なんてしていないぞ。

そんなにHaskellの話がしたければHaskellスレに行けば?
「Stringは単純型だと言ったらいじめられた〜」とか言えば
みんな同情してくれるだろw
2014/09/11(木) 14:10:25.16ID:AMEA56Qh
桃白白はVBScriptしか知らないからあの答えで合ってるの。
2014/09/11(木) 17:15:48.36ID:ThP8Tlio
> みんな同情してくれるだろw

おれは苛めてるんだ、と、自分を騙すのに必死なのかw
2014/09/11(木) 17:18:44.69ID:Eq/MhJWf
Stringが単純型しかないLisp以外の言語まだー?
2014/09/11(木) 19:02:59.76ID:ZRdF18oF
Stringがプリミティブな言語自体は存在するけど(手続き型ならBASICとかPerlとか)
>>211 はStringは単純型、と言い切っちゃってるからな
2014/09/11(木) 20:03:48.12ID:Eq/MhJWf
しかもBASICやPerlにしても文字列を内部実装として永続データ構造で保持してる処理系とか普通にあり得るし。例えばPerlのHaskell実装とか。
2014/09/12(金) 00:22:55.80ID:ke/j7I6c
で?
2014/09/12(金) 02:10:37.29ID:KXHcVpz6
元々なんの話だったんだっけか、よく分からんくなってきた
2014/09/12(金) 03:48:40.55ID:5DSOPRX8
結論
ハスケル村民は中二病
2014/09/12(金) 19:25:03.94ID:i5Uyd5M3
>>230
>>186参照
関数型言語の関数型というのはただの手法であって言語という程のことではないらしい
haskellは何言語と呼べばいいんだろう
2014/09/12(金) 19:43:34.87ID:ke/j7I6c
文脈のある文章を文脈から取り出してセンセーショナルに騒ぐ奴はバカ、でFA
2014/09/12(金) 19:54:30.05ID:i5Uyd5M3
関数志向宣言型プログラミング言語って呼べばいいのかな
2014/09/12(金) 19:55:16.20ID:i5Uyd5M3
誤字った
関数指向宣言型プログラミング言語
2014/09/12(金) 20:06:23.28ID:Iy5dUXcN
略して関数型言語
237
垢版 |
2014/09/13(土) 11:02:47.39ID:NSrcGDnS
connect4をみんな大好きhaskellに移植したぞ。
こんどこそ添削たのむな。

http://www.age2.tv/rd05/src/up4254.txt
238
垢版 |
2014/09/13(土) 19:54:59.71ID:NSrcGDnS
>>237のコードは一手打つたびに盤面を丸コピーしてると思うんだが
そこらへんコンパイラが上手いことやってくれてるの?
239デフォルトの名無しさん
垢版 |
2014/09/14(日) 00:53:22.93ID:N78ccrO0
囲連星で
2014/09/14(日) 07:25:06.11ID:3VDbXkPO
>>237
letのかわりにwhereで、
ifのかわりにパターンマッチで書き換えれば
Haskellっぽくなる。
241
垢版 |
2014/09/14(日) 10:08:34.40ID:rj6ubMt8
>>239
そんなに囲連星AIがほしけりゃ自分で作れよ。なんで人にやらせようとするんだよ。

>>240
添削ありがとうございます。
whereは変数を定義する前に参照してるみたいで気持ち悪いです。
まあ、慣れの問題なんでしょうが。
242デフォルトの名無しさん
垢版 |
2014/09/14(日) 15:18:34.44ID:sID153LP
最初のほうだけ読んだけど、
言語知らなすぎだろ。

それで言語作ろうなんて、10年早いわ。

もっとも、実用性なんてどうでもいい。
言語作ってみたいとか、作ることで、プログラミングというものを知りたいってのなら、
まったくもって問題無く、むしろ頑張れって感じだけど。
243
垢版 |
2014/09/14(日) 15:57:37.44ID:rj6ubMt8
>>239
ちなみに囲連星AIは昔作ったことある。
もっといえばゲ制作板の囲連星AIスレの380は俺だ。
ちなみに9路囲連星のGUIを作ったのも俺。
囲連星は一回やってもう挫折してるんだよ。

>>240
とりあえず、パターンマッチにしてみました。
letはそのまんま。だってwhereきもいんだもん。

http://www.age2.tv/rd05/src/up4284.txt.html

>>242

まあな。俺の実力じゃ実用的な言語を作るのは無理だろうな。
でもそれはほとんどのプログラマがそうだろ。
実用的な言語つくれるプログラマなんて一握りだろ。
もっといえば実用的な言語って一人で作れるようなものじゃないだろ。
244デフォルトの名無しさん
垢版 |
2014/09/14(日) 16:15:43.91ID:w3keaoOy
囲連星ってそんなに難しいか?
やってみるか。
245デフォルトの名無しさん
垢版 |
2014/09/14(日) 16:39:35.29ID:sID153LP
>>243
自分がそうだからって、
「ほとんど」とか、他の人を巻き添えに足引っ張るな。

自分の未熟さを棚に上げる愚かな行為だ。

RubyのMazsとか、言語オタクだぞ。

そうじゃなきゃ作れないってことだ。
246
垢版 |
2014/09/14(日) 17:59:15.91ID:rj6ubMt8
>>244

がんばれ、応援するよ。LV3越えは俺の悲願でもあるから。
だれかほかの人でも達成してくれたらうれしい。
できあがったらゲ制作の囲連星AIスレで報告してくれ。

>>245

そこでMatzみたいなスーパースター引き合いに出してどうすんだよ?
Matsは一握りかほとんどかで言ったら明らかに一握りだろ。
そのMatzにしたってRubyコミュニティの支えなしじゃここまでやれなかっただろ。
だいたいGoとかD言語みたいなスーパースターたちが作った言語だって
はたして「実用」と呼べるほどのユーザーを獲得してるかどうか。
言語をつくるって大変なことだと思うよ。
まあ、自分の未熟さを棚にあげてるのはそうかもしれんが。
247
垢版 |
2014/09/14(日) 18:14:29.35ID:rj6ubMt8
あら、MatzがMatsになってた。
誤字すまん。
2014/09/14(日) 18:30:48.41ID:s+BV7Cb9
新言語かぁ‥誰しも夢見るね‥haskell が圏論というのであれば、今後新言語を作るとすれば何を足がかりにすればいいのか?
2014/09/14(日) 19:26:12.34ID:r0J72yK/
Haskell自体は圏論ベースじゃないぞ。
モナドだけ。
2014/09/14(日) 19:33:25.07ID:s+BV7Cb9
そうなのか‥懐かしい名前、大熊正先生の著書をヤフオクでえらい高い値段でgetしてしまった(無論、読めやしない‥専門書って大変だね‥)が、無意味だったようだね
251デフォルトの名無しさん
垢版 |
2014/09/14(日) 20:19:23.00ID:NJi0vj84
集合論に基づく言語は、SIMDやメニーコアが発展していくうちに普通になると思うけど、
今は、C++をシンプルにした感じのスクリプト言語が欲しい。
まだ、集合論に基づく言語が手続き型を超える性能を出せる環境になってないから。
252
垢版 |
2014/09/14(日) 20:55:06.50ID:rj6ubMt8
結局、ハードの作りが根本から変わらん限り
C/C++を超える言語は現れないんじゃないかな。
超えるっていってもどういう意味で超えるのか微妙だけど。
2014/09/14(日) 21:30:29.03ID:s+BV7Cb9
C の言語仕様にキャリーフラグを含めてほしかった‥ちょっと今苦戦中
254
垢版 |
2014/09/14(日) 22:27:09.05ID:rj6ubMt8
C言語の言語仕様だけでキャリーフラグって実現できるんだっけ?
できるんだろうけど、ぱっと思いつかないな。
2014/09/14(日) 22:52:20.28ID:r0J72yK/
これ参考になるかも
ttp://d.hatena.ne.jp/tociyuki/20140906/1410012689
256
垢版 |
2014/09/14(日) 22:53:39.24ID:rj6ubMt8
最悪、すべての演算結果をテーブル化しておけば実現できるなw
効率的にはどうやるんだろう?
257
垢版 |
2014/09/14(日) 22:54:40.97ID:rj6ubMt8
おおっとリロードしてなかった。
258デフォルトの名無しさん
垢版 |
2014/09/15(月) 00:55:12.74ID:MGTym664
ts
259240
垢版 |
2014/09/15(月) 06:10:27.36ID:8SU9zqnx
>>243
たとえば、
let c = map digitToInt ( filter isDigit s)

let c = map digitToInt . filter isDigit $ "123"
にできる。
さらに、
s_to_line :: String -> [Int]
s_to_line = map digitToInt . filter isDigit
と関数を定義しておいて、
let c = s_to_line s
とすると、ググッとHaskellっぽくなる。
260
垢版 |
2014/09/15(月) 10:47:17.06ID:bIq53OoI
>>259
これが関数の合成ってやつか。
すごく…気持ち悪いです。
なれれば快感になりそうだが。
261
垢版 |
2014/09/15(月) 11:16:32.32ID:bIq53OoI
しかしOcamlよりhaskellのほうが書いててたのしいな。
なんでだろう?
2014/09/15(月) 15:28:20.49ID:kzUO2epp
写真には写らない美しさがあるから
2014/09/15(月) 16:34:50.30ID:kAk3iSbn
リンダリンダ〜♪
264
垢版 |
2014/09/15(月) 16:46:42.27ID:bIq53OoI
だれか>>243のコードのplayの関数を、一手打つごとに盤面を丸コピーしないで済むように改善してください。
よろしくお願いします。
265
垢版 |
2014/09/15(月) 20:32:54.71ID:bIq53OoI
>>259
修正しました。仮引数ないと違和感ありますね。
http://www.age2.tv/rd05/src/up4346.txt.html
266240
垢版 |
2014/09/16(火) 09:53:54.34ID:Qs6Ucf5H
>>264
http://hackage.haskell.org/package/matrix-0.3.4.0/docs/Data-Matrix.html
2671
垢版 |
2014/09/16(火) 19:15:18.40ID:bFn0xUvd
>>266
MatrixのsetElemは丸コピーじゃないの?
丸コピーじゃないなら参照透過性はどうなるの?
268デフォルトの名無しさん
垢版 |
2014/09/16(火) 19:28:35.09ID:i9frET+F
参照透過性は、プログラマが気にすることではない。
コンパイラ、言語が気にすること。
純粋関数型言語は、参照透過性に違反できないのが原則。
純粋関数型でコンパイルが通れば参照透過性がある。
269
垢版 |
2014/09/16(火) 19:43:03.56ID:bFn0xUvd
>>268
それじゃ丸コピー?
270
垢版 |
2014/09/16(火) 20:03:52.99ID:bFn0xUvd
setElemの計算量オーダーが書いてないな。
ほかのは書いてあるのもあるのに。
2014/09/16(火) 20:35:47.52ID:+Ut5bl5+
>>269
純粋関数型言語における配列の実装は、
一般的には B-Tree またはその亜種を用いるのが一般的
で、常識的には更新する要素とは無関係な部分ツリー(への参照)を
そのまま(更新後の)新しい配列に引き継ぐから、丸コピーにはならない
(Data.Matrixのソースを確認した訳じゃないんで、あくまで一般論であることに注意)
また、配列を利用するアプリケーション側でも、必要な複数の更新操作を関数合成で
まとめてから適用するのが一般的だから、更新のオーバヘッドもさほど気にならない

更に言えば、>>243のように(ライブラリを用いず)自前でリストを配列に見立てて
配列操作を実装するのは自由な選択だけど、メモリ効率を考慮しなければならないケースであれば、
(>>243のように)配列更新のたびにリストを丸コピーするのは、お馬鹿さんと言うしかない
リストの一要素だけを更新する時、更新した要素の tail リストは更新後のリストと共有できるはずだ

最後に、こういったパズル/ボードゲーム系の全解探索問題を記述する場合、何も考えず
ゲームの局面ごとに盤面全体を丸々コピーするコードを書いてしまうのは、純粋/非純粋な関数型に限らず
手続き型プログラミングであったとしても初心者レベルのコード設計力だと見なすしかない
通常、チェスや将棋のように膨大な空間を探索しなければならないゲームのプログラミングでは、
プレイの「一手(いって)」に関する情報だけを局面として記憶し、差分として管理する
272
垢版 |
2014/09/16(火) 20:55:03.92ID:bFn0xUvd
ふーむ。
たしかにツリーをつかえば丸コピーは避けられるかもしれないな。
勉強になりました。
273
垢版 |
2014/09/16(火) 21:47:36.14ID:bFn0xUvd
Data.Matrixがないって言われる…
なぜ?

$ ghc connect4_4.hs

connect4_4.hs:3:8:
Could not find module ‘Data.Matrix’
Perhaps you meant
Data.Ratio (from base)
Data.Ratio (needs flag -package haskell2010-1.1.2.0)
Use -v to see a list of the files searched for.

$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.8.3
274240
垢版 |
2014/09/16(火) 22:18:12.61ID:Qs6Ucf5H
>>273
cabal install matrix
275
垢版 |
2014/09/16(火) 22:31:31.46ID:bFn0xUvd
>>274
ありがとうございます。コンパイルできました。
でも[[Int]]をMatrixに置き換えたらバグが発生。
ただいまデバッグ中です。
2014/09/16(火) 22:50:04.77ID:fJmUlCeF
>>253
アセンブラ以外で言語仕様にキャリーフラグが関与する演算子があるのは TL/1 しか見たことない
277
垢版 |
2014/09/16(火) 23:22:16.78ID:bFn0xUvd
Matrix版できたっぽいのであげます。

http://www.age2.tv/rd05/src/up4372.txt

Matrixのindexは1から始まるそうなのでそれに合わせて外部仕様も変更しました。
いままでは列の指定が0〜6だったのが1〜7になります。
今思えば外部仕様まで変えることはなかったような気もしますが後の祭り。
278デフォルトの名無しさん
垢版 |
2014/09/16(火) 23:34:02.05ID:i9frET+F
よく知られてるゲーム、GUIのあるゲームで頼む。
麻雀、OTHELLO、将棋、囲連星はwindowsGUIはある。
279
垢版 |
2014/09/16(火) 23:38:22.55ID:bFn0xUvd
習作だから実用性はあんまり求めてないんだよなぁ。
connect4は小さい割に動いてるもの作ってる気になれるから気に入ってる。
280240
垢版 |
2014/09/17(水) 06:12:56.94ID:Rq9rJBGz
>>277
結構よいのでは。
しつこいけど、whereは1度使ってみたらいいんじゃないかなあ。
letで頭から読む/書くという感覚もわかるけど、
whereを使うと、1つの関数定義全体を宣言的に読む/書く感覚がわかると思う。
2014/09/17(水) 12:19:24.89ID:pJCF9C7A
>>268
>参照透過性は、プログラマが気にすることではない。(略)
>純粋関数型でコンパイルが通れば参照透過性がある。

コンパイル通るかどうか気にする必要あるじゃんかw
2014/09/17(水) 13:02:50.04ID:Rq9rJBGz
>>268
> 純粋関数型でコンパイルが通れば参照透過性がある。

え?純粋関数型で型検査によって参照透明性を確保しているのはHaskellぐらいでは。

Haskell以外の、例えばMirandaやClean等の他の純粋関数型言語では、
型システムに依存せずに言語機能を制約して参照透明性を確保している
という理解なんだが。
283デフォルトの名無しさん
垢版 |
2014/09/17(水) 13:40:46.72ID:Fq6HYI62
参照透過性は型とは関係ないだろ?
型があってもなくても破壊的代入があったらアウト。
2014/09/17(水) 13:41:37.54ID:pJCF9C7A
ちょっと本題から外れるが。

たしかに本格的に型システムと一体化させたのはHaskellからだけど、
Mirandaから参照透過性に対して型システムは使い始めてる。
MirandaでKAOSってOSを記述した時のinteract型が、
Miranda本体にも取り入れられてる。
この時に導入されたcomp, returnがmonadタイプの定式化の元になった。
E. Moggiが"Notions of computations and monads"で定式化して。
Haskellを設計、開発することになったのは、
この辺を本格的にやろうと思うとオープンソースじゃないとやりにくいから。
2014/09/17(水) 14:19:32.02ID:Rq9rJBGz
>>284
確かにMirandaの評価戦略でのIO絡みの例外的扱いは、
HaskellのIOモナドの原型っぽい感じだな。
286
垢版 |
2014/09/17(水) 19:25:16.95ID:zOPUPbSB
>>280
where使ってみました。
ただ、gameの中のletはどうやってwhereにすればいいかよくわからなかったのでletのままです。

http://www.age2.tv/rd05/src/up4389.txt
287240
垢版 |
2014/09/18(木) 17:39:55.46ID:gCmSXIgb
>>286
doの中のletは仕方ない。そういうもの。
もう普通にHaskell入門レベルはクリアしてると思う。
不要な括弧が結構あるけど、それは単に慣れの問題だから構わないと思う。
おつかれさん。
288
垢版 |
2014/09/18(木) 19:52:18.04ID:WHOt2iCh
>>287
ありがとうございます。

haskell触ってみたけど、今のところ関数型言語や参照透過性の有難さはあんまり実感できてない。
CPUのコアがもっと増えてコンパイラの最適化が今より強力になったらどうかわからんが、
C/C++より効率的なコーディングをするのは難しそう。

かといって生産性が劇的にあがるかというとそんな感触もなかった。
RubyにはC/C++より生産性高いと思わせるなにかがあったが
haskellとRubyを比べた時、はたしてhaskellのほうが生産性高いかといわれると?
もうちょっとデカいアプリを組んでみる必要があるのかもしれんが。

とりあえず、haskellでコーディングされた実用的で有名なアプリがあれば教えてほしいです。
289デフォルトの名無しさん
垢版 |
2014/09/18(木) 19:55:50.99ID:7eeU4PcQ
Monadius
1985年5月29日、そのゲームは、全国のゲーマーに衝撃を与えた。
らしい。
僕はよく知らない。そのときまだ生まれたばかりだったからだ。
20周年をむかえたグラディウスと、 ゲームを、ゲームプログラミングを愛する人たちに感謝を込めて贈る。
http://www.geocities.jp/takascience/haskell/monadius_ja.html
290
垢版 |
2014/09/18(木) 20:11:37.12ID:WHOt2iCh
>>289
これはすごいかも。
291
垢版 |
2014/09/19(金) 19:22:36.10ID:KT7u8M0C
>そういうデータの一塊であるMonadiusが、 updateMonadius, renderMonadius, isMonadiusOverという演算に関してGameを成す、と宣言されています。
これが圏論ってやつ?
2014/09/19(金) 19:58:12.78ID:vmyXN9M9
数学得意なら圏論から攻めてもいいと思うけど、
モナドは圏論わからなくても使うことはできるので...
293
垢版 |
2014/09/19(金) 20:19:26.79ID:KT7u8M0C
数学は好きだけど下手の横好きだな。
>>291のことがわかればもうちょっとhaskell好きになれそうなんだけど。
294240
垢版 |
2014/09/19(金) 21:47:04.42ID:3WQN+no2
>>293
それ自体は圏論じゃなくて型クラス。
型gがGameクラスであるためには
そのupdate, render, isGameoverの3つのメソッドが必要だと宣言されていて、
Monadius型はGame型クラスのインスタンスです、
メソッドはそれぞれupdateMonadius, renderMonadius, isMonadiusOverになります、
というもの。
295
垢版 |
2014/09/19(金) 22:15:41.15ID:KT7u8M0C
>>294
よくわからんがC++のテンプレートやjavaのインターフェースともちょっと違う感じ?
2014/09/19(金) 22:17:11.20ID:uV7lv+mi
これは最近よく目にするfilter-map-reduceとは違うの?
297240
垢版 |
2014/09/20(土) 07:19:58.23ID:p45kbQiW
>>295
型クラスは値ではなくて型のクラスってところがユニーク。

Haskellの型クラスはJava等のインターフェースより柔軟に使える。
Java等のインターフェースとクラスの関係は、
クラスを定義する時に「このインターフェースを実装します」と宣言するけど、
Haskellの型クラスでは、型クラスと型をそれぞれ別々に定義した上で、
「この型はこの型クラスのインスタンスだよ」と宣言する。
つまり、既存の型や既存の型クラスを使って、後から
「この型をこの型クラスのインスタンスとして使うよ」ということができる。

実は、286のコードでも型クラスのメソッドが多数使われている。
Ord型クラスのメソッドの>とか<とか、Eq型クラスのメソッドの==とか。
あと、game関数やmain関数の型を見ると、IO型クラスを使っていることがわかる。
2014/09/20(土) 12:34:10.95ID:rTgfsjb+
C++14で型クラス的なconceptってのが入りそうになったけど、
時期尚早ってことで見送られた。
次にStroustrupが簡略化した版が入る予定。
2014/09/20(土) 17:49:48.64ID:k+DS8D97
>>1は何をしたいんだ。
関数型言語は効率が悪そうたって、「集合論に基づいた言語」とかいうのはもっと効率が悪くなるだろうに。
300
垢版 |
2014/09/20(土) 22:48:20.83ID:YTPHYjLC
>>297
すいません。後付けできるってのがよくわからないです。
コンパイル時には明示的に宣言しないといけないのは型クラスもインターフェースも同じですよね?

>>299
集合論に基づいた言語は教科書の章末問題をサクサクっとインプリメントすることを目的としてる。
実用性はあんまり求めない。
2014/09/20(土) 23:24:10.24ID:rTgfsjb+
http://en.wikibooks.org/wiki/Haskell/Classes_and_types
のA concerted exampleと同じことをtype classなしで書いてみれば?
type classがあると細々としたことまで、
少ないコード量で強く型付けできることが分かるはず。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況