関数型言語は何故普及しないのかを考える
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2010/06/22(火) 23:05:060002デフォルトの名無しさん
2010/06/22(火) 23:13:59最近の言語はどれも中間的な言語になっている
0003デフォルトの名無しさん
2010/06/22(火) 23:14:12コンピュータの話に限らない。
文章だって長々と一文で書くより、
分けて書いたほうがわかりやすいだろ?
それと同じ。
0004デフォルトの名無しさん
2010/06/22(火) 23:38:220005デフォルトの名無しさん
2010/06/22(火) 23:39:16数式<<<関数型<<<手続き型<英語<日本語<<<<<<映画(字幕スーパー)
0006デフォルトの名無しさん
2010/06/23(水) 01:31:100007デフォルトの名無しさん
2010/06/23(水) 01:42:25何で普及しないのか書けよ。
0008デフォルトの名無しさん
2010/06/23(水) 05:36:36言語訓練のために立てたものです。
アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。
京都大学霊長類研究所
0009デフォルトの名無しさん
2010/06/23(水) 07:40:28布教活動がふぬけているからに決まってる。
関数型言語でゲームを「いっぱい作った」実績を見せたり、
業務アプリを「素早く作った」実績を見せたりすれば、
誰もが注目し、ちゃんと普及する。
それなのに、薦める奴らは何で実績を見せないんだろうな。
たまに実績を示す奴でも、海外の誰々という研究者が
GUI のエディタを関数型で作ったとか、
日本の誰々がグラディウスを移植したとか、そんな話ばっか。
「おまえでも」そういうアプリが作れるという実積を見せなきゃ、
誰も感銘なんて受けないのに。
0010デフォルトの名無しさん
2010/06/23(水) 09:09:310011デフォルトの名無しさん
2010/06/23(水) 09:10:20分類がふぬけている
分類が時代遅れ
0012デフォルトの名無しさん
2010/06/23(水) 10:19:01キーワードやブロックの記述が C と似てないのは
覚えるのがめんどくさい。
0013デフォルトの名無しさん
2010/06/23(水) 12:37:41勘違いさせたしまったようで悪かった。
俺が言いたかったのは、
関数型も実用的だよと言って薦めてくる「作者以外の奴ら」の事。
モナディウス作者はこの話の中に限れば、どうでもいいんだよ。
「モナディウスも作れるんだぜ、だから関数型は凄いよ、使えるよ」
という奴らに対して「君は何を作ったの? 何を作れるの?」と訊くと、
たいていは答えられない。
ちゃんと答えられる布教者が何人も出てくると、
普及する兆しがちょっと出てくる。
0014デフォルトの名無しさん
2010/06/23(水) 13:14:050015デフォルトの名無しさん
2010/06/23(水) 13:40:16でも、売れ残った卵から生まれたやつらは、自分達が生存競争に勝ってると思ってる。
0016デフォルトの名無しさん
2010/06/23(水) 20:15:56お前は手続型で何を作れるの?
0017デフォルトの名無しさん
2010/06/23(水) 20:53:21自社内の製品管理システムを作った
自社内のテクスチャエディタを作った
その他色々、挙げきれない
0018デフォルトの名無しさん
2010/06/23(水) 20:53:580019デフォルトの名無しさん
2010/06/23(水) 21:24:33利用者がやりたいことを(ある程度)実現するソフトウェアを作っただけだ。
おまえの中ではどういうのを凄いと言うんだ?
0020デフォルトの名無しさん
2010/06/23(水) 21:32:33それでいてかつ、それなりの規模があるソフトである必要はあるだろうな
0021デフォルトの名無しさん
2010/06/23(水) 21:40:230022デフォルトの名無しさん
2010/06/23(水) 21:58:04目的にしてしまっては普及は不可能だ。
あくまでも目的は、ある要求に対して
これくらい早く簡単にプログラムできる、
これくらい分かりやすくプログラムできる、
「小規模なら熟練者じゃなくてもソフトウェアが作れる」
ということをちゃんと示す事。
そのために関数型言語の特徴を利用する。
ソフトウェアの規模は、普及させる初期段階では
それほど必要ではないと思うし、
関数型言語はまだ初期段階にすらなってないように感じられる。
0023デフォルトの名無しさん
2010/06/23(水) 22:57:16特長の利用は目的と言っても過言ではないよ
0024デフォルトの名無しさん
2010/06/23(水) 22:58:22性能が劣っているというこてゃない。むしろその逆
0025デフォルトの名無しさん
2010/06/23(水) 23:27:51仮にメリットがなくて互角だとしても、どっちかが偶然に流行るわけだが
そっちが偶然を信じないなら、あっちが不戦勝だ
0026デフォルトの名無しさん
2010/06/23(水) 23:45:26そのあたりを大きな規模の具体的なプログラムで説明しないから
実感湧かないんだと思うぜ
0027デフォルトの名無しさん
2010/06/24(木) 00:03:330028デフォルトの名無しさん
2010/06/24(木) 00:14:51本質を理解しようとせず、無闇矢鱈と意味も無く闇雲に嫌っているだけで、
どうやったって救いようが無いから、原因を考えたって無駄だって言っただろ。
奴らが関数型言語のメリットを理解するには後500年は掛かるぜ。』
↑みたいな意見が出るかと思ったら意外とそうでもなかったね。
0029デフォルトの名無しさん
2010/06/24(木) 01:23:400030デフォルトの名無しさん
2010/06/24(木) 03:30:40無い人たちなんだから、一々相手にしなくていいでしょ。使いこなす能力を持ってる人が
便利に使えばそれで良いだけ。関数型言語を理解出来ない人がどれだけいようと、
俺等には関係無いし、普及するのがそんなに大事な事か疑問だね。』
↑こういう意見も無かったな。
0031デフォルトの名無しさん
2010/06/24(木) 03:40:58個人のサーバーサイドプログラミングなんかで使える人が使えばいいというのは事実
0032デフォルトの名無しさん
2010/06/24(木) 12:23:390033デフォルトの名無しさん
2010/06/24(木) 13:36:580034デフォルトの名無しさん
2010/06/24(木) 17:15:36Scalaの求人は急激に増加し、すでに他の関数型言語を上回りました。
「関数型言語は普及しない」はScalaには当てはまりません。
Scalaは非常に豊富なJavaライブラリを利用できます。
また、手続き型風にも関数型風にも書けます。
純粋関数型言語が普及しない原因はライブラリ不足と
関数型では書きにくい処理があるためと考えられます。
0035デフォルトの名無しさん
2010/06/24(木) 21:37:56>すでに他の関数型言語を上回りました。
が何で
>「関数型言語は普及しない」」はScalaには当てはまりません。
に繋がるの?
人気のある普通の言語と比べないと意味無いじゃん
0036デフォルトの名無しさん
2010/06/24(木) 22:09:00他の人気のある言語には普通にある類のライブラリが欠けている事はたしかだ。
さっさとスタンダードと言える GUI ライブラリを整備して欲しい。
これが無いままなら、普及なんて絶っっっっ対にムリだよ。
0037デフォルトの名無しさん
2010/06/24(木) 22:18:360038デフォルトの名無しさん
2010/06/24(木) 22:20:45普及する事が全てだろ
でなきゃスレチじゃないか
0039デフォルトの名無しさん
2010/06/24(木) 22:57:560040デフォルトの名無しさん
2010/06/25(金) 21:05:080041デフォルトの名無しさん
2010/06/25(金) 22:59:49吾輩は猫である。
名前はまだ無い。
どこで生れたかとんと見当がつかぬ。
何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。
吾輩はここで始めて人間というものを見た。
【関数型小説】
人間というものを始めて見た薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶しているがどこで生まれたかとんと見当がつかず名前がまだ無い猫である吾輩。
どっちが読みやすい?
0042デフォルトの名無しさん
2010/06/25(金) 23:09:11ところで、関数型小説がそのようになる根拠を示してくれ
どあたりが「関数」なんだ?
0043デフォルトの名無しさん
2010/06/25(金) 23:13:23関数型言語で3重ループとか書いてみればわかるよw
0044デフォルトの名無しさん
2010/06/25(金) 23:15:540045デフォルトの名無しさん
2010/06/25(金) 23:22:370046デフォルトの名無しさん
2010/06/25(金) 23:25:39大昔のコピペだから、それ
小説っつってるから文体(と言うのか?)を見て「関数」かどうかは無視してるんだろ。
関数型言語でも結果を毎回一時変数にbindすれば見た目手続き型と同じになるだろうけど、
そうしないで書いちゃうこと多いから見づらいと感じる人が多いんだろうね。
0047デフォルトの名無しさん
2010/06/25(金) 23:34:38Smalltalk のカスケードも変数を介さないで複数の式を繋げる
手法の一つ。それらが見辛いとは思わないね。
0048デフォルトの名無しさん
2010/06/25(金) 23:40:35関数型言語は普及しないと。
0049デフォルトの名無しさん
2010/06/25(金) 23:48:590050デフォルトの名無しさん
2010/06/26(土) 01:06:10関数型言語で3重ループってなんだよ。
関数型は Haskell しか使ったことないが、
3重ループなんて見たことないぞ。
0051デフォルトの名無しさん
2010/06/26(土) 01:29:40名前 我が輩 = undefined
記憶 我が輩 = [薄暗いじめじめした所でニャーニャー泣いていた]
経歴 我が輩 今 = ここで始めて人間というものを見た
0052デフォルトの名無しさん
2010/06/26(土) 11:11:430053デフォルトの名無しさん
2010/07/18(日) 02:25:57具体的に言うとWindowsで使わせる気が無いのが悪い。
普及させたければ何よりもWindowsユーザーを最優先しないといけない。
0054デフォルトの名無しさん
2010/07/18(日) 02:39:520055デフォルトの名無しさん
2010/07/18(日) 03:11:38閉じた世界にいるくせにレベルとかお笑いだな。
0056デフォルトの名無しさん
2010/07/18(日) 09:04:04そのとおりだ。関数型プログラミングのウリはモジュール性なのに、
全部一から作るつもりかよ。
0057デフォルトの名無しさん
2010/07/19(月) 22:47:58手続き型のコードを一つ一つ追っていく方が読み易いのは俺だけなんだろうか
0058デフォルトの名無しさん
2010/07/19(月) 23:13:07もったいなくて数学を捨てられないタイプの人は関数型の方が安心だろうね
0059デフォルトの名無しさん
2010/07/19(月) 23:16:41手続き型でも関数型でもどちらでもよいのですが
たとえば
1 + 2 + 3 + ... + n
を計算するプログラムを書くときに
ちゃんと
Σn
の公式にに発想をチェンジしてくれる言語はありますか?
0060デフォルトの名無しさん
2010/07/20(火) 02:13:320061デフォルトの名無しさん
2010/07/20(火) 03:25:020062デフォルトの名無しさん
2010/07/20(火) 08:49:19APLを求めてるのか?
0063デフォルトの名無しさん
2010/07/20(火) 15:36:560064デフォルトの名無しさん
2010/07/20(火) 15:40:550065デフォルトの名無しさん
2010/07/20(火) 15:44:040066デフォルトの名無しさん
2010/07/20(火) 19:11:21とりあえず、飯を食べれるようにするべきだろ今は。
0067デフォルトの名無しさん
2010/07/20(火) 19:31:490068デフォルトの名無しさん
2010/07/21(水) 10:02:380069デフォルトの名無しさん
2010/07/21(水) 21:10:16あまたある理論よりも、自分のキャリアの終わりまで飯が食えるというのが最も強い。
0070デフォルトの名無しさん
2010/07/23(金) 20:32:49「AをBに発想をチェンジ」の意味をも少し詳しく説明してくれ
文字通りに受け取るなら、AとBをここに書き込んでる時点で
お前は既に発想をチェンジしているはずだが
0071デフォルトの名無しさん
2010/07/24(土) 02:02:56回答者チェンジで
0072デフォルトの名無しさん
2010/07/25(日) 00:00:27同値の和のループを積に最適化するくらいなら普通のCコンパイラでも最適化してくるけど、等差数列はどうなんだろね。
0073デフォルトの名無しさん
2010/07/25(日) 00:34:090074デフォルトの名無しさん
2010/07/25(日) 00:35:18等差数列の和を求めるプログラムである事が分かるためには、
その数列の各項の数値が分からなければならないんだが、
それが分かれば和を公式にしなくても、合計はコンパイル時に分かると思うぞ
0075デフォルトの名無しさん
2010/07/25(日) 04:45:110076デフォルトの名無しさん
2010/07/27(火) 00:44:22http://www.indeed.com/jobtrends?q=Lisp%2CSML%2CHaskell%2CScala%2COCaml%2CC%23&l=
関数型はゴミのようですね。グラフが一本しかないので何か入力を間違えたのかと思いましたw
0077デフォルトの名無しさん
2010/07/27(火) 01:15:59特に理学部で教えないからでしょ。
物理系はFortran,化学系はGaussian,生物系はperlとか分担あるからね。
数学科はgapか。入り込む余地がない。
関数型のkiller用途って何よ?
情報系だけの用途で自己満足してる気がする
0078デフォルトの名無しさん
2010/07/27(火) 06:54:41っていうかライブラリがないだけ(にわたまだけど)。
数学科はむしろ関数の本家だろ。
0079デフォルトの名無しさん
2010/07/28(水) 00:11:45というくらいの用途をCS以外の分野では聞かないのだよ。
ライブラリがあったとしても
わざわざ関数型使うって言うのは、一歩間違えると手段と目的を
取り違えてるんではないか?
勉強、パズルとしてはおもしろいよ。
しかし、それ以外の実利的幸せを得られるという話を聞いたことがない。
ベクトル型スパコンの言語を関数型にすると性能が倍になるとか
開発工数やテスト工数が8割減になるとか、
そんな例があれば起爆剤になると思うんだが。
0080デフォルトの名無しさん
2010/07/28(水) 01:16:170081デフォルトの名無しさん
2010/07/28(水) 01:30:25つF#、Scala
0082デフォルトの名無しさん
2010/07/28(水) 02:17:520083デフォルトの名無しさん
2010/07/28(水) 07:21:33そもそも手続き型、関数型それぞれの良いところってどこだ?
0084デフォルトの名無しさん
2010/07/28(水) 09:34:09関数型 自慢できる
0085デフォルトの名無しさん
2010/07/28(水) 22:54:17この人Haskellに結構詳しい人(Ruby界では神レベル)だと思うんだけど、
> 青木 うーん、面白いとは思うけど、書きたいとは思わないなぁ。
って言ってる。理論的には優れてても、実際使うとそうでも、、ってことかな。
確かに俺もHaskellの言語仕様は大体わかってるつもりだけど、実際Haskellで
ある程度のもんは作ったことない。
関数型でGUIとか作り始めたら、モナドだらけになって実質手続き型になるし、
オブジェクト指向だって、他の下位オブジェクトに処理をデリゲート(つまりモナド
に囲い込む)して、自分自身は参照等価っぽいオブジェクトにするってことはよくある。
結局同じだから、ハイブリッドな言語が生き残るのかもね。
>>80
ん?最近の手続き(オブジェクト指向)言語は関数型の概念も取り入れてるぞ。
たとえば俺の得意なRubyだとブロックとか。
[1, 2, 3].map {|x| x * 2 }
で[2, 4, 6]ができるし、
lam = -> x, y { x * y }
って書けば関数オブジェクトが代入される。
あまり知らないけど、C#も関数型を取り入れてるって聞いた。
0086デフォルトの名無しさん
2010/07/29(木) 01:32:25new []{1,2,3}.map(x=>x*2)で[2, 4, 6]なふうになる(出来る)
0087デフォルトの名無しさん
2010/07/29(木) 03:23:27UNIXのC言語、EXCELマクロのVBA、動的Webサイト作成のためのいろんな言語しかり、
まずプラットフォームを提示しなきゃダメだ。それこそめちゃ難しいが。
あと、いわゆる関数型パラダイムを強調すればするほど人が離れていく。
特にメリットが説明出来ない作法については適当に崩していくべきだよ。
0088デフォルトの名無しさん
2010/07/29(木) 13:01:12手続き型では簡単なことを難しく書けるのが関数型。
って、ばっちゃが言ってた
0089デフォルトの名無しさん
2010/07/30(金) 21:06:59奇特な人は関数型プログラミングをすればいい。
009085
2010/07/30(金) 21:16:05そのコード見てC#おもしろそうだな、と思った。色々調べてみたら結構アジャイル
意識する言語なんだな。Windows onlyなのが残念すぎる。
しかし、C#みたいなメインストリームが関数型のいいところを取り入れてること
を考えると、本物の関数型はますます普及し辛くなるんじゃないか?
0091デフォルトの名無しさん
2010/07/30(金) 21:25:14つ Mono
0092デフォルトの名無しさん
2010/07/30(金) 21:34:48おおお、トンクス
C#ちょっとかじってみるかな夏だし。しかし、互換性とか大丈夫なのだろうか。
てか互換性の前にVSがないじゃんかああああ。
0093デフォルトの名無しさん
2010/07/30(金) 22:06:400094デフォルトの名無しさん
2010/07/30(金) 23:19:120095デフォルトの名無しさん
2010/07/30(金) 23:21:57ただし、VC++を使うこと。
さて、大きく分けていったい何種類のやりかたが存在するのだろうか・・・
0096デフォルトの名無しさん
2010/07/31(土) 14:59:05Javaではやらないでほしいな、Javaはシンプル路線で進んでほしい
0097デフォルトの名無しさん
2010/07/31(土) 15:12:510098デフォルトの名無しさん
2010/07/31(土) 15:29:27ヒットする足がかりを Haskell は絶対に得る。
逆に言えば、それがなければ一般大衆には絶対に普及しない。
ただし、wxHaskell や Gtk2Hs などを直接使うような低レベルのライブラリではなく、
その上に一段被せる wxFruit や Grapefruit、FG などで解説しないと意味は無い。
0099デフォルトの名無しさん
2010/07/31(土) 17:45:130100デフォルトの名無しさん
2010/07/31(土) 20:59:36うぁGUI簡単じゃん、おもしれーよ
ってなったら絶対に使うよ
0101デフォルトの名無しさん
2010/07/31(土) 21:04:450102デフォルトの名無しさん
2010/07/31(土) 22:20:160103デフォルトの名無しさん
2010/08/01(日) 07:50:48どんなに凄いライブラリ用意しようが、VisualStudioみたいなIDEを作らないと絶対無理。
0104デフォルトの名無しさん
2010/08/01(日) 13:06:58どこまで使えるかわからんが。
0105デフォルトの名無しさん
2010/08/01(日) 13:52:02型推論のせいでインテリセンスがきかないんじゃねえの。
0106デフォルトの名無しさん
2010/08/01(日) 14:16:140107デフォルトの名無しさん
2010/08/01(日) 14:58:47例えば、引数がレコード(Cの構造体みたいなもん)だった場合
IDEは型がわからないからレコードのフィールド名を補完できないんじゃないの。
0108デフォルトの名無しさん
2010/08/01(日) 17:54:05関数型言語のIDEは、IDE自身もコンパイラと同じ様に型推論するだろ普通。
でなければ関数型用のIDEなんて、とてもじゃないが呼べない。
ただ、Haskell の場合、コード中の前の方で使用している型の定義とかが
それより後ろで定義されていても全く問題なくコンパイルできる。
だから、テキストエディタでそのようにプログラマに記述されると、
その型を初めて使用する段階では型名が分からず補完できない場合もある。
0109デフォルトの名無しさん
2010/08/01(日) 18:40:26わかりにくいとかウザいとかいわれるのが似合ってるんだろうな
0110デフォルトの名無しさん
2010/08/01(日) 18:59:57いや、だからいつ型推論するのw
型推論するには一度は人間がその型が何なのかわかるように書かないとダメじゃん。
つまり、補完の効かない状況で書かないといけない。
一度その引数を使えば以降は補完できるようにはなるかもしれないが
明らかに使い勝手は悪くなるねえ。
補完なんてのはそもそもメソッド名なりフィールド名なりがわからないから必要なんであって
調べなきゃいけないのなら有り難味はほとんどないな。
0111デフォルトの名無しさん
2010/08/01(日) 19:20:55コンパイラにも明示的に型を指定するかそうでなければそもそもジェネリックになってんじゃねーの?
0112デフォルトの名無しさん
2010/08/01(日) 19:26:56定義すれば良いんじゃね?
手続き型でも最初に変数定義してるじゃん。
関数型でも変数定義すればいいんだよ。
0113デフォルトの名無しさん
2010/08/01(日) 20:48:490114デフォルトの名無しさん
2010/08/01(日) 22:13:00明らかに侵食しているにもかかわらず華麗にスルーされるというのに美学がある。
0115デフォルトの名無しさん
2010/08/01(日) 22:36:51たとえば GHCi は関数名やモジュール名を書きかけて Tab を押すと、
補完してくれたり候補を表示してくれるよね。
あれは、ロードしたモジュールと、今まで定義した関数に関しては、
ちゃんと機能してくれる。
当然だけど、後で定義するつもりの関数に関しては機能しない。
(しかしそれは他言語でも同じ。Haskell の場合それでもコンパイルできるというだけのこと)
ついでに、:t コマンドを使えば VS で言うパラメータヒントみたいなことも、
もっと賢くやってくれる。
俺は IDE の「補完や候補表示」はあれくらいで十分だと思う。
それ以上の機能を持った補完や候補表示って、たとえばどんなのがあるの?
0116デフォルトの名無しさん
2010/08/01(日) 23:26:02>当然だけど、後で定義するつもりの関数に関しては機能しない。
の件はそもそも GHCi はインタプリタだから関係なかったな。
すまん、蛇足だった。
何が言いたかったのかというと、関数は一度定義すれば、
人間が明示しなくても型推論はできて補完もできるだろ、
という事を GHCi を例に挙げて言いたかった。
0117デフォルトの名無しさん
2010/08/05(木) 03:53:25「ぼくちんの考える最適な補完機能」について語る、と。
なかなかスレタイ通りのレスが続いているじゃないかw
0118デフォルトの名無しさん
2010/08/05(木) 09:30:390119デフォルトの名無しさん
2010/08/06(金) 01:50:34ファイル中にある似たような単語を
一覧表示しているだけだよ。
0120デフォルトの名無しさん
2010/08/11(水) 16:54:140121デフォルトの名無しさん
2010/08/11(水) 19:12:000122デフォルトの名無しさん
2010/08/11(水) 19:25:530123デフォルトの名無しさん
2010/08/11(水) 20:06:520124デフォルトの名無しさん
2010/08/11(水) 20:36:500125デフォルトの名無しさん
2010/08/12(木) 10:11:422000年くらいでやっと「Javaって実用になんの?」みたいな扱いだったもんな。
今の関数型は90年代はじめごろのオブジェクト指向とおなじような空気を感じる。
普及はすると思うけど10年以上はゆうにかかる。
0126デフォルトの名無しさん
2010/08/12(木) 10:18:330127デフォルトの名無しさん
2010/08/12(木) 10:24:290128デフォルトの名無しさん
2010/08/12(木) 14:40:08未来の人類が使えるとは限らない
機械人間やアンドロイド、網膜に情報が表示されるような
時代にならないと無理かもしれない
0129デフォルトの名無しさん
2010/08/12(木) 14:55:21あとで試してみます。
0130デフォルトの名無しさん
2010/08/12(木) 20:41:130131デフォルトの名無しさん
2010/08/13(金) 18:32:19OOのようにモジュール性を持たせた設計をしたい、でもOOは理解出来ないから
関数による分割で学習意欲がない人にもそれなりのプログラムがかけるように
なるパラダイムです、って難しい部分を全部割愛して紹介すればいいと思うんだよね。
0132デフォルトの名無しさん
2010/08/14(土) 00:07:11パラダイムを軽く受け流すパラダイムです
0133デフォルトの名無しさん
2010/08/14(土) 01:11:46向いてる現場があったけど関数型言語にはそういうのないだろ。
0134デフォルトの名無しさん
2010/08/14(土) 02:14:05一番上がクラス。これはオブジェクト指向。
その次が関数(メソッド)
クラスは関数の集まりでできている。
構造化言語だ。
そして関数の中身、そこに関数型言語が使われる。
0135デフォルトの名無しさん
2010/08/14(土) 05:08:07宣言的であるがゆえに、状態を分割して閉じ込めるという
OOP的なアプローチが成立しない、というような主張は読んだ記憶がある
CTMCPだったっけ?
あと効率。なんだかんだ言いつつ無視はできない局面は多い
関数型パラダイムは(少なくとも部分的に)有効なのは間違いないし
実際に用いられている所も数多いとは聞くが、
全面的に適用できるほどではない、という辺りが現状か
0136デフォルトの名無しさん
2010/08/14(土) 07:39:18let over lambdaはすべてを内包している
一番上がlet
その次がlambda
0137デフォルトの名無しさん
2010/08/14(土) 15:06:12状態を持たない関数型っぽいスタイルも内包してるもんな
0138デフォルトの名無しさん
2010/08/15(日) 23:19:37OOPには不得意だけど、関数型なら得意という領域をみつけられればいいわけじゃん。
考えられるシナリオとしては、棲み分けて生き延びるというのが妥当なところだと思う。
0139デフォルトの名無しさん
2010/08/15(日) 23:26:00なんでもアリの自由度の高さ故に、実務レベルで使いづらい点というのが逆に出る
ものじゃないかと思う。
ガチガチの制限も分野によっては使いやすさにつながることもあると思うし。
0140デフォルトの名無しさん
2010/08/16(月) 00:24:29関数型言語は制限が多いってことかい?
それはいいとして、作るソフトウェアの種類で
こういうソフトはOOP、こういうソフトは関数型なんて
分けることはできないんだよ。
できるとしたら、一つのソフトのうち、この部分はOOP(GUIとか)
この部分は関数型(アルゴリズムとか)のような感じだな。
何が適しているかはソフトウェアではなく
作る部分によって決まるので、適したものを選ぼうとしたら、
一つの言語で、OOPであり手続き型であり関数型言語のような
なんでもありな言語を使うことになるんだよ。
0141デフォルトの名無しさん
2010/08/16(月) 02:23:010142デフォルトの名無しさん
2010/08/16(月) 09:56:32はげどう! ピュアななんとか言語くらい使い難いものは無い。
>>141
今普及してるから関数型では無い。関数型は100年早いと前レスにあった。
0143デフォルトの名無しさん
2010/08/16(月) 10:09:22Rubyですねわかります
0144デフォルトの名無しさん
2010/08/17(火) 00:11:54今のところなんともいえないけれど、やれることをやたら多くしてしまうと
プロフェッショナルなプログラマーはいいとして、別にそうでもない人たちには
使いづらいものなんじゃないかと思うんだよね。
ソフトウェア開発に関わる人達が全員プロフェッショナルでなんでもありな
道具を使いこなせるというのなら、そのなんでもありな言語を使うべきというのは、
確かにそうなんだけど、現実はそういうわけではないだろう、と。
0145デフォルトの名無しさん
2010/08/17(火) 00:20:15学習コストがやたら高いことは原則行わない。
結局使えるものじゃないと意味ないし。
0146デフォルトの名無しさん
2010/08/17(火) 06:16:520147デフォルトの名無しさん
2010/08/17(火) 06:21:16googleとかが本格的に使い始めれば流行るんじゃないの。
0148デフォルトの名無しさん
2010/08/17(火) 19:58:30流行るのは100年後だ。
0149デフォルトの名無しさん
2010/08/17(火) 20:21:34妄想した段階でプログラミングは完了してる。
0150デフォルトの名無しさん
2010/08/17(火) 22:31:50マシン語は永遠に不滅です。
って言っていた奴が昔よくいたよな。
0151デフォルトの名無しさん
2010/08/18(水) 06:28:28> マシン語は永遠に不滅です。
今の形のコンピュータがある限り不滅。
0152デフォルトの名無しさん
2010/08/21(土) 21:58:300153デフォルトの名無しさん
2010/08/21(土) 22:01:240154デフォルトの名無しさん
2010/08/22(日) 15:38:100155デフォルトの名無しさん
2010/08/24(火) 16:08:16それは作業割り当てが難しいからだよ。
UMLみたいに図でわかりやすく設計書が書けないからだよ。
0156デフォルトの名無しさん
2010/08/24(火) 17:04:450157デフォルトの名無しさん
2010/08/24(火) 17:57:51はぁ?
0158デフォルトの名無しさん
2010/08/24(火) 18:12:23なぜ関数型言語だと作業割り当てが難しいのか、
なぜ図でわかりやすく設計書が書けないのか、非常に興味深い。
極小の簡単なサンプルで、関数型言語で無ければできるのに、
関数型言語だからできないという状況を示してくれないだろうか。
それを使っていろいろ調べてみたい。
0159デフォルトの名無しさん
2010/08/24(火) 18:32:23「関数型言語だと図でわかりやす仕様書が書きにくい」
コーディングレベルで仕様書を書いてるとしか解釈できません。
しかも図で。
0160デフォルトの名無しさん
2010/08/24(火) 18:46:05そんでもってソースコードと1:1に対応するフローチャートしか書けないタイプの。
0161デフォルトの名無しさん
2010/08/24(火) 19:22:55君は大規模アプリを設計するときどうやってるの?
0162デフォルトの名無しさん
2010/08/24(火) 20:12:34プログラム系の業務経験はないから、
大規模アプリを設計したことがない
0163デフォルトの名無しさん
2010/08/24(火) 20:41:36じゃあ、プログラムを作るときに設計をすることはある?
もしあるならどういう設計手法を使っている?
0164デフォルトの名無しさん
2010/08/24(火) 20:59:14ちょうど今 Haskell で 簡単なブロック崩しゲームを作ってるんだけど、
普通に設計してる。
パドルの動き、ボールの動き、ブロックの動き(動かないという仕様)、
それら同士で衝突イベントが発生した時の反応、
などの各ゲーム オブジェクトの仕様と、スコアなどのシステム仕様を個別に決める。
次に、タイトル画面、ゲーム画面、クリア画面、ゲームオーバー画面など、
ゲームの各シーンでやることを個別に決め、シーン毎の繋がり方(遷移)を決める。
**手法という名前は知らないけど、ざっとこんな感じ。
あとは個別に決めたものをそれぞれ yampa のシグナル関数で表して
繋げたらできるんじゃないかと思ってる。
というか、今そう期待して作りかけてる。
0165デフォルトの名無しさん
2010/08/24(火) 21:02:13状態遷移図だけで設計してるの?
0166デフォルトの名無しさん
2010/08/24(火) 21:03:470167デフォルトの名無しさん
2010/08/24(火) 21:14:39そうなってくると今度は開発者同士の連携が重要になる。
自分の意思を相手にすばやく正確に伝えるための定型的なメソッドが無いとやっていられないよね?
0168デフォルトの名無しさん
2010/08/24(火) 21:19:00簡単なブロック崩し程度ならシーンの状態遷移図と、
各ゲーム オブジェクト間の繋がりを四角と線で表せば十分だと思った。
後は、衝突イベントとかキー入力イベントとか、時間切れイベントとか、
そういう各イベントに対してどのオブジェクトがどう反応するのか、
その表を書き表せば、この程度のゲームなら作れるだろと思ってる。
(作りかけなので、設計不足で完成できないかも知れんが、まだ分からん)
>>166
ノートに手描きしてまとめてるが、どういう事が聞きたい?
と言うか、関数型だと設計図描きにくいのは何故? という話に、
プロでもない俺の拙い設計の話なんか聞いて面白いか?
0169デフォルトの名無しさん
2010/08/24(火) 21:30:57ソフトウェアに関してはプロもアマもないよ。
それに、関数型言語に関してはまだ十分研究されていないのだから、
もしかしたらアマ研究者が面白い設計手法を考えているかもしれない。
0170デフォルトの名無しさん
2010/08/24(火) 21:48:200171デフォルトの名無しさん
2010/08/24(火) 21:56:47あとはそれをコードに起こすよな開発スタイルを想定してて、
関数型の言語にはオブジェクト指向に対するUMLのようなものが
ないから仕様もおこせないし、分割もむずかしいと。
そういう感じなんでしょ? >>155 は。
で、>>156以下で、そんなスタイルそのものがナンセンスだって
ツッコミが入ったけど、さらにツッコミが入るのにビビって、
「じゃああんたらは、仕様書とかどう書いてるの」って質問に
質問を返すような反論しかできなくて、具体的に関数型はどう
割り当てが難しいかとか、仕様書を書くのが難しいかとか
説明できないと。
0172デフォルトの名無しさん
2010/08/24(火) 22:11:44しっくり来る方法がないことは難しいことじゃないのか。
0173デフォルトの名無しさん
2010/08/24(火) 22:32:10しっくりくる方法って、コードに一対一で対応するような図の仕様書を
書く方法?
そういうのナンセンスだってツッコミが入ってるんだから、
いやそれは有用だって反論しないと話が先にすすまないじゃん。
(具体例あげて)
自分の言ってるのはそういう仕様書じゃなくて、こういうのだって
話なら、それ言えばいい。
0174デフォルトの名無しさん
2010/08/24(火) 22:34:460175デフォルトの名無しさん
2010/08/24(火) 23:18:02オブジェクト指向開発におけるUMLのような位置づけの設計技法だよ。
関数型言語での開発における○○はあるの?
0176デフォルトの名無しさん
2010/08/24(火) 23:19:47フローチャートはアルゴリズムを書くのには適しているが、
アーキテクチャを書くのには適していないね。
0177デフォルトの名無しさん
2010/08/24(火) 23:21:19クラス図みたいにオブジェクト指向べったりのやつ以外はふつうに使えるじゃん。
0178デフォルトの名無しさん
2010/08/24(火) 23:24:330179デフォルトの名無しさん
2010/08/25(水) 07:19:04逆に聞きたいが、UML の中で関数型では使えないものって、
どれくらいあるんだ。
使えないというのは、使っても
使わなかった時に比べて生産性が上がらないという意味。
0180デフォルトの名無しさん
2010/08/25(水) 10:15:30巨大なオープンソースでは、意思を伝えるメソッドはほとんど無いね
たまたま同じ意思を持っていた人が集まってくる
stand alone complexのようなもの
0181デフォルトの名無しさん
2010/08/25(水) 10:28:36純粋な関数型なら副作用がないのでむしろ手続き型よりも合っている。
0182デフォルトの名無しさん
2010/09/13(月) 23:26:06オブジェクトへのアクセスを少数のメソッド群で行うってのが強力なんじゃないか?
Haskellでもハイレベルなデータ構造を抽象化する機能はあるけど、データ構造とそれを
扱う関数をパッケージ化しないから、実際プログラム書くときに、どの関数を使えばいいのか
わからないみたいな。
0183182
2010/09/13(月) 23:29:32オブジェクト指向の多態性の方が、型クラスによる多態性より直感的なのかなー。
0184デフォルトの名無しさん
2010/09/13(月) 23:57:550185デフォルトの名無しさん
2010/09/15(水) 03:19:080186デフォルトの名無しさん
2010/09/20(月) 13:07:25なんなんだこれ。
厨房のころBASICからC言語に進んだ時、
わざわざmainという特殊名を使ってでも、
すべてを関数でという理念に感動した。
その感動が関数型じゃねーの?って話。
BASICに戻ってどうするよ。
型推論?ってスクリプト用ですか?
MSが取り入れたから何かあると思ったんだが、
亡霊でも見てしまったような気分。
0187デフォルトの名無しさん
2010/09/20(月) 13:15:53素人が騒ぐな。お前が言ったところで説得力はない。
お前が素人であるという根拠は基本的なこと、
C言語は関数型でないことを知らないからだ。
0188デフォルトの名無しさん
2010/09/20(月) 13:24:15> 今、F#の説明見てたら、まるでBASICみたいなんだよ。
ん?どの辺がBASIC??
後の文を読んでもいまいちよくわからない。
> 型推論?ってスクリプト用ですか?
動的言語ではなく、静的でありながら型推論をするのだからCよりは賢いよね。
0189デフォルトの名無しさん
2010/09/20(月) 13:51:00>今、F#の説明見てたら、まるでBASICみたいなんだよ。
Wikipediaの解説あたりを見ているのかな?
そういった解説は、理解しやすいよう、ごく短いコードを例にしているから、
「まるでBASICみたい」と感じてしまうんだと思う。
もしもある程度の長さのF#コードを見たなら、また別の感想を持つと思うよ。
>BASICに戻ってどうするよ。
F#は関数型言語だから、(BASICと違って)C言語のような関数定義や関数呼び出しは
可能だよ。さらに、C言語ではソース(xxx.c)単位でしかコードをモジュール化できないけど、
F#には「抽象化データ」という(C言語よりも)高度なモジュール化の仕掛けが用意されている。
>型推論?ってスクリプト用ですか?
確かに、データ型宣言が不要だからスクリプト用途には便利だね。ただ、型推論という技術は、
スクリプト用途にも便利だけど、大規模なプログラム開発になればなるほど生きてくる。
たとえば、C言語を知っていれば標準ライブラリのsort関数は知っていると思う。
このsort関数は、引数として2つの要素の大小関係を返す(比較する)関数へのポインタを渡す。
そして、ソートする要素のデータ型は目的によってまちまちだから(整数であったり文字列だったり)、
引数渡しの際にはキャスト(型変換)が必須になる。C言語のキャストが不正アドレス参照エラー
(いわゆるヌルポ)を引き起こす原因になりがちだというのは、よく知られている事柄だと思う。
でも、F#であれば(強力な型推論機能があるから)型宣言が不要であるばかりか、
もしデータ型の不一致があれば、それをコンパイル時に検出してくれる。
これは、大規模プログラム開発であれば、とても大切なこと(助けになる仕組み)なんだ。
今見ているものとは別の解説書を読んでみる事を勧めるよ。
0190デフォルトの名無しさん
2010/09/20(月) 13:55:17大規模であれば設計が重要。
特に紙に図として描けて俯瞰的に見られる設計法がなくてはね。
現在大規模設計に適しているのはオブジェクト指向だけだよ。
関数型言語はまだ設計法が発達していない事が理由で大規模な開発にあまり適用されていないんだよ。
0191デフォルトの名無しさん
2010/09/20(月) 14:00:13その意見については全くその通り(大賛成)なんだけど、
彼(>>186)の問いかけという文脈に対しては不適切ではないかと
0192デフォルトの名無しさん
2010/09/20(月) 14:08:10> すべてを関数でという理念に感動した。
> その感動が関数型じゃねーの?って話。
その時点で完全に間違ってる。
C言語は関数型じゃない(そういうデマを広げてる本は何冊かあって、
ウェブ上では酷い状態だが)。
0193デフォルトの名無しさん
2010/09/20(月) 14:08:23C言語の関数は関数型言語の関数と意味が違うんだ。
どういうこと?
違う概念なら、同じ言葉にしてしまったのはミス?
>>188
変数に明示的宣言がなくて、行頭からプログラムが開始。
括弧が省略されて見た目もBASICの命令文ぽい。
静的型推論のメリットがわからない。
型があいまいでもコンパイルが通るなら想定外のデータに
どう対処するの?
動的なら便利だろうけれども。
そこにそんなメリットがあるなら、
静的型推論言語に改名した方がいいのでは?
0194デフォルトの名無しさん
2010/09/20(月) 14:18:46詳しくありがとう。
定義された関数がデフォで
C++のTemplateになってる感じだろうか。
0195デフォルトの名無しさん
2010/09/20(月) 15:02:56>C言語の関数は関数型言語の関数と意味が違うんだ。どういうこと?
関数(function)という用語は数学に由来するんだけど、数学の世界に副作用は存在しない。
副作用(side-effect)というのは、定義の途中で変数の値が変化(mutate)することを指している。
関数型言語では、この数学における意味を忠実に守っている。
でもC言語の関数は、その定義の中で代入操作で変数の値を変えることができるから、
(見た目は数学の関数と似ているけど)数学における関数とは意味が違ってくる。だから、
>違う概念なら、同じ言葉にしてしまったのはミス?
という指摘は正しい。C言語の場合は、手続き(procedure)と呼ぶべきだったんじゃないかと思う。
ただ、C言語が設計された大昔の時代は、一般的に(プログラム言語に対して)数学的な意味の
厳密性は求められなかったから、この問題についてC言語設計者を責めるのは酷ではないかと思う。
>型があいまいでもコンパイルが通るなら想定外のデータにどう対処するの?
もし型があいまいであれば(あるいは矛盾していれば)、コンパイルは通らない。(コンパイルエラーになる)
だから、想定外のデータ記述は、すべてコンパイル時に弾かれることになる。
(0割り算エラーやI/Oエラーのような実行時エラーは、コンパイル時には検査できないけどね)
それが「静的型検査(type checking)」言語の特徴。そして、静的型検査の為には
(一致/不一致を判定するために)型宣言が必須になるけど、それを(ある程度まで)省略できるように
するのが「型推論(type inference)」と呼ばれる機能。
>動的なら便利だろうけれども。
鋭い指摘だよ。すでに書いたように静的型検査はプログラムの安全性(バグを減らす)という意味では
便利な仕組みだけど、たとえばGUIやプラグイン機構のように、オブジェクトの動的な生成/消滅や
構成の動的変更が本質的に起こりえるプログラミングでは、ガチガチすぎて使いづらいという批判がある。
理想は「動的言語と型推論機能の融合」なんだけど、そこまでプログラム言語理論が進化していないのが現状。
0196デフォルトの名無しさん
2010/09/20(月) 15:07:53今は、そのTemplateという比喩による認識でOKと言っておくよ。
厳密には違うんだけど、それは関数型言語の理解が進めば、自然と分かってくるようになると思う。
0197デフォルトの名無しさん
2010/09/20(月) 16:10:25たぶんC言語で手続きを関数と呼んじゃったのはFORTRANのFUNCTION文に由来すると思う。
0198デフォルトの名無しさん
2010/09/20(月) 16:11:280199デフォルトの名無しさん
2010/09/20(月) 16:44:57BCPL -> B -> C
と続いていくが、Bの時点ですでに関数って呼ばれてたみたい。
BCPLは知らん。
0200デフォルトの名無しさん
2010/09/20(月) 17:27:34つまり、参照渡しが使えないということか?
確かにCで渡した変数が変化して帰ってくるのには、違和感あった。
Cの関数では入力と出力があいまい化してるといわれればそうなるか。
そうすると、ポインタ廃止論ともかぶってくるのかな。
しかし、関数(Function)という言葉の普及度を考えると、
関数型言語という名前で主張しちゃうのはどうかな。
数学的に純粋な関数は言い換えれば、写像だから、
「写像(Mapping)志向言語」とか分けてくれた方がありがたいねえ。
>>196
C++のTemplate関数と、const参照渡しのみ使用する。
までわかった。
しかし、代入がないってすごい変革だわ。
変数名をつど用意する行儀の良いプログラムになりそう。
いい意味で。
0201デフォルトの名無しさん
2010/09/20(月) 17:30:06> つまり、参照渡しが使えないということか?
> 確かにCで渡した変数が変化して帰ってくるのには、違和感あった。
C++ で、だよね?
0202デフォルトの名無しさん
2010/09/20(月) 17:42:49iの値を返すことに対して、値が1増えるのが副作用。
0203デフォルトの名無しさん
2010/09/20(月) 18:24:31>つまり、参照渡しが使えないということか?
その通り。あと、>>202が書いているC関数内の局所変数への副作用も禁止されるし、
もちろん大域変数も値を更新できない。
ただし、デフォは不変(imutable)だけど、可変(mutable)であることを明示的に宣言すれば、
限定的に変数が更新できたりする。これはF#のベースになったMLという言語から引き継いだ特徴。
(副作用の無い)純粋さは大切だけど、時には性能/効率も優先されるべきだよね、という思想。
この考え方は、(副作用を完全に禁止した)純粋関数型言語を推す一派から、不純だという批判を受けることも。
>関数型言語という名前で主張しちゃうのはどうかな。
関数型言語のルーツはLISPといって、FORTRANやCOBOLとほぼ同時代に誕生し、
その頃から関数型言語という名前で呼ばれてた。だから今さら....という感じ。
>「写像(Mapping)志向言語」とか分けてくれた方がありがたいねえ。
写像はいくつかある関数の特徴の一つであって、他にもxxxxとかyyyyyみたいな特徴が
あったりするから、限定されすぎな命名では?という人もいるんじゃないかな。
あと、関数型言語には、「関数に式を作用(apply)させる」という計算モデル的な視点から、
「作用型言語」という別名がある。ちなみに同じ視点で、手続き型言語は「命令型言語」と。
>しかし、代入がないってすごい変革だわ。
でしょ、でしょw、自分も最初に知った時、同じ事を感じた。
こりゃ面倒かもしれないけど、安心したプログラミングができるなって。
0204デフォルトの名無しさん
2010/09/20(月) 18:45:07おそらく>>200は「ポインタ渡し」を言ってるのじゃないかと。
呼び出し側は f(&x); で、呼ばれた関数側で int *px; と宣言するような形式ね。
純粋なC言語の世界だと、「ポインタ渡し」と「参照渡し」は同義語だったりする。
少なくとも自分の周囲では、「参照渡し」という表現で誤解が生じることはないよ。
だから、>>200が間違いとは感じなかった。
C++の世界では、オブジェクトを引数にする場合と明確に区別するために、「ポインタ渡し」と
「参照渡し(=オブジェクト渡し)」は、きちんと使い分けるのがルールだったかな?
0205デフォルトの名無しさん
2010/09/20(月) 18:58:24C++ にそういう概念があるように、参照渡しというものがきちんと別にある以上、
言語仕様上存在してないものの名前を使うのは感心しない。
0206デフォルトの名無しさん
2010/09/20(月) 19:43:00手間をかけさせてスマンが、Wikipediaの「引数」というページにある
「ポインタ渡し」とその周辺の記述を読んでみておくれ。
あと、>>186から始まった「F#に関するQ&A」という文脈の中で、登場する主要言語はF#/C/BASIC なんだ。
たまに C++ が登場するけど、その時には「C++の」というように明示的な句を付けていた。
デフォがC言語なんだから、「ポインタ渡しという俗名や参照渡しという誤った用法 (by Wikipedia)」も
「F#に関するQ&A」という文脈の中では些細な(=枝葉な)要素にすぎないと思うんだ。
それなのに、(お呼ばれされていない)C++をいきなり振りかざして、
・C++の言語仕様上はxxxなんだから、それに従わない表現は感心しない
と主張されても、ポカーンなんだけど。厳密な言語論を討議してる訳じゃないんでね。あー疲れる。
0207デフォルトの名無しさん
2010/09/20(月) 19:45:280208デフォルトの名無しさん
2010/09/20(月) 19:46:48> (これは言語側が勝手に行う。Cのように明示的にアドレス演算子を使うものは参照渡しとは呼ばない。)
とあるだろ。なんで間違った言葉を使うわけ?
0209デフォルトの名無しさん
2010/09/20(月) 19:52:46だから>>206で、それは些細な問題だろ(揚げ足取りじゃねえのか)、と言ってる訳だが。
というか、F#なり他の関数言語なりの話でツッコんで欲しいんだよな....。ふぅーー
0210デフォルトの名無しさん
2010/09/20(月) 20:11:24えーと、
・単なる質問小僧ではない、自分なりの考え方を持った初心者からの疑問であれば、
それに対して丁寧に誘導してあげることこそ、関数型言語の地道な普及活動につながる
というのは、強引かなw
正直な話、最近Haskellスレでreverse関数に関する議論が続いていて、それをずっとROMしてたんだけど、
問題を提示した(初心者と思われる)reverse君に対するスレ住人の雰囲気が「郷に入れば郷に従うのが当然!」、
あるいは「Haskellの言語仕様はこうなんだから、それ以外の発想は一切認めない!」に見えたんだ。
あと、相手の知識に合わせて返答するという(初心者に対する)配慮も感じられなかった。
で、これじゃスレを覗いている他の初心者(未来のHaskeller候補生)達も、うっかり質問できる空気じゃねえし、
これじゃHaskellが一般の(=普通の)プログラマに普及するのは難しいんだろな、と。
だから、Haskellについては自分も初心者だからその議論に口出しはできなかったけど、
せめて自分ができる範囲で、やれることをやりたかった。それが、このスレの丁寧すぎるかもしれない
一連の返答につながっている。
0212デフォルトの名無しさん
2010/09/20(月) 20:16:25すごいな。
0213デフォルトの名無しさん
2010/09/20(月) 20:33:28Haskellスレのは俺も見ていたけど、
あれはHaskell言語批判が目的のようだったから反撃されただけのような。
0214デフォルトの名無しさん
2010/09/20(月) 20:50:19>写像はいくつかある関数の特徴の一つ
数学だと関数のほうが写像の一種だな。
数値をとって数値を返すもののみに限定される。
0215デフォルトの名無しさん
2010/09/20(月) 21:39:27Haskell言語批判、大いに結構じゃないのかな。技術的視点による批判であれば。
少なくともあのreverse君のカキコは、荒らしとか粘着ではなくて、彼なりの考え方を持った意見だったと思う。
態度が横柄だとか、口調が上品ではないってのは2chなんだから、よくある話で、
意見に批判的な内容が含まれるからといって感情的な反撃をするのはいかがなものかと。
自分に限定すると、文章の表面的な口調はまるで気にならないね。
発言者に自分なりの考え方という知性を感じる事ができれば、それで十分だ。逆に、
・単なる質問小僧
・感情的な短レスしか返すことのできない人
・文脈の本筋から外れた箇所について執拗に付きまとう人
であれば、スルーするか、あるいはこちらも厳しい口調で反撃する。でもreverse君は、そうじゃなかった。
あの場合、reverse君の主張の中で、正しいという部分については、まずそれを認める(肯定する)こと、
たとえば「確かに効率も大事だね」とか「双方向リストによる実装という選択肢もありかもしれないね」などと。
その上で、「でもHaskellの設計思想はxxxxだから、yyyyのようになっているんだよ」と反論すれば、
彼のHaskellに対する印象も変わったものになったのではないかと。
一般社会生活の中であれば、誰でも自然と実践できているはずのことなのに....と思う。
そして、もしHaskell熟練者達が初心に返って「reverse君の考えではなく、このような設計思想になったのは
ナゼなのか」を自問自答できるようになっていれば、reverse関数話も単なるQ&Aにとどまらず、深い意味のある
議論へと変化していったのでは?と想像してしまう。
0216デフォルトの名無しさん
2010/09/20(月) 21:54:47齧っていないと直感的に想像するのは難しいのかもしれないね
そういえば、著名なlisp本でも生成コストと(単方向)リストの関係を扱ってるものはそうそう無いなあ
0217デフォルトの名無しさん
2010/09/20(月) 21:57:11別にLispを知らなくてもCとアルゴリズムとデータ構造を勉強した人なら想像出来るだろ。
0218デフォルトの名無しさん
2010/09/20(月) 22:06:15そりゃそうだけど、(:)とcons , headとcar, tailとcdrその他もろもろの関係性から、「直感的」にいうことでね
0219デフォルトの名無しさん
2010/09/20(月) 23:10:25> これじゃHaskellが一般の(=普通の)プログラマに普及するのは難しいんだろな、と。
普及しない理由の一つとしては妥当だが、それは関数型言語だからなのか?
このスレではどの言語でも繰り返し行われてるやりとりに見えたが。
0220デフォルトの名無しさん
2010/09/21(火) 00:16:00> 写像はいくつかある関数の特徴の一つであって、
> 他にもxxxxとかyyyyyみたいな特徴が
> あったりするから、限定されすぎな命名では?という人もいるんじゃないかな。
えー、なにその特徴?
関数だけの特徴というと、解析学とかイメージしてしまうが、
プログラムの関数で微積分してもしょーもないから違うかw
数学の話だと、関数と写像に違いはないよね。
あえて言うなら、逆に写像のほうが集合論という概念を含んだ
より大きな概念で、関数の方が写像の一種と言えなくもないよーな。
まさか超関数・・・いや何でもない。
とにかく写像は数学ではより新しくて大きな概念だから、
「写像指向言語」という言葉で、ぜんぜん問題ないと思うな。
0221デフォルトの名無しさん
2010/09/21(火) 00:57:53何せ違いが分からないのだからw
0222デフォルトの名無しさん
2010/09/21(火) 01:25:43>便利な仕組みだけど、たとえばGUIやプラグイン機構のように、オブジェクトの動的な生成/消滅や
>構成の動的変更が本質的に起こりえるプログラミングでは、ガチガチすぎて使いづらいという批判がある。
>理想は「動的言語と型推論機能の融合」なんだけど、そこまでプログラム言語理論が進化していないのが現状。
GUIにはFunctional Reactive Programmingが10年前からあるし、
プラグイン機構が何を指してるか正確には分からないけど、
型クラスやGADTで表現できない程高度なものじゃないでしょ。
「普及してない」なら分かるけど、「プログラム言語理論が進化していない」っていうのは言いすぎじゃないかしら。
0223デフォルトの名無しさん
2010/09/21(火) 22:28:39haskellスレには博士以外書き込めないから。
//お前ら試してみろよ、書き込めないから
下流pgは帰れと罵倒されるから
0224デフォルトの名無しさん
2010/09/21(火) 22:38:59自分で研究して設計法とかノウハウとか編み出せない下流プログラマが
いきなり触ったら「関数型言語使えねー」ってことになるのは目に見えているので、
ある程度知識のある人以外は触るなってことでしょ。
俺らが使えるようにしてやるからおとなしく待ってろって事がわからないの?
オブジェクト指向だっていろいろ整備されるのに時間がかかって、その間は
オブジェクト指向なんて重いだけのカスと言われ続けてきた歴史があるわけだし。
0225デフォルトの名無しさん
2010/09/21(火) 22:57:50モナドやアローや遅延評価などの根っこの部分を理解できるとは思えないし、
表層的に理解できたとしてもサンプルに毛を生やした程度の拙いコードしか書けずに
関数型言語クソとか言って放り出すに決まってる。
そんな程度の低い連中にもわかるように噛み砕いてわかるようにノウハウを積んでいくのが
知的水準の高い博士以上の人間なんだよ。
0226デフォルトの名無しさん
2010/09/21(火) 23:18:26それがHaskeller達の本音(マジレス)だとしたら、彼らは現時点でのHaskellの普及を望んでいない、
ということになるね。漏れ達が噛み砕き終えるまで庶民プログラマを待ってろ、みたいな。
だとしたら、このスレの存在意義である「何故」が無意味になるんだけど。
他人に知性の放棄を強要する態度は、「知的水準の高い博士以上の人間」にはふさわしくないと考えるよ。
0227デフォルトの名無しさん
2010/09/21(火) 23:24:56簡単高機能な便利なライブラリです。
0228デフォルトの名無しさん
2010/09/21(火) 23:27:08「全力で成功を回避する」というのがHaskellの非公式スローガンだからねw
Haskell自体は普及しなくて良い。
研究場であるHaskellで培った成果を他の言語でより良い物に育て上げれば良い。
0229デフォルトの名無しさん
2010/09/21(火) 23:33:32と考えてるような奴等は見捨てるしかないと思うよ。
0230デフォルトの名無しさん
2010/09/21(火) 23:35:120231デフォルトの名無しさん
2010/09/21(火) 23:41:54ああ、そんなスローガンがあるのだとしたら納得だw
だとしたら、これほどまで世間の注目を浴びてしまった現実にとまどってるのかも。
Haskellに関しては、他のプログラミング言語と同列に比較すべきじゃないのかも、
って最近考え始めている。教育とか、方式設計工程での検証を目的とした
使い捨てプロトタイピングとか、アルゴリズムの研究といった限定された領域で
(一般プログラマには普及せず)細々と生き残っているみたいな。
現在のPrologと似た位置付けかな。
で、個人的に関数型言語普及の本命は、ML系の言語ではないかと思っているw
Windows環境なら、先日このスレで話題になったF#が、そうなのかもしれない。
0232デフォルトの名無しさん
2010/09/22(水) 00:21:350233デフォルトの名無しさん
2010/09/22(水) 00:49:48散々上でも言われている通り、MLなんて研究用の言語で成果を既存言語にフィードバックできればそれでいいような。
F#だって元々はそんな位置づけだったはず。
0234デフォルトの名無しさん
2010/09/22(水) 00:54:46F#が研究用ならVSに入るわけがないしdotNET対応も意味が無いでしょ
0235デフォルトの名無しさん
2010/09/22(水) 01:12:40それでいいんじゃないかと。自分はF#は使ってないから一般論になってしまうけど、
理屈先行型の頭でっかちもダメだし、結果的に動くプログラミングしかできないのもダメ。
関数型言語の勉強という理屈とプログラミングという実践を繰り返し続けること、
言い換えると「抽象化(理屈) <-> 具体化(実践)」の反復プロセスが大切だと思う。
その全体像は螺旋階段(スパイラル構造)のようであり、成長度の傾きはごく緩やかで、
暗闇の中で階段を一歩一歩上ることは焦りや不安が常につきまとうものだけど、
ある時、ふと下界を眺めてみると、過去の自分が別人のように見えることに気付く。
自分の経験になるけど、新しいパラダイムの勉強と成長とは、そんなものだと思う。
0236デフォルトの名無しさん
2010/09/22(水) 01:23:16Haskellはプログラミング言語研究を目的に開発された言語かもしれないけど、MLはそうじゃないよ。
LCFという定理証明器というアプリケーションの開発という、実用性を目的に設計された言語。
また、ML系の言語 mini-Caml は、教育目的であるけれど、レンダリングのような領域を限定すれば、
実用的な(C言語に匹敵する)性能を叩き出すコンパイラがコンパクトに記述できることを証明してみせた。
更に、これまたML系の言語 SML# プロジェクトは、実用的な処理系開発を目標の一つにあげている。
0237デフォルトの名無しさん
2010/09/22(水) 02:52:19流行らないのは、関数型の適した問題が
手続き型のそれと比べて少ないからじゃなかろうか。
特に、データベースやネットワークも含めて
IOが絡むと手間なことが多いし、
GUIの記述も適しているとは言えないと思う。
0238デフォルトの名無しさん
2010/09/22(水) 08:09:14HaskellとMLの差はどこから来るの?
Pureにこだわるか否か以外にもある?
0239デフォルトの名無しさん
2010/09/22(水) 08:29:52関数型言語でも何かすごいプログラムが出てこないと普及しないんじゃないの?
0240デフォルトの名無しさん
2010/09/22(水) 09:38:22関数型言語にもキラーアプリケーションが登場すれば状況は一変するかも
RubyはRailsがあったから人口が爆発的に増加したし、
(アプリじゃないけど)UNIXがあったからCはPascalを圧倒することができた
0241デフォルトの名無しさん
2010/09/22(水) 10:00:400242デフォルトの名無しさん
2010/09/22(水) 11:20:06Haskellとかの副作用がない関数型はどやってるの?
0243デフォルトの名無しさん
2010/09/22(水) 11:21:220244デフォルトの名無しさん
2010/09/22(水) 11:28:110245デフォルトの名無しさん
2010/09/22(水) 12:06:32Prologは遅いからという納得できる理由がある。
Haskellはそんなことはないし、いまひとつわからない。
0246デフォルトの名無しさん
2010/09/22(水) 12:15:00純粋/非純粋、遅延評価/非遅延評価、そして静的型検査/動的型検査という3つの視点で評価しています。
Haskellは「純粋かつ遅延評価かつ静的型検査」な言語で、ML系は「非純粋かつ非遅延評価かつ静的型検査」ですね、
3つの視点は組み合わせ(直積)ですから、「非純粋かつ遅延評価かつ静的型検査」な言語もありえるでしょう。
ただし、数学の世界は「純粋かつ遅延評価(正確には評価順序が無いと言うほうが適切か?)かつ静的」ですから、
「純粋かつ遅延評価かつ静的型検査」な言語であるHaskellは他の言語と区別する、言い換えると
「Haskellとその他の関数型言語」という分類で単純化してかまわないと思います。
0247デフォルトの名無しさん
2010/09/22(水) 12:40:07>流行らないのは、関数型の適した問題が
この文中の関数型というのは、(>>246で書いた「純粋かつ遅延評価」な)Haskellだけに当てはまり、
それに続く問題はHaskell特有の問題だと思う。データベースやネットワークはIOモナド、
GUIの状態遷移はステートモナド等、副作用が発生する箇所はすべてモナド・モナド・モナド・......。
何かと言えばモナドが必要で、モナドだらけになったコードは読みづらい。
それに対して、Haskell以外の言語であれば、IO関数はコードの流れに沿った評価順序が保証されているし、
状態遷移も状態変数を可変(mutable)属性で宣言すれば状態値の更新操作で実現できる。
さらにOCamlのようなオブジェクト指向を導入した言語であれば、一般(=手続き型)のOOPLと
同様なGUIプログラミングスタイルによる記述が可能です。
まとめると、「純粋かつ遅延評価」ではない関数型言語であれば、適した問題の領域が手続き型と重なる、
言い換えると、今まで手続き型言語で実現していた問題解決を関数型言語で置き換えられる可能性がある、
と考えています。
0248デフォルトの名無しさん
2010/09/22(水) 12:53:22> 何かと言えばモナドが必要で、モナドだらけになったコードは読みづらい。
モナドの扱いにつきまとう面倒やややこしい所を
プログラマに極力意識させないライブラリは作れると思う。
たとえば GUI だったら Fudgets とか結構優れているのではないか。
0249デフォルトの名無しさん
2010/09/22(水) 12:53:41このカキコをそのままHaskellスレへコピペしてみるというのはいかが?
そのほうが詳しい説明をもらえる可能性が高いと思うし、
個人的には、あのスレの住人達がどういう反応(対応)するのか興味があったりするw (<-- いじわるダナァー)
0250デフォルトの名無しさん
2010/09/22(水) 12:57:59さんざん語りつくされた話題だから一瞬で答えが出るよ
0251デフォルトの名無しさん
2010/09/22(水) 13:01:360252デフォルトの名無しさん
2010/09/22(水) 19:13:06まず、言語の実行効率については、(>>246でレスしていますが)「現実世界における実用性評価の視点」として
考慮していません。(評価の優先度が他の視点より低いという意味。) もしプログラマの負担よりも実行効率が
優先されるとしたら「アセンブリ言語最高!」となりますから。
また、Haskellの実行効率ですが、スクリプト言語であるRuby/Pythonよりは速いものの、(純粋性と遅延評価が
ネックとなって)ML系言語にはとうていかなわない、という認識でいます。自分の知る範囲で、過去のある時点における
最速Haskell処理系と最速ML処理系のベンチマーク比較で、一度としてHaskellが速かったことは無い、という意味です。
特に、アッカーマン関数や最小公倍数計算といった単純なベンチであれば同等かあるいは僅差でHaskellが速いことは
ありえますが、ソート/レンダリングといった実用性があり大量のデータを処理させるベンチであれば、
HaskellはMLに圧倒されているはずです。もし「そんなことはない」と反論されるなら、ソースを提供してください。
さらに、Prologは遅いとのことですが、今時の多くの人はインタプリタでPrologを実行させるくらいで学習を止めてしまい、
その印象から遅いというイメージを持ちがちです。実際には、適切なカット、モード宣言の厳守、そして商用最適化コンパイラ
といった実用目的の環境を整える事ができたなら、(初歩的なインタプリタ実行に対して)驚く程の性能を叩き出せます。
もちろん(C言語で解けるレベルの問題について)CコンパイラとPrologコンパイラを比較すればC言語が圧倒するし、さらに
自分はPrologとHaskellのベンチを測定した事も見た記憶もないので、Prologについては主観的な比較にすぎない訳ですけど。
0253デフォルトの名無しさん
2010/09/22(水) 20:21:53Haskellについては詳しくないのですが、その Fudgets というライブラリを使えば、手続き型言語のGUIプログラミング技法、
具体的には、GUI部品(ウィジェット)を組み立て、イベント待ちループに入り、コールバックでアクションを実行という、
いわゆる「イベント駆動プログラミング」によって、HaskellでもGUI開発が可能になるという意味でよろしいでしょうか?
あと気になったのは「作れる」とありますが、これは未来を指している、言い換えると、現時点ではまだ存在していない、と
いうことを意味しているのでしょうか? もしそうなら、評価の対象から除外しなくてはなりません。
未来を前提に加えてもかまわないとしたら、未来は誰にも予測できないのですから、あらゆる言語で未来には可能になるはず、
という論法を許すことになってしまいますから。
同様に、性能(実行効率)についても「次期GHCが登場したあかつきには、MLなど圧倒してくれるはずだ」とか、
「メニーコア時代になれば、評価順序の決まっていないHaskellのほうが最適化に適しているから逆転するはずだ」といった
未来を前提にした主張があったとしても、(自分は)その主張を詭弁として却下します。
0254デフォルトの名無しさん
2010/09/22(水) 20:27:40> 評価順序の決まっていないHaskell
それは非正格のことを言っているのかチャーチロッサーの定理のことを言っているのかどっち?
0255デフォルトの名無しさん
2010/09/22(水) 20:29:17> Haskellの実行効率ですが、スクリプト言語であるRuby/Pythonよりは速いものの
であれば、Ruby や Python で作られている実用アプリは、
処理速度的には Haskell でも余裕でこなせるということになる。
処理速度的には普及していてもおかしくないレベルだと思う。
また、Ruby や Python で作られている実用アプリを
Haskell で作るためのライブラリは十分に揃っているし、
必要なら作ればいい。
にもかかわらず全く普及が進まないのは、
そういうアプリの作り方を教える人間がいないからだと思う。
0256デフォルトの名無しさん
2010/09/22(水) 20:38:45人を試す良い質問だw
0257デフォルトの名無しさん
2010/09/22(水) 20:46:11「現時点」で一般的な GUI アプリが作れます。
ベント待ちループの仕組みはライブラリの裏に隠されています。
プログラマはウィジェットと自作のイベントハンドラを
ケーブルで接続するようにプログラムしていくことで、GUI を組み立てていきます。
ただ例に挙げた Fudgets はかなり古いライブラリです。
主な機能は 1996 年で開発完了、あとはメンテ状態。
しかし、設計思想は優れてます。
関数型言語らしく(宣言的にという意味) GUI アプリを作れます。
今なら FRP を利用した GUI ライブラリが盛んに研究されていますが、
私が試したことがある範囲ではどのライブラリもまだバージョン 1.0 未満ですので、
こちらは残念ながら「未来」の話ですね。
ただ、試した範囲では、どれも >>247 で懸念されているような
「モナドがウザイ」なんて状況は皆無でした。
むしろモナドって何だっけというくらいモナドは表に出てきません。
0258デフォルトの名無しさん
2010/09/22(水) 21:04:40この文脈は、(ラムダ計算の計算可能性ではなく、)ラムダ計算のコンピュータ上での実現方法について
説明しているのですから、チャーチロッサーの定理です。
(理論面は不勉強なので間違ってるかもしれませんが....)
0259デフォルトの名無しさん
2010/09/22(水) 21:31:10特にwindows環境では簡単に利用できるものはない。
まあこの点はMLも同様だけど(ちょっとましか)
0260デフォルトの名無しさん
2010/09/22(水) 21:36:41>処理速度的には普及していてもおかしくないレベルだと思う。
いいえ、その考え方は間違っていると思います。>>252で「プログラマの負担よりも実行効率が優先されるとしたら....」と
書いているように、いくら処理速度的にHaskellがスクリプト言語より優れているとしても、生産性が比較になりませんから、
Haskellがスクリプト言語を置き換えるような事態は、決して起こりえないでしょう。もしも>>255の考え方が
正しいとしたら、「VC++(Visual C++)はVB(Visial Basic)よりも圧倒的に速いのだから、VBは不要だ。
すべてのVBプログラムをVC++で置き換えるべきだ。」という主張が正しいということになります。(実は正しかったりして....)
物事の一面(一つの視点)だけで考えて、大局的な結論を誤るという典型例であると言えるでしょう。
自分は静的関数型言語が勝負すべき相手は、RubyやPythonのような簡易言語などではなく、
C/C++/C#/FORTRAN/COBOLといった、コンパイラベースの本格的な言語であり、真っ向勝負できると考えています。
低レベルな相手との勝負に勝って、満足(思考停止)したくはありません。
0261デフォルトの名無しさん
2010/09/22(水) 21:45:14> 特にwindows環境では簡単に利用できるものはない
英文のインストールマニュアル通りインストールすれば、
拍子抜けするほどあっさりとインストールできるし、
これまた英文のチュートリアルを実践すれば、
簡単に利用できるようになるよ。
たとえば Gtk2Hs なら 0.11.0 以降のインストールは
install instructions に従うだけでいいし、
最初は Tutorials や Examples を改造していればいい。
なのに、「windows環境では簡単に利用できるものはない」
という印象を与えてしまうのは、>>255 でもちょっと言ったが、
日本語で教えてくれる人がいないからだよ。
まして日本語で丁寧にチュートリアルを示してくれる人なんていない。
偉そうに言う私も、人にわかりやすく教えられるほど Haskell を修めていないし。
0262デフォルトの名無しさん
2010/09/22(水) 21:54:33「処理速度的には」と2度断ったはずだが
普及するためには様々な要素が必要だけど、
少なくともその中の処理速度という要素に関しては、
Ruby などで作るアプリもこなせるレベルだろと言っている。
(調べればわかるが、Ruby や Python でもそうとう実用的なアプリが作られている)
でも普及しないのは、他の要素が書けているからではないかと推論できる。
当たり前だが繰り返すと、普及するために必要な要素は処理速度だけではないからだ。
その他の書けている要素の一つとして私が「大きい」と思っているのが、
「教える人の存在」だと言っている。
って、ほとんど >>255 の繰り返しだが
0263デフォルトの名無しさん
2010/09/22(水) 22:04:42> 英文のインストールマニュアル通りインストールすれば、
> 拍子抜けするほどあっさりとインストールできるし、
これはこれで誤解を生みそうだな。
MinGW環境を整えて、gtk2を入れて…と、言うほど楽ではない。
cygwin環境が存在していたら干渉を避ける必要があるし、gtk2も適切なものを探す必要がある.
0264デフォルトの名無しさん
2010/09/22(水) 22:37:21使えるまでのステップ数は確かに少なくはなく、面倒かも知れん。
しかし、言われた通りの手順を踏むだけで問題なくインストールできる環境は、
haskell 入門者、中級者ほど多いと思う(単に私の周りだけかもしれんが)。
たとえば、Windows XP 以降の環境で GHC をインストールし、
今まで Haskell の入門書で勉強していた人が、
次のステップとして GUI に挑戦してみたいというよくある状況なら、
install instructions に従ってそれぞれ最新のものをインストールしていけばいい。
こういう状況なら、そもそもcygwin環境の干渉とか適切なバージョンとか、
気にする必要もない。
CUI で入門して次に GUI に挑戦なんて良くあるパターンだろ。
でも、たいていの人は、挑戦してみたけど面倒そうに「見えて」諦めるんだ。
教えてくれる日本人が見当たらないから。
GUI 開発環境の構築方法を説明した入門書も何故か無いしね。
0265デフォルトの名無しさん
2010/09/23(木) 00:17:04普及っていう意味では確かにキラーアプリは必須だな。
俺はRubyistだけど、Ruby周辺ではHaskellみんな勉強してる (Haskellの本出したRubyistもいる)
でも、誰もRubyを捨ててHaskellにいかないのは何故だろう?そこら辺に鍵があると思う。
もし本当に使いやすい言語なら、キラーまでいかなくても、もっとアプリ出てくると思うんだよ。
あーわかんねー。素晴らしい言語って感じはするんだけどなーっ。
0266デフォルトの名無しさん
2010/09/23(木) 00:25:31見るからに文系は使いたがらないでしょ。
「オブジェクト指向」みたいに犬猫の例でバカでも読めそうな本を
沢山出すとか、Javaみたいなモダンなイメージで変なキャラが
ブラウザ中飛び回るような戦略使わないと。
Javaはコーヒーだからビール発泡酒辺りを使って大人っぽさを
印象付けたらどうかな。
0267デフォルトの名無しさん
2010/09/23(木) 00:26:520268デフォルトの名無しさん
2010/09/23(木) 00:27:16酔っ払いの生徒と酔っ払いの講師で説明していくの。
読者も酒飲みながら読める。
なんだか楽しそうじゃない?
0269デフォルトの名無しさん
2010/09/23(木) 00:27:49単純に、そこまでして関数型を使いたいかという話で、
そうではない人が多いだけのような気がする。
関数型言語のメリットは便利だと思うけど、今必要なのはそれじゃないというか。
やってみれば問題なくインストールできるものを、試してみる人が少ないのは、
そもそも存在を知らないか、魅力が無いか、そういうことなんだろうと思う。
入門者なら特に、熱心な関数型言語のファンでもないしな。
0270デフォルトの名無しさん
2010/09/23(木) 00:29:25底辺プログラマが大量辞職して一部の優秀なプログラマだけが残った世界を作りたくないのか?
0271デフォルトの名無しさん
2010/09/23(木) 00:29:35>>269は>>264へのレス
0272デフォルトの名無しさん
2010/09/23(木) 00:33:11誰でも使えるとかそういうのは素人に毛を生やしたような奴らを集めた人海戦術では
良い選択だが、それではいい製品は作れないよ。
やっぱり優秀な少数精鋭でやらなきゃね。
NTTデータとかのSIerのやり方じゃ日本のIT産業は衰退するだけ。
アホの指揮のもとアホと天才を一緒くたに扱ってゴミみたいなソフトを作ってる現状をなんとかしなきゃいけないだろ。
言語面からもそういうクソ体制に圧力をかけなきゃいかん。
0273デフォルトの名無しさん
2010/09/23(木) 01:34:44> 魅力が無いか
魅力を魅力的に語れる人間が欲しいな。
魅力的とまでは行かなくても、
関数型でこんなことできるぜと、
ある程度長期に語り聞かせられる人間。
ちょっと違うかも知れんが、たとえば
「猫でもわかる」 の関数型版とか。
あれで Win32API を学んだ日本人は多いと思う。
学んだ人間がまた別の人間に紹介する。
Haskell とかでもああいうのがあると、
プログラマが増えそうな気がする。
0274デフォルトの名無しさん
2010/09/23(木) 01:36:26増えなくていいw
0275デフォルトの名無しさん
2010/09/23(木) 02:11:35細かい定義は置いておいて、一般的なプログラムで、
「手続き型言語と比べて、これだけシンプルに書けます」的な資料があると、
あぁ、いいなぁと感じるかもね。
これとか http://ja.doukaku.org/18/nested/ 見てても、
プログラムが小さすぎて、結局ライブラリ次第としか見れないんだよなぁ。
0276デフォルトの名無しさん
2010/09/23(木) 06:44:52Perl6は知ってる
他は?
0277デフォルトの名無しさん
2010/09/23(木) 10:42:22成果ってのは?
0278デフォルトの名無しさん
2010/09/23(木) 10:51:44つ Monadic IO
つ Arrows
つ monadius
つ YAWS
etc..
0279デフォルトの名無しさん
2010/09/23(木) 11:27:520280デフォルトの名無しさん
2010/09/23(木) 11:30:560281デフォルトの名無しさん
2010/09/23(木) 11:31:380282デフォルトの名無しさん
2010/09/23(木) 11:38:48メジャーとは、この業界に1年もいれば嫌でも目や耳に入るもの。
下手すれば新卒でも知ってて面接のネタにするようなもの。
判りましたかー?
0283デフォルトの名無しさん
2010/09/23(木) 11:44:37Monadic IOはもう誰の耳にも入ってるな
0284デフォルトの名無しさん
2010/09/23(木) 11:52:080285デフォルトの名無しさん
2010/09/23(木) 11:59:220286デフォルトの名無しさん
2010/09/23(木) 12:04:560287デフォルトの名無しさん
2010/09/23(木) 12:07:07そういうお子ちゃまは一生BASICでもやってなさい
0288デフォルトの名無しさん
2010/09/23(木) 12:09:300289デフォルトの名無しさん
2010/09/23(木) 12:12:150290デフォルトの名無しさん
2010/09/23(木) 12:14:09それが後々ジャブのように効いてくるんだよ・・・
0291デフォルトの名無しさん
2010/09/23(木) 12:16:10ついでに「成果」も定義しとけよ
単にプログラム言語として Haskell を用いて作られたアプリケーションを指しているのか、
Haskell の思想や実装方法、文法などを参考にして生まれたパラダイムや
他言語の新機能まで含めるのか
それとも、もっと別の意味なのか
0292デフォルトの名無しさん
2010/09/23(木) 12:17:56読みたい、どこかにアップしてください
0293デフォルトの名無しさん
2010/09/23(木) 12:18:45あまりに恥ずかしい論文なのでアップすると死にます
0294デフォルトの名無しさん
2010/09/23(木) 12:19:050295デフォルトの名無しさん
2010/09/23(木) 12:30:38そもそもプログラム自体が仕様レベルでそのまま書けるから、
下手な抽象化をするよりそのまま書いたほうがキレイにまとまる。
0296デフォルトの名無しさん
2010/09/23(木) 12:38:510297デフォルトの名無しさん
2010/09/23(木) 12:48:02じゃあ聞くけど
仕様記述言語は何故普及しないのか
0298デフォルトの名無しさん
2010/09/23(木) 12:51:57下流プログラマに理解出来ないからじゃないかな
0299デフォルトの名無しさん
2010/09/23(木) 12:52:430300デフォルトの名無しさん
2010/09/23(木) 13:16:49全体からすれば関数型言語研究の成果の結実なんだけど、
Haskell固有の成果は何か?と問われると、やっぱりモナドしか残らない。
0301デフォルトの名無しさん
2010/09/23(木) 13:20:56「何を記述するか」ではなく「何を記述しないか」ばかり考えている
だから何も生み出せない
隠したり消したり切り捨てたりすることしか考えてない
0302デフォルトの名無しさん
2010/09/23(木) 13:55:11抽象化がなければ現代社会の何物も存在しなかったであろうに...
0303デフォルトの名無しさん
2010/09/23(木) 14:01:53お前ってその調子で普段から重要な単語を聞き漏らしたりして怒られてるだろ?w
0304デフォルトの名無しさん
2010/09/23(木) 14:21:00そろそろ外の現実世界に踏み出そうよ、ってことじゃないかと
GUIライブラリの例であれば、新しい方式を考案してはメンテせず消え去ることを繰り返すのではなく、
安定したリリースの継続を真剣に考えなければ、現実世界では相手にされないよ、と。
0305デフォルトの名無しさん
2010/09/23(木) 14:26:03ちゃんと研究分野では一定の需要があるよ。
今までいろんなライブラリが出ては消えたが、あれは研究目的で作られたもので
実際のビジネスを主眼に入れた開発ではないんだよ。
研究目的なら過去のものを捨て去るのは日常茶飯事。
0306デフォルトの名無しさん
2010/09/23(木) 14:28:12大抵論文がくっついてくるから。
0307デフォルトの名無しさん
2010/09/23(木) 14:28:53darcs
0308デフォルトの名無しさん
2010/09/23(木) 14:36:30みんなで有効な活用法を模索しましょうよって言う段階だと思うよ。
だから現状で何か成果が出ていなくても問題なし。
別にどうぞ使ってくださいお願いしますと頼んでいるわけじゃないから、
成果が出ていなくても文句を言われる筋合いはないし。
現状は成果を出す段階ではなくて、オブジェクト指向でいうUMLとかデザインパターンのように
ある程度まとまったノウハウを積んでいく事が重要だと思う。
0309デフォルトの名無しさん
2010/09/23(木) 14:38:23たいていロクなことにはならないからな。
0310デフォルトの名無しさん
2010/09/23(木) 14:42:42Javaは便利になったと思うけどなぁw
Javaが糞だという奴の主張をブログとかでよく見かけるけど、
そういう奴の主張っていまいちはっきりと納得できないんだよな。
0311デフォルトの名無しさん
2010/09/23(木) 14:54:56Javaはappletで大コケして誰もが消え去るを思っていたのが、EJBの登場によってサーバ向けに奇跡の復活。
JavaScriptは誰もが使えないオモチャ言語だと思っていたのが、AJAXの登場で復活。
Rubyは日本発のマイナー言語だったのに、Railsの登場によって全世界規模でメジャーな存在に。
お客様うんぬんかんぬんじゃなくて、現実世界を見る事は普及を考える上では大切
「もっと現実を見ようよ」by ドラエモン AA略
0312デフォルトの名無しさん
2010/09/23(木) 14:59:47今のアプレットはかなり高速起動してFlashと比べても違和感ないぞ。
0313デフォルトの名無しさん
2010/09/23(木) 15:01:530314デフォルトの名無しさん
2010/09/23(木) 15:06:14少なくともHaskellの現実世界は研究用途だな。
Monadなどの試験的な機能を意欲的に実装していることからもわかるだろ。
普及させるのが目的ならF#みたいになる。
0315デフォルトの名無しさん
2010/09/23(木) 15:13:06自分でプロジェクト始めたらどうなの?
対価を払っているわけでもないのに人にあれしろこれしろというのはマナー悪いよ。
0316デフォルトの名無しさん
2010/09/23(木) 15:18:21何故普及しないのかを考えるだけのスレで
普及しろ普及しろというのはスレ違いだ
0317デフォルトの名無しさん
2010/09/23(木) 15:41:57他人にあれこれしろとか、普及しろなんてカキコは(ほとんんど)見当たらないんだけどな。
何故普及しないのかとか、その原因(背景)を探ろうとするカキコはあるけど、それは批判じゃないし。
自分達が普段からそういう発想で考えているから、きっと他人もそうに違いないと思っているのではないかと
0318デフォルトの名無しさん
2010/09/23(木) 15:46:130319デフォルトの名無しさん
2010/09/23(木) 15:58:07そういう発想しかできない人を気の毒にと哀れむことはあるけど
0320デフォルトの名無しさん
2010/09/23(木) 16:21:06具体的に誰かが言ったわけじゃないが
抽象化すると見えない世論が見えてくるんだ
0321デフォルトの名無しさん
2010/09/23(木) 16:22:54とりあえず、普及しろと言っているようにあなたが感じたレスを挙げてくれ
その中に俺のレスがあったら、そうではないと誤解を解いておきたい
0322デフォルトの名無しさん
2010/09/23(木) 16:55:050323デフォルトの名無しさん
2010/09/23(木) 17:28:170324デフォルトの名無しさん
2010/09/23(木) 18:07:11関数型向きな用途って無いの?
手続き型が組みやすいところは手続き型で
関数型で組みやすいなら関数型で
そんな風に協力し合うような流れは無いのかな
0325デフォルトの名無しさん
2010/09/23(木) 18:38:22一部のアルゴリズム系。
だがアルゴリズムだけでソフトは作れない。
インターフェースが必要。
だから関数型言語の考え方・仕様を取り入れた
オブジェクト指向言語というのが増えている
関数型専用言語は、所詮実用言語のための研究用言語。
0326デフォルトの名無しさん
2010/09/23(木) 20:06:550327デフォルトの名無しさん
2010/09/23(木) 20:10:02Fudgets ですが、たしかに興味深い存在ですね。
自分なりに、以下のように整理してみました。
・状態付きプロセスのストリーム計算定義によりGUIを記述
・各プロセスを3種類のコンビネータ(直列合成/並列合成/フィードバック)で相互に接続
・ストリーム上でfudgets自身を送受信する高階fudgetsによって、GUIの動的構成変更が可能
ストリームによるプログラミングは、並列論理型言語のGHC(Guarded Horn Clause)でも
重要な要素であり、以前にストリーミングによるウィンドウシステムの記述などにも
興味を持っていた事があったので、関数型言語でも同様な考え方を発見できて嬉しくなりました。
ストリーミングは、そこを具体的なデータやイベントが流れるという姿をイメージしやすいので、
関数間の依存関係を静的に記述するモナドやアローと比べると、
手続き型言語に慣れた普通のプログラマには理解しやすいと思います。
また、その定義を図によって視覚化しやすいことも、GUI設計技法として発展する可能性があります。
ただ、モナドが考案される以前の時代には、関数型言語でもストリーミング方式のI/Oは
研究されていたのに、モナドの登場によって、研究者の関心が一気にモナドへ移っていまい、
その後の進展が見えません。Fudgets にしても、開発が終了してしまったのは残念に思います。
それはともかく、良い物を教えてもらいました。「モナドがウザイ」という表現は取り消します。
0328デフォルトの名無しさん
2010/09/24(金) 01:09:52F#最強ってことでいいですか?
0329デフォルトの名無しさん
2010/09/24(金) 09:06:12OS
0330デフォルトの名無しさん
2010/09/24(金) 12:49:08Parsec
0331デフォルトの名無しさん
2010/09/24(金) 12:52:12このアイデアはいろんな言語に移植されてるな
0332デフォルトの名無しさん
2010/09/24(金) 13:39:130333デフォルトの名無しさん
2010/09/24(金) 13:42:35pythonが関数型言語って初耳なんだけど。
0334デフォルトの名無しさん
2010/09/24(金) 13:44:01お前、かわいそうなくらい読解力が欠如してるな。
0335デフォルトの名無しさん
2010/09/24(金) 13:49:04お前の表現力が低いんだよ。
手続き型の、Pythonのような簡単な関数型言語
手続き型のPythonのような、簡単な関数型言語
どちらともとれる。
0336デフォルトの名無しさん
2010/09/24(金) 13:59:490337デフォルトの名無しさん
2010/09/24(金) 14:00:37下流を切り捨ててプログラマの地位向上を狙うべき
0338デフォルトの名無しさん
2010/09/24(金) 14:02:06いきなりプロジェクトに投入して成り立ってる業界とかありえないし。
そんな奴らに理解できる言語など不要
0339デフォルトの名無しさん
2010/09/24(金) 14:04:410340デフォルトの名無しさん
2010/09/24(金) 14:05:22最初に勉強した言語じゃなかったから評価が難しいけど、
何がやりたいのかは使ってるうちに直ぐ飲み込めたよ
強いて言うなら遅延評価は慣れが必要だとか
ポイントフリーみたいな難読化が流行してて勉強しにくいとか
そう言うのはあるけど
0341デフォルトの名無しさん
2010/09/24(金) 14:08:52言語の使い方で頭を悩ます。本来作っているものの中身で悩みたい。
0342デフォルトの名無しさん
2010/09/24(金) 14:10:340343デフォルトの名無しさん
2010/09/24(金) 14:13:000344デフォルトの名無しさん
2010/09/24(金) 14:19:55ポイントフリーって処理の流れが分かりやすいと思うぞ
0345デフォルトの名無しさん
2010/09/24(金) 14:32:28後付けは墓穴を掘る。ww
どちらとも取れるものを一方だけ取ってレスした>>333は池沼。
0346デフォルトの名無しさん
2010/09/24(金) 14:34:000347デフォルトの名無しさん
2010/09/24(金) 14:38:28言えてる
0348デフォルトの名無しさん
2010/09/24(金) 14:39:24全部引数一つならともかく、
引数複数個とかでもほいほいポイントフリーにしてるサンプルが多いんだよね
更にそれを複合させるからドットだらけflipだらけのカオスソースが……
0349デフォルトの名無しさん
2010/09/24(金) 14:42:22単純だから簡単かと言われると、かなり疑問
0350デフォルトの名無しさん
2010/09/24(金) 14:46:530351デフォルトの名無しさん
2010/09/24(金) 14:50:34後付けしようとして失敗してるんだよな。
「手続き型の」の被修飾語がないから、上はそもそも文が成り立ってない。
0352デフォルトの名無しさん
2010/09/24(金) 15:13:250353デフォルトの名無しさん
2010/09/24(金) 15:29:30R言語では無名関数での再帰を実現するためのRecall関数が存在する。
Yコンビネータのほうがラムダ計算的に忠実なんだけどね。
> (function(n){if (n <= 1) return(n) else return(n * Recall(n - 1))})(10)
[1] 3628800
0354デフォルトの名無しさん
2010/09/24(金) 15:30:590355デフォルトの名無しさん
2010/09/24(金) 15:33:060356デフォルトの名無しさん
2010/09/24(金) 15:40:140357デフォルトの名無しさん
2010/09/24(金) 15:51:13関数型言語には、この機能は最低限必要というのはある?
0358デフォルトの名無しさん
2010/09/24(金) 16:06:43・末尾呼び出しの最適化(が可能なような言語設計)
・文の概念がなくてすべてを式で表現できるように(あるいは式の中に文を入れられるように)
・GC(か、それに代わる自動or半自動メモリ管理)
これくらい?
0359デフォルトの名無しさん
2010/09/24(金) 16:09:250360デフォルトの名無しさん
2010/09/24(金) 16:14:270361デフォルトの名無しさん
2010/09/24(金) 16:16:44あるよ
規格で決まってたかどうか知らないけど、GHCとHugsはちゃんと最適化する
0362デフォルトの名無しさん
2010/09/24(金) 17:49:040363デフォルトの名無しさん
2010/09/24(金) 18:18:39アイデアが抽象され、純粋関数型の言語仕様は捨象されてる
これが抽象化だ
ざまあ見ろ
0364デフォルトの名無しさん
2010/09/24(金) 19:32:17多くのケースで最適化可能であっても、
全てのケースで最適化を保証するのはかなり難しいらしい
言語仕様で最適化の保証があるのは、Schemeぐらいじゃないの?
0365デフォルトの名無しさん
2010/09/24(金) 19:50:07どんなケースがあるんだね?言ってみなさい
0366デフォルトの名無しさん
2010/09/24(金) 19:58:09自分で調べろって事だ
0367デフォルトの名無しさん
2010/09/24(金) 19:59:45よくわかんないぐらい難しい。
0368デフォルトの名無しさん
2010/09/24(金) 20:08:55luaも仕様に入ってる
はじめから入れようと意識するなら別に難しいことでもない
「かなり難しい」って情報はどこから得たのかね
0369デフォルトの名無しさん
2010/09/24(金) 20:10:14お前がアホなだけだよw
0370デフォルトの名無しさん
2010/09/24(金) 20:12:22・手続きが、人間の一番自然な考え方だから
問題を解決するとき、その手順によって説明されるのが一般的で、問題ドメインと解決レンジの写像として説明されることはまれ。
・純粋関数型言語の副作用のないモデルは、現実世界の解釈と相性がよくない
データベースのアクセス順序や、ネットワークの通信手順、ユーザインターフェイスなどは、実際にはそれぞれ異なる世界に影響を及ぼす。
一方、設定ファイルの読み込みなどは、実用上副作用のある処理とは考えないが、純粋関数型言語では、IOモナドを導入してモデル化しなければならない。
そのほか、手続的な言語に比べ、現実の計算機上での計算量をイメージしにくい。
・非純粋関数型言語の特徴は、他の言語に取り込まれつつある。
わざわざマイナーな関数型言語を使う必要がない。
0371デフォルトの名無しさん
2010/09/24(金) 20:15:07CommonLISPも仕様には含まれてないけど最適化すると大抵末尾再帰になる
仕様に含めないのはデバッグトレースが難しくなるからじゃないかと
0372デフォルトの名無しさん
2010/09/24(金) 20:27:56・量が多いとか時間が無いとかで困難
・わかってる人には簡単だが、その「理」に辿りつく下地がない、崖の下にいる様
0373デフォルトの名無しさん
2010/09/24(金) 20:54:40人間の思考方法とは合わず、現実世界の解釈との相性も良くない。
計算量をイメージしにくいし、成果は他言語にパクられ続けてる。
にもかかわらず、なぜ純粋関数型言語の研究は続けられているのか?
どうせパクられるんなら、それを前提に純粋関数型の考え方だけを研究すればいいのに、
なぜわざわざ独立した一つのプログラミング言語として研究が続けられているのか?
0374デフォルトの名無しさん
2010/09/24(金) 21:05:28もともとは、純粋関数型に沿った考え方などを研究するんだろうけど、
よいところがあれば、それは他方面にも応用される。
純粋関数型にしか応用できないようなことしか考えないというのは、応用性がなくむしろ不自然な方向性だし、
後の世でどんな風に活用されるか、分からないことは多い。
0375デフォルトの名無しさん
2010/09/24(金) 21:09:50なぜか分からんが、びっくりするぐらい現実に応用が効く……こともある
0376デフォルトの名無しさん
2010/09/24(金) 21:17:030377デフォルトの名無しさん
2010/09/24(金) 21:19:58つ文脈
0378デフォルトの名無しさん
2010/09/24(金) 21:29:48いや、だからさ。
それなら遅延評価や型推論などのレベルで研究していればいいんであって、
Haskell というひとつのプログラミング言語レベルで
これほど多くの人間が研究し続ける必要はないだろ。
98 -> 2010 とHaskell をバージョンアップさせていく必要もないだろ。
人間の思考と合わず、現実世界の解釈と相性もよくないものを誰が求めているのだ?
世の中から求められていないのに、なぜ Haskell がバージョンアップするんだ?
ということを >>370 のレスを読んで感じた
0379デフォルトの名無しさん
2010/09/24(金) 21:59:00Haskell というひとつのプログラミング言語レベルで、どれだけの人間が研究してるのかは、よく知らないけれど、
計算機科学としては、理論的アイデアを実機上で実現してみることに、意義はあると思う。
その土台として、今あるHaskellを使うのはいいんじゃない?
>98 -> 2010 とHaskell をバージョンアップさせていく必要もないだろ。
Haskellで、実用のアプリケーションを作ったりするひともいるわけだし、バージョンアップさせるのはいいことだと思うよ。
>人間の思考と合わず、現実世界の解釈と相性もよくないものを誰が求めているのだ?
実は自分はHaskellは素晴らしい言語だと思うし、世の中から求められてないなんてことはないと思う。
関数型言語は、手続きを考えないで問題をより簡潔で抽象的に記述できるよい言語だけれども、
広く受け入れられていくかは、別問題だと考えている。
0380デフォルトの名無しさん
2010/09/24(金) 22:11:07そういう意味ではオブジェクト指向言語よりもかなりハードルが高い。
オブジェクト指向なら最悪擬似手続き型として使える。
VB使いがJavaに転向できるレベルにならないとな。
VB使いが今のHaskellに転向できると思うか?
0381デフォルトの名無しさん
2010/09/24(金) 22:21:160382デフォルトの名無しさん
2010/09/24(金) 22:23:35>>370 とは別人?
> 世の中から求められてないなんてことはないと思う。
求められてはいるのに普及しないというのは、いささか考えにくくないか。
それなら単に世の中に求めている人が少なすぎると考える方がまだ自然なような気がするが。
それとも、求められてはいるのに普及しないと思う根拠が >>370 なのか?
別人だったらすまん
0383デフォルトの名無しさん
2010/09/24(金) 22:50:06○○言語で何ができるかなんていう研究なんて、できました論文しか書けないよw
研究してる人はもっと広い視野で研究してるw
そのためにHaskellを題材に使っているだけ。
0384デフォルトの名無しさん
2010/09/24(金) 23:02:02純粋関数型などの仕組みや考え方などを材料、道具として研究に使うのなら分かる。
でも研究成果を Haskell というプログラミング言語の形で発表してるのは、
>>370 から考えると何故って疑問に思わないか?
0385デフォルトの名無しさん
2010/09/24(金) 23:06:55370と379と私は同じ人。
関数型言語を知った上で求めている人は、現状のとおりで、プログラマー人口でいうと比較的少人数と思う。
その他は、関数型言語を知らないか、思考方法を理解できないといった370に書いた理由で、利点を理解できないまま、求めていない人たちなどと思う。
0386デフォルトの名無しさん
2010/09/24(金) 23:26:15要するに、関数型言語は手続きを考えないで
問題をより簡潔で抽象的に記述できるよい言語で、
関数型言語を知った上で求めている人たちへは普及している。
しかし >>370 の理由により、関数型言語を知らないか、
利点を理解できないまま求めていない人たちへは普及しない、
ということか?
もしそうなら、普及しない根本原因は >>370 ではなく、
今まで多くの人たちに関数型言語を教えてこなかった、
利点を理解させてこなかった事にあるのではないか。
現に、>>370 であるにもかかわらず、関数型言語を知って
利点を理解できた人間も少なからずいるのだから。
0387デフォルトの名無しさん
2010/09/24(金) 23:26:35Haskell のようなデフォルトが遅延評価な言語だとたしかに直感とややずれることもあるけど
0388デフォルトの名無しさん
2010/09/24(金) 23:29:23特にスペースリークを作ってしまったときにデバッグが面倒
この一点だけでもデフォルトで遅延評価する戦略は糞
0389デフォルトの名無しさん
2010/09/24(金) 23:38:57そりゃまあ、すべての人間があらゆる理論を理解して、実践できる世界なら、問題は別かもしれないけれど、
「手続きが人間の一番自然な考え方だから、関数型言語の考え方が理解されにくい」という事自体が、
普及しないことの問題点のひとつだと考えているんだから、
もしそれが現実として克服されるなら、世界は大きく代わると思うよ。
>>387
Haskellを想定して、純粋関数型言語について書いた。
0390デフォルトの名無しさん
2010/09/24(金) 23:47:070391デフォルトの名無しさん
2010/09/24(金) 23:49:57というか、スペースリークを作ってしまったことに気づくのが困難な事も多い
0392デフォルトの名無しさん
2010/09/24(金) 23:54:15では聞くが、あなたは何故 Haskell の利点を理解できた?
なぜ Haskell はよい言語だと気づくことができた?
0393デフォルトの名無しさん
2010/09/25(土) 00:07:19Haskellに限定するつもりもないけれど、興味の方向性と考え方によるんじゃないかな。
他人と自分の考え方や能力の種類が違うように、万人にそれが適用できるわけじゃないだろうけど。
>>390
純粋で正格評価みたいに、遅延評価じゃない処理系があるなら、アイデアを教えてほしいな。Cleanとかもよく知らないし。
0394デフォルトの名無しさん
2010/09/25(土) 00:23:220395デフォルトの名無しさん
2010/09/25(土) 00:44:25>興味の方向性と考え方による
それなら、あなたが代表するように、今までは興味が向いており、かつ、
考え方に馴染む人にしか普及していなかったと考えられる。
(論理的ではないが)逆にそういう人たちには
既にある程度普及できていると考えても大きな間違いではないと思う。
しかし、そこで普及が鈍化している。
であれば、興味が向くように魅力を伝え、独特の考え方を丁寧に説明すれば、
>>370 のように難解でも、普及の歩みは止まらないのではないか?
今まで日本でそのようなことが行われていたかと言うと、
入門書の数や Web サイトの記事の内容から考えても、
とてもそうだとは思えないから、もし行われれば
むしろ普及のペースは加速するのではないかと思うのだが・・・
0396デフォルトの名無しさん
2010/09/25(土) 01:03:380397デフォルトの名無しさん
2010/09/25(土) 01:25:48Real World Haskell でも読みな
0398デフォルトの名無しさん
2010/09/25(土) 01:35:53>>396
http://encyclopedia2.thefreedictionary.com/space+leak
0399デフォルトの名無しさん
2010/09/25(土) 02:09:190400デフォルトの名無しさん
2010/09/25(土) 02:27:34リンク先を読めば一目瞭然だろ
1年もしないうちに消えてしまうこのスレで
リンク先と同じ事を説明してどうする
0401デフォルトの名無しさん
2010/09/25(土) 02:41:540402デフォルトの名無しさん
2010/09/25(土) 07:49:34Dennis Ritchieも、言語が普及する要因は
社会的なところが大きい、みたいなこと言ってたしな。
0403デフォルトの名無しさん
2010/09/25(土) 10:29:400404デフォルトの名無しさん
2010/09/25(土) 11:08:59日本語のページはねえのかよ、このボケナス!
0405デフォルトの名無しさん
2010/09/25(土) 13:39:480406デフォルトの名無しさん
2010/09/25(土) 13:46:38WebアプリケーションやWindows GUIアプリケーションとして開発するような業務アプリケーションでは
要件を実現するのに必要なことは文字列操作と四則演算程度です
その程度ができる言語で
「人集めしやすい」「開発環境がメジャーなところか出ている」
言語なら業務アプリケーション開発に採用される言語になれると思います
個人的な感触ですがC#普及期は
「VBやっていればC#もわかるだろう」
みたいな雰囲気があったと思います
関数型言語では「○○やっていれば関数型言語もわかるだろう」
とはなかなかならないように感じます
0407デフォルトの名無しさん
2010/09/25(土) 13:55:200408デフォルトの名無しさん
2010/09/25(土) 14:32:55きゅんときた
だがそんなページはねーよ、残念だったな
かいつまめば、遅延評価システムのために、
評価待ちデータがメモリ内に長く居座り
解放されないことをスペースリークと言う。
解放し忘れている訳ではない。
関数(計算)を表現するデータが居座ると、
その環境もまた同時に居座るから、やっかいだ。
ちょっとした計算順序やアルゴリズムを変えたり、
正格評価に変えるだけ簡単に改善できる場合もあるが、
考え方自体を変えなきゃ改善できない場合もある。
おまえはこれくらいの理解でガマンしていろ
0409デフォルトの名無しさん
2010/09/25(土) 15:07:11それ副作用じゃんって言われるからね
そもそも、GCに不要なオブジェクトを破壊させるのも (手動でやったら) 副作用だし
0410デフォルトの名無しさん
2010/09/25(土) 16:08:130411デフォルトの名無しさん
2010/09/25(土) 16:14:460412デフォルトの名無しさん
2010/09/25(土) 18:38:00SQLも使いこなせてないんじゃない?
0413デフォルトの名無しさん
2010/09/25(土) 18:41:56992÷1375
この数の存在をどう思いますか?
0414デフォルトの名無しさん
2010/09/25(土) 18:43:230415デフォルトの名無しさん
2010/09/25(土) 18:45:03SQLはプログラミング言語ではないよ。
0416デフォルトの名無しさん
2010/09/25(土) 18:46:00やらなくても十分解るし普通に使える
実際に知人の息子(中2)は俺らが教えたら使い始めた
数学の知識は教えた覚えはない
(知らないうちに教えて他かも知れんが、少なくとも明示的には教えてない)
0417デフォルトの名無しさん
2010/09/25(土) 18:50:37有理数か
0418デフォルトの名無しさん
2010/09/25(土) 19:19:25無限自慰数というやつか
0419デフォルトの名無しさん
2010/09/25(土) 19:40:32いや高校数学が必要条件だというつもりは全然ない
>>406の「VBやっていればC#もわかるだろう」を受けて、「高校数学やってれば」と書いただけ
0420デフォルトの名無しさん
2010/09/25(土) 19:51:58さっきの息子も小学生の時に学校で Basic を少しやったくらいだったから、
Haskell をすんなり受け入れてもらえたし、楽しんでもらえてる。
ある問題を C/C++ だったら解決しにくいけど Haskell だとこんなら簡単だよ、
という教え方はむしろ逆効果の様な気がする。
それは C/C++ も Haskell もある程度扱い慣れて初めて理解できることだろう。
Haskell を教えるなら、「Haskell なら〜できる」じゃなくて、
「プログラミングって楽しいよね」というのを Haskell を題材に伝える、
というスタンスで向わないとダメだろうな。
0421デフォルトの名無しさん
2010/09/25(土) 20:30:53産業界は最終的にはコスト的に有利なものに流れていくものなので、
20年以上も経て全く使われないところをみると、コスト高の言語なの
だろう。
0422デフォルトの名無しさん
2010/09/25(土) 20:36:040423デフォルトの名無しさん
2010/09/25(土) 20:49:06誰もレスしてないから返すけど、この指摘には重い意味が含まれていると思う。
まず、このスレの住人達の大半は「業務アプリ開発における関数型言語の普及」なんて、考えてもいない。
Python や Ruby といったスクリプト言語は人気があるけど、業務アプリ開発では、まず使われない。
でもこのスレでは、それら言語が関数型言語に置き換わる/押しのけて普及するかには、強い関心を示す。
だから、業務アプリの話題(>>406)が華麗にスルーされている、というのが現実。次に、
>その程度ができる言語で ....
とあるけど、それは画面/帳票等の業務アプリに必須な周辺のフレームワーク/コンポーネント一式が
開発環境やサードパーティから提供されているからこそ、プログラマは「文字列操作と四則演算程度」の
ロジック設計に専念できている、と言える。言い換えると、それら環境一式を揃えた言語でなければ、
(関数型に限らず)業務アプリ開発では採用されない。まぁ、当たり前の話だよね。
しかも「メジャーなところから開発環境が出る」とくれば、もう残る解答は一つ --- F# --- しかない。
少なくとも「VB/C#やっていればF#も同じ開発環境(VisualStudio)だから楽だよね」という雰囲気になれる。
ここまできて、ようやく「VB/C#等をやっていた業務アプリプログラマはF#を使えるようになるか?」という
本題に移れる(あー疲れたw)。 で、それは>>406自身が F# を触ってみてから考えればいいじゃないかと。
0424デフォルトの名無しさん
2010/09/25(土) 20:52:26だからこそのJava, C#なんだし
leksah頑張れ!!
0425デフォルトの名無しさん
2010/09/25(土) 20:52:33あなたの会社の業務内容はなんですか?
SIer系ですか?
だとしたら話になりませんよ。
0426デフォルトの名無しさん
2010/09/25(土) 20:55:04SIer系だったらオブジェクト指向でズブの素人が一瞬で覚えられる言語ならなんでもいい。
そういう会社は技術的なイノベーションがないからそれでうまくやっていけるんだよ。
0427デフォルトの名無しさん
2010/09/25(土) 21:01:21>>Haskell の場合、むしろ他言語にあまり触れていない方が理解されやすいな。
それはどの言語でも似たようなもんだ。
pythonスレやrubyスレでも「javaの○○みたいな機能はありませんか?」って質問よくある話。
(よくあるのはにjavaの静的なコードをまんまpythonやrubyのような動的言語に置き換えようとする人)
そんなんやって出来なくはないけどpython(ruby)的には別のアプローチとったほうがいいよって
フォローもあんま聞く耳持たないというか理解できないのか
しまいには「このpython(ruby)はjavaじゃない糞言語だフンガー!」って切れる奴もたまにいるし。
0428デフォルトの名無しさん
2010/09/25(土) 21:03:13これ以上どんな理由があると言うのだろうか
0429デフォルトの名無しさん
2010/09/25(土) 21:07:180430デフォルトの名無しさん
2010/09/25(土) 21:15:020431デフォルトの名無しさん
2010/09/25(土) 21:17:33お、言ったな。
ゴミだと思うということは何らかが劣っていると思っているんだろう。
何が劣っていると思うの?
0432デフォルトの名無しさん
2010/09/25(土) 21:19:05まともなライブラリとはどのようなライブラリか
まともなライブラリには備わっていて、
関数型言語のライブラリには備わっていないものは具体的に何か
0433デフォルトの名無しさん
2010/09/25(土) 21:21:290434デフォルトの名無しさん
2010/09/25(土) 21:31:36覚えるのに手間がかかるにもかかわらず、なぜか初心者に大人気な言語Perl……
0435デフォルトの名無しさん
2010/09/25(土) 21:46:51確かに覚えるのは手間だなw
shift or die とか書かれても最初意味分からんもんな。
orは左から順番に1が出るまで評価していって1が出たら右の値は無視するという特性を
利用しているなんて初心者はすぐに気が付かないからな。
0436デフォルトの名無しさん
2010/09/25(土) 21:47:430437デフォルトの名無しさん
2010/09/25(土) 21:55:550438デフォルトの名無しさん
2010/09/25(土) 22:02:07あ、そうか、Javaは業務アプリ開発で使われてるから、Scalaも解の一つになるね。
Scala忘れてた。
>>426
オブジェクト指向をズブの素人が一瞬で覚えてコーディングできるとは、とても信じがたいんですけど。
というか「業務アプリ開発における関数型言語の普及」と>>426がどう結びつくのか、まるで見えない。
0439デフォルトの名無しさん
2010/09/25(土) 22:05:47業務アプリ開発には技術的イノベーションはない。
だから今までのやり方を進歩させる必要がない。
OK?
0440デフォルトの名無しさん
2010/09/25(土) 22:10:12>業務アプリ開発には技術的イノベーションはない。
えっ!?、それは>>439の所属しているSIerの話でしょうか?
0441デフォルトの名無しさん
2010/09/25(土) 22:10:29コミュニティのいる*人*がキモイからなー
0442デフォルトの名無しさん
2010/09/25(土) 22:11:090443デフォルトの名無しさん
2010/09/25(土) 22:14:10関数型ならなおさらだ
0444デフォルトの名無しさん
2010/09/26(日) 01:54:300445デフォルトの名無しさん
2010/09/26(日) 02:00:490446デフォルトの名無しさん
2010/09/26(日) 02:07:33Perl は
sh, awk, sed でスクリプト組んでるけど、これらじゃ不満。
C も知ってるが書き散らすには不便。
という人に便利に使えるスクリプト言語だと思う。
0447デフォルトの名無しさん
2010/09/26(日) 02:18:26そう、どっちかいうとシェルスクリプトの延長なんだよな
だからこそ、それをシェルスクリプトに触ったことのない初心者に薦めるのもどうかなぁと思う
0448デフォルトの名無しさん
2010/09/26(日) 02:44:37Perl,Python,Rubyなんかで全部すませないの?
0449デフォルトの名無しさん
2010/09/26(日) 02:54:17けど、じゃあ初心者に C を薦める? sh を薦める? Python も Ruby も知らな
ければ、消去法で Perl でしょう。
普及の話をすると、人は今使ってるものより少し良い、けど似ているもの、に
流れ易いように思う。Perl から Ruby とか。もちろんどこが良いかは個人によっ
て違うだろうけどね。
>>448
シェルスクリプトで済むなら、シェルスクリプトで。
普段使っているシェルから思考の切り替えが必要ないので、手軽な気がする。
0450デフォルトの名無しさん
2010/09/26(日) 05:41:37プログラミング言語としての要件に欠けるものがあるのかい?
0451デフォルトの名無しさん
2010/09/26(日) 07:38:16プログラムを作れない。
0452デフォルトの名無しさん
2010/09/26(日) 10:05:29どういうのがプログラムなんだ?
0453デフォルトの名無しさん
2010/09/26(日) 10:48:08SQLはチューリング完全ではない
0454デフォルトの名無しさん
2010/09/26(日) 12:03:46まぁとりあえずSQLだけで帳票アプリとか作ってみれば?
0455デフォルトの名無しさん
2010/09/26(日) 13:15:16嫌だよ、SQL ほとんど使ったこと無いし、
作れるかどうか検証するために学習するなんて面倒だ
それとも何か、帳票アプリとか作れるのがプログラムである必要条件なのか?
0456デフォルトの名無しさん
2010/09/26(日) 13:17:04一応SQLでもできるとは聞くが
0457デフォルトの名無しさん
2010/09/26(日) 13:38:24ソースきぼん
0458デフォルトの名無しさん
2010/09/26(日) 14:15:50>>453
0459デフォルトの名無しさん
2010/09/26(日) 14:28:130460デフォルトの名無しさん
2010/09/26(日) 14:31:34すまん、日本語が変すぎる
チューリング完全でなければプログラムとは言えない、ということ?
0461デフォルトの名無しさん
2010/09/26(日) 15:16:500462デフォルトの名無しさん
2010/09/26(日) 17:38:520463デフォルトの名無しさん
2010/09/26(日) 17:41:390464デフォルトの名無しさん
2010/09/26(日) 17:42:210465406
2010/09/26(日) 17:50:55私自身は小さい人売り会社を何社か転々としました
業務内容をざっくり言うと
物流系、金融系で
1つの現場でメンテと称して何年かやり
手を汚す側の人間として、調査、バグ対応、小さい機能追加、修正、大きな開発のメンバに参加と
とやってます
>>423
完璧な説明をありがとうございます
F#に関してはCodeZineの記事を少し読んだ程度の理解しかありません
その上で印象を言うと
(pros)
説明にもある通り、MSや3rd Partyのフレームワーク/コンポーネント一式が使えるのは非常に有利
MSのIDEでサポートされたことも非常に有利
(cons)
C系やVB系と比べてF#の文法に違和感が大きいのではと思う
例えばC#で 「@""」やラムダ式なんかを書いて
自分では大したことないつもりで書いてても、ギョッとされることがある
その様な感覚からするとF#の文法は、何かの延長線上から想像できるものではなく
カルチャーショックなんではないしょうか
0466デフォルトの名無しさん
2010/09/26(日) 17:51:11SQL はプログラミング言語ではないな。
動作を指示している対象が「コンピュータ(計算機)」ではないから。
0467406
2010/09/26(日) 18:11:590468デフォルトの名無しさん
2010/09/26(日) 18:19:59C系言語しか使ってこなかった人からすればシェルスクリプトやPerlもぎょっとすると思うぞ(逆もまたしかり)
使うと便利だとコンセンサスが成立しさえすれば、そこまででもないんじゃ
0469デフォルトの名無しさん
2010/09/26(日) 19:10:57いまどきなに言ってるんだ?
sql 再帰 あたりでぐぐって見てから言ってくれ。
0470デフォルトの名無しさん
2010/09/27(月) 00:06:24そして、そっちのほうが幸せな人生を送れてるのではないかという気がする件
0471デフォルトの名無しさん
2010/09/27(月) 00:33:510472デフォルトの名無しさん
2010/09/27(月) 01:10:24> 以下の式を計算すると、このスレの皆さんが普段から欠かさない数が出てきます。
>
> 992÷1375
>
> この数の存在をどう思いますか?
一見すごいように見えるが、
ただ単に、0.721454545・・・・という
循環小数を語呂合わせで作って分数に直しただけ。
語呂合わせで作ったすべての循環小数は分数に直せる。
循環小数を分数になおす方法はここなんかを参考にして。
http://homepage1.nifty.com/ishituka/math/heihokon/junkan/junkan.htm
0473デフォルトの名無しさん
2010/09/27(月) 15:50:310474デフォルトの名無しさん
2010/09/27(月) 18:20:16周囲の目を気にしすぎ(自意識過剰?)のように見える。(ぎょっとしたり、ショックを
受けるといった人達という)下を見るよりも、もっと上を見ると気が楽になるよ。
まずは、自身が関数型言語に慣れること、一通り使いこなせるようになることに集中しよう。
で、そんな人達に対して、「相手にわかる言葉で」分かり易く説明できるようになれば、
関数型言語について、ある程度のレベル(境地)に到達できたと判断できるだろう。
自分では(=頭の中では)分かったつもりになっていても、他人に(自分の言葉で)説明できないのは、
実は理解が中途半端だから。人に(分かり易く)教えることは、自身の成長の為でもあったりする。
(このスレの>>186-203で F# に関するQ&Aがあったから、参考になるかもしれない。)
そんないきなり無茶な!と思うかもしれないけど、それは自分のペースで学習すればいい。
(孤独な学習については、このスレの>>232-235が参考になるかもしれない 。)
0475デフォルトの名無しさん
2010/09/27(月) 19:49:59>なんとなく「学歴うんぬん」と「でも社会ではなあ」みたいな気がしてきました
「学校の勉強は大変よくできていたはずけど、社会に出てみると役に立たない人」みたいな....。
このスレであれば、>>254,256 のように、せっかく難しい関数型言語の理論について知識があるのに、
「人試し」や「攻撃(暴力)の武器(?)」といった発想でしか、その知識の使い道を見い出せない人達を憶い出した。
まぁ、そんな他人の事は置いといて、自身が学習した関数型言語に関する知識を日常業務の中で活かせないか、
言い換えると「日常業務の中で【関数型脳】をどう活用するか」について考えよう。前を向いたほうが気が楽になる。
たとえば、業務アプリの受注伝票入力画面や月次売上集計出力帳票をじっくり見て、
それらの論理的な構造を関数型言語の代数的データ構造である
・直積(direct product) -- 組合せ関係にある要素、[例] <受注区分> * <受注日> * <受注明細一覧>:<受注伝票>
・直和(direct sum) -- 排他関係にある要素、[例] "新規注文" | "再注文" | "注文取消":<受注区分>
・列(sequence) -- 同一種類の要素の集まり、[例] seq_of <受注明細>:<受注明細一覧>
という三種類のデータ型で表現してみよう。(上の例の中で、<XXXX> はデータ型を意味している)
表現できたら、そのコードが正しく(エラー無しに)処理系で読み込めるか確認しよう。(実行はまだまだ先の話だよ)
これら入力画面や出力帳票は、GUI開発におけるModel-View-ControllerアーキテクチャのViewに対応するよね。
これが「関数指向設計技法」の最初の一歩になる。実は、関数型言語に適した(OOPではOMT/UMLに相当する)
設計技法については、このスレでもたびたび話題になっているんだけど、汎用的な(=万能な)設計技法は難しい、
でも、対象領域を(設計ロジックの比較的単純な)「業務アプリ開発」に限定すれば、(OOD以前の古典である)
データフロー図、代数的データ構造図(=ジャクソン構造図)、関数階層図(=機能階層図)、状態遷移図を
わずかに修正することで、対応できるんじゃないかと妄想していたりする。
0476デフォルトの名無しさん
2010/09/27(月) 20:23:27実際的な仕事と理論的な仕事を別々にするのは不自然だし、有害であるというのが、
ずっと以前からの私の考え方である。ソフトウェアの設計にしろハードウェアの設計にしろ、
コンピュータの分野でなされてきた実際的な仕事のほとんどは、あやしげで見苦しい。
なぜならそれを行った人間は、自分の仕事の基礎となっている基本的な原理について、
なんら理解していないからである。抽象数学や理論数学の仕事の多くは役に立たない。
なぜならそれは実際のコンピュータの分野となんの接点も持たないからである。
0477デフォルトの名無しさん
2010/09/27(月) 20:48:15てか、誰の言葉?
0478デフォルトの名無しさん
2010/09/27(月) 20:56:26前半は余計だと思う。
後半、かなり興味あるからちょっと質問したい。
これは関数指向設計技法の話なんだよね。
関数型言語を用いてプログラムする前の段階、設計の段階の話だよね。
直積や直和、列の話は分かった。
受注伝票入力画面などで使いたいとリストアップした「データ」を
それら3のカテゴリで分けて表現するように考える。
ここまでは言いたいことは解ったが、その後が解らない。
> そのコードが正しく(エラー無しに)処理系で読み込めるか確認しよう。
これは具体的にはどういうことなんだ。
プログラム前の設計の話ではないのか。
たとえば「エラーが出て正しく読み込めなかった」というのは、
この関数指向設計技法の話ではどういった設計ミスによるものなんだ。
まだいくつか疑問点があるが、
残りは詳しく話を聞いて考えてから質問することにする。
0479476
2010/09/27(月) 20:58:32http://en.wikipedia.org/wiki/Christopher_Strachey
0480デフォルトの名無しさん
2010/09/27(月) 21:20:35分類できないし、どこにも所属しないし、特徴がない
だから統計の対象にならない
0481475
2010/09/27(月) 21:31:36>前半は余計だと思う。
かもしれない。無視してくれ。
>これは関数指向設計技法の話なんだよね。
>関数型言語を用いてプログラムする前の段階、設計の段階の話だよね。
そう、設計段階の話。要求分析よりも後工程だけど、詳細設計よりも前の(中盤の)設計工程。
>> そのコードが正しく(エラー無しに)処理系で読み込めるか確認しよう。
>これは具体的にはどういうことなんだ。
入力画面や出力帳票に表れる用語と、それら用語の論理的な構造(関連)は、システムをblack-boxとして見た
外部仕様、あるいは機能仕様(の一部)に相当する。この様な外部仕様というのは、開発の現場では、Word/Excel/Visioなどで
作成した文書のレビュー&手直しを繰り返すことで設計を進めるのが一般的。けれども、その設計課程で生じた
「仕様の誤り/矛盾/曖昧さ/欠落」といった要素は自然語とお絵描き図に埋もれてしまい、明白なミスは指摘できても、
・外部仕様について、少なくとも(構造的な、あるいは構文/文法的(syntax)な)エラーは存在していない
ことまでは証明できない。(意味的(semantic)なエラーについては、ここでは考えない。難しいから.....)
これを解決するため、自分はこれまで yacc(bison) や racc といったパーザジェネレータによる構文検査(syntax cheking)を
試行してきたが、この
・外部仕様の構文検査に、代数的データ型に関する強力な型検査/型推論機能が適用できるのではないか
と考えている。特に、これまでのパーザでは「データ型」という概念では検査不可だったのが、可能になる点に期待している。
0482デフォルトの名無しさん
2010/09/27(月) 21:41:38それともCafeOBJみたいな代数仕様をめざしてる?
0483478
2010/09/27(月) 21:46:17曖昧な点をはっきりさせておきたい。
これまでのパーザではデータ型という概念では検査不可だったのが、
「***」の活用・運用によってデータ型という概念で検査可能になることを期待している。
この***に入る言葉は、関数指向設計技法なのか。
それとも Haskell の Parsec などの具体的なパーザジェネレータなのか。
0484475
2010/09/27(月) 22:02:52いいえ。Z/VDM/OBJといった、いわゆる形式的仕様記述(formal description)への発展は考えていません。
この関数型設計技法の指導者が、それら形式的手法を身につけていることは望ましいことですし、
おそらく指導者は(頭の中では)数式という形式的なイメージを持っていることでしょう。
ただし、そのイメージを、開発の現場にいる「普通の(あるいは、庶民的な)」プログラマへ直接的に語っても
理解してはもらえません。ですから、そんな「普通のプログラマにも分かる言葉で説明する」必要があります。
(>>474を参照。)その言葉というのが、>>475の最終段落に書いた「古典的な構造設計図群」です。
0485475
2010/09/27(月) 22:12:07***に入る言葉は、ズバリ「関数型言語の処理系」です。言語としては、代数的データ型と静的型検査/型推論機能を
備えていれば(SML/F#/Haskell/SCala ...etc)どれでもかまいません。特定の言語には依存しません。
ですから、>>475の[例]に書いた言語は、架空の仕様記述言語です。(たとえば字句やシンボルに日本語を許しています。)
「これまで yacc を使っていたのを、(たとえば) ghic の活用によって...」という意味になります。
0486デフォルトの名無しさん
2010/09/27(月) 22:14:570487478
2010/09/27(月) 22:25:04直積や直和などで表現したデータ間の関係を
直接プログラミング言語のソースに記述する。
それを処理系(コンパイラなど)に読み取らせる。
その結果、エラーが出なければ正しく分類できたと言える。
エラーが出れば、正しく分類できなかったと言える。
こういうことなのか。
0488475
2010/09/27(月) 22:44:15おおよそ、その通りです。与えられた要求仕様に対して、仕様の実装漏れは存在するかもしれないけど、
・仕様の不一致 ==> データ型エラー
・仕様の不足 ==> 未定義エラー
・構造の誤り ==> 文法エラー
については、(処理系を通過したことで、)ミスは存在しない、と言える。
ということです。たったこれだけでも、従来のワープロ&作図ツールと目視確認に頼った現状の設計技法よりも、
ソフトウェア品質向上が期待できると思いませんか?
0489475
2010/09/27(月) 23:05:22>pascalでも十分かと
Pascalって「タグ付き共用体」を定義できましたっけ?
これが無いと(あるいはこれに相当するものが無いと)、直和の実装が厳しくなります。
もしAdaであれば、直和を素直に表現できます。
プログラミング言語以外のデータ定義言語であれば、ASN.1、あるいはXDR(External Data Representation)でも可能。
もちろん、XMLスキーマ系の言語でも無問題です。
このように、データ型検査「だけ」なら静的関数型言語でなくとも、いくつかの選択肢があります。
0490478
2010/09/27(月) 23:05:39それができれば凄いと思う。
ソフトウェア品質向上に繋がるかどうかは、私はまだわからない。
というのも、その手の便利なツールが既にありそうな気がするから。
(わざわざ関数型脳にならなくても、関数型脳の人と同じ仕事がこなせるツール)
ところで、それを実現するにあたって代数的データ型が必要なのはわかる。
コンパイル時に検査するから、静的型検査機能が必要なのもわかる。
しかし型推論機能はどこで必要になる?
これが必要になるシーンがいまひとつ思い浮かばない。
なので、なぜ関数型言語が有利なのかがまだわからない。
0491475
2010/09/28(火) 00:20:22>しかし型推論機能はどこで必要になる?
>これが必要になるシーンがいまひとつ思い浮かばない。
>なので、なぜ関数型言語が有利なのかがまだわからない。
その部分については、まだ説明していませんでしたからね。
以下で、関数指向設計技法の第二歩(>>475の続き)を解説します。
>>475では、入力画面や出力帳票といったMVCアーキテクチャのViewの論理的な構造を
代数的データ型で記述しました。次に、この論理構造を元にしてModelを定義します。
この部分は、既存の設計技法を流用しましょう。たとえばModelがEntity-Relationshipを
ベースとしているなら、リレーショナル論理/代数の正規化技法(第n正規化)、あるいは
T字型E-R設計技法が、Object-RelationshipをベースとしているならOO設計技法です。
ポイントは、最終的なModelが提供するサービス仕様である
・Create - 生成(INSERT), Read - 読み出し(SELECT), Update - 更新(UPDATE), Delete - 削除(DELETE)、
という、いわゆる
・CRUD操作の論理的な構造について、代数的データ型を入出力とする関数で定義する
事です。たとえば、以下は「当月の全店における受注レコードの検索処理」というRead系関数の
データ型である<全店受注レコード一覧>定義の一例です。
set_of <全店受注レコード>:<全店受注レコード一覧>;;
<支店区分> * <受注日> * <受注金額>:<全店受注レコード>;;
"札幌支店" | "東京本社" | "名古屋支社" | "関西支社" | "広島支店" | "福岡支店":<支店区分>;;
Date:<受注日>;;
Integer:<受注金額>;;
(長いので以下へ続く)
0492デフォルトの名無しさん
2010/09/28(火) 00:32:22*BSDが普及しない
関数型言語が.....
0493デフォルトの名無しさん
2010/09/28(火) 00:34:18SIerの業務アプリ開発から生まれたイノベーションって何だ?
研究所とかでなく。
0494デフォルトの名無しさん
2010/09/28(火) 00:36:070495デフォルトの名無しさん
2010/09/28(火) 00:38:16匿名とはいえ2chよりもwikipediaのほうがまだ信頼度高いんだからさ。
0496475
2010/09/28(火) 01:03:18また、<月次売上集計出力帳票>というViewについては、>>475で既に定義していました(...と仮定します)。
だとすれば、「全店の月次売上集計出力帳票の印刷処理」は、以下の関数型として定義できるはずです。
<全店受注レコード一覧> -> <月次売上集計出力帳票>:<全店の月次売上集計出力帳票の印刷処理>;;
この関数は、代数的データ型から代数的データ型への写像(map)にすぎませんから、
関数型プログラミングに慣れた人であれば、必要な副関数に分解するなりして、容易に定義できるでしょう。
ただし、それを単純なプログラムコードとして提示したのでは【関数脳】に慣れていない
「普通のプログラマ」にとって(コードが)魔術書にしか見えない可能性があります。このショックを和らげる為、
情報処理技術者試験で馴染みのある古典的設計技法である、JSP法(Jackson Structured Programming,
通称「ジャクソン法」)を用いて「関数の入出力データと関数自身の論理的な構造」を視覚的に提示します。
JSP法については、以下を参照してください。(日本語の良い解説サイトがあれば、どなたか紹介してやって下さいませ。)
http://en.wikipedia.org/wiki/Jackson_Structured_Programming
(まだ続く。次で終了の予定。)
0497475
2010/09/28(火) 01:04:29ここでのポイントは2つです。
(1)関数の入出力データについて、JSP法の4要素を代数的データ型の3要素(直積/直和/列)+基底型に対応づけて説明する。
具体的な対応関係を以下に示します。
・[JSP] 基礎 --> [関数指向] 基底型 -- Integer, Float, Boolean, String, Date, Time等
・[JSP] 逐次 --> [関数指向] 直積 -- タプル(組)、レコード
・[JSP] 選択 --> [関数指向] 直和 -- 列挙、タグ付き共用体
・[JSP] 反復 --> [関数指向] 列 -- リスト
(2)副関数群への分解手順(アルゴリズム)について、JSP法の考え方に沿って(JSP法を模倣して、あるいは
JSP法の用語を使って)、指導者が普通のプログラマへ説明する。
(2)については、いくらか曖昧な表現になっています。これは、現実の業務アプリに含まれる定型的な処理パターンを整理し、
それぞれについて(関数型プログラミングとして)最適な分解手順を検討し、カタログ化する必要があるからです。
MVCアーキテクチャについて、最後にContorollerが残りましたが、(もう眠いので)今晩はこれで終わりにします。
0498デフォルトの名無しさん
2010/09/28(火) 01:35:08> 業務アプリ開発には技術的イノベーションはない。
と
>だから今までのやり方を進歩させる必要がない。
が繋がってないよ。
仮に「業務アプリ開発から生まれるイノベーションがない」のが正しいとしても、
他の研究や開発などから生まれたイノベーションを使ってやり方を進歩させないと
競合他社に勝てないもん。
ま、そんな話は置いといて、とりあえず >>475 の話は興味深い。
続きが楽しみ。
0499デフォルトの名無しさん
2010/09/28(火) 01:39:51このあたりはPrologでやれば、それまでではないか?
0500478
2010/09/28(火) 07:31:45>>496
>>497
型推論機能がどこで使われるかと質問したが、まだ答えてもらっていない。
最後に残った Controller で使うのだろうか。
設計をミスったときに、そのことを型推論機能によって発見するのが、
型推論機能付き関数型言語を使う目的なんだよね。
ある設計をしようとして、本来はAと設計するはずが、
Bと設計してしまったために、プログラムのXの部分において
型推論によってYというエラーが発生した。
具体的でごく簡単な実例を使ってこのように示してくれないか。
0501デフォルトの名無しさん
2010/09/28(火) 08:35:44"型推論によってYというエラーが発生した。"とはならんでしょ。
むしろ型を記述しないことで、より抽象的に記述することを可能にさせる機能。もちろん型推論での記述者はその型について念頭におくことが必要になるけれど.
0502デフォルトの名無しさん
2010/09/28(火) 08:36:340503478
2010/09/28(火) 12:54:28もし型推論機能がそれだけのことしかしないのであれば、
型シグネチャを明示すれば型推論機能は全く不要となる。
しかし、型を明示せず >>475 の様な考え方をソースコードに落とし込むことが想像できない。
>>475 のようにデータ間の関係を直積などで表現するように思考し、
その正しさをコンパイラで検査するためにソースコードに落とし込む者が、
型シグネチャを省略なんてするだろうか。
そのようなソースコードは嬉しいことにドキュメントの役割も果たしているため、
むしろ型シグネチャは注意深く明記すると思うのだが。
なので型推論機能の出る幕がないように思える。
少なくとも >>488 のエラーを検出するのに型推論機能は要らない。
しかし、>>475 は必要だと言っている。
であれば、当然仕様に関する何かのエラーを検出するためだろう。
0504デフォルトの名無しさん
2010/09/28(火) 13:24:47動的型だと実行時エラーになる場面でも、
型推論を持つ性敵方ではコンパイル、あるいは実行前にはじける
0505デフォルトの名無しさん
2010/09/28(火) 13:46:22型シグネチャの明示を避けるために(も)型推論は使われるのに、明示すれば型推論はいらないってどんだけ(´・ω・`)
型推論はそれをもって何か機能を与えるものではなく、省力化の一手段。
その副作用としてより抽象的な記述ができるというもの。この辺は好みあると思うが、自分は好み。
0506デフォルトの名無しさん
2010/09/28(火) 14:22:51原理的に型推論できないから明示が必要な場合もあるし、
なんか話が変に飛んでないか?
0507デフォルトの名無しさん
2010/09/28(火) 14:25:40> 他の研究や開発などから生まれたイノベーションを使ってやり方を進歩させないと
> 競合他社に勝てないもん。
それは進歩ではなく追従
0508デフォルトの名無しさん
2010/09/28(火) 14:29:00> 型シグネチャを明示すれば
それをし忘れるのが人間でしょが
0509デフォルトの名無しさん
2010/09/28(火) 14:36:05C言語だとChar型なのに変換なしに四則演算できちゃったり、
そういう人間によるおかしな操作をしちゃって、なまじコンパイルが通るから
どこで間違いが発生しているのかバグ追跡が極めて難しくなってくる。
(最近のコンパイラなら少しは賢くなっているが理論的な保証は何も無い)
型推論をすればそういうバグが理論的になくなる。
強い静的型付きの言語なら型推論可能だということが理論的に保証されているから、
Cなどのコンパイラよりずっと賢く型推論できる。
0510デフォルトの名無しさん
2010/09/28(火) 14:39:05型推論の理論的保証はないんだけどね。
0511デフォルトの名無しさん
2010/09/28(火) 14:42:150512デフォルトの名無しさん
2010/09/28(火) 14:43:21俺勘違いしてる?
ごめん、正しい知識を教えてください。
0513デフォルトの名無しさん
2010/09/28(火) 14:45:28> 型推論(かたすいろん)とはプログラミング言語の機能の1つで、
> 静的な型付けを持つ言語において、変数や関数の型を宣言しなくても
> それを導くのに使われた関数の型シグネチャなどから自動的に型を決定する機構のこと。
> 主に関数型言語で用いられる。
型推論は補完機能とはちがうんだぞっと。
0514デフォルトの名無しさん
2010/09/28(火) 14:46:450515デフォルトの名無しさん
2010/09/28(火) 14:48:50どこもおかしくないように見える
0516デフォルトの名無しさん
2010/09/28(火) 14:50:140517デフォルトの名無しさん
2010/09/28(火) 14:50:560518デフォルトの名無しさん
2010/09/28(火) 15:16:47OCamlにもF#にも型推論はある。後は分かるな
0519478
2010/09/28(火) 18:31:05> もっと正確に言えば、まちがった型シグネチャを"明示"しちゃうんだよねぇ。
一般的な場合のそれはよくわかるし、私もよく間違ったりする。
しかし、>>475 の様に関数指向設計技法に基づいて必要なデータ間の関係を直積などで考え、
それを関数型言語のソースコードに落とすという状況を考えた場合、
「間違った型シグネチャを明示したことによって発生するコンパイルエラー」
というのは、たんなるコードの記述ミスであって「設計ミス」ではないと思う。
それとも、やはりこれでも「設計ミス」が検出できるのだろうか。
あと私は >>501 を受けた >>503 で
「もし型推論機能がそれだけのことしかしないのであれば」と断りを入れた。
それだけのことというのは、
> 型推論は、明示的に型を記述しなくても整合性が取れているかをチェックしてくれる機能
の事。
0520デフォルトの名無しさん
2010/09/28(火) 18:55:58いちいち型を記述するのは面倒くさいぞ。
関数の中のwhere節で関数を作るときなんか型をいちいち書いていたら見苦しくて仕方ない。
無名関数でも型推論を信じていちいち型宣言はしない。
分かりきったことを自動化するのはコンパイラの役目だと思う。
0521デフォルトの名無しさん
2010/09/28(火) 19:26:38型シグネチャから書く癖がついてるから、全然面倒に思わん。
ある計算をしたいと思った時、全体の計算をするには
どのような部分的な計算をする関数が必要かを考える。
次にそれらの関数の型シグネチャを記述して、
計算を完成させるパイプラインの外観を考える。
それから初めて各関数の中身を考えて記述する。
自動化も何も、考える順番として型シグネチャが先に来るから、
「いちいち」型宣言をするという感じはないな。
0522デフォルトの名無しさん
2010/09/28(火) 19:48:01いつも同じものを返す関数 a -> b だと思ったけど
実は毎回微妙に違うものを返さないといけなかった a -> IO b
0523デフォルトの名無しさん
2010/09/28(火) 19:48:23無名関数の型シグネチャも先に書くの?
0524デフォルトの名無しさん
2010/09/28(火) 20:19:21型宣言をめんどくさくないと感じているだけで、型推論の恩恵は受けてるんでしょ。
0525デフォルトの名無しさん
2010/09/28(火) 20:32:04無名関数の型シグネチャなんかソースに書けないよ
少なくとも俺が普段使ってる Haskell では書けない
書ける言語も知らない
Haskell の無名関数は map とかの高階関数の引数で使うんだよ
関数同士のパイプラインを考える一環で型シグネチャを考えるんだから、
map に入れる無名関数を考える時点で既に map の型シグネチャが出来上がってるよ
>>524
そりゃ受けてるよ、当たり前だ
それが Haskell のいいところなんだし
0526デフォルトの名無しさん
2010/09/28(火) 20:32:25こんなんじゃだめなんかいね??
0527デフォルトの名無しさん
2010/09/28(火) 20:37:07(\x->x+1) :: Int -> Int
無名関数の型シグネチャってこういうのを想定してた
0528デフォルトの名無しさん
2010/09/28(火) 20:40:18そんなの書いたことない
0529デフォルトの名無しさん
2010/09/28(火) 20:44:330530デフォルトの名無しさん
2010/09/28(火) 21:10:31\ (x :: Int) -> x + 1
と書くこともできるぞ
0531デフォルトの名無しさん
2010/09/28(火) 21:11:57main :: IO ()
という型シグネチャが出来上がってるよ。
0532デフォルトの名無しさん
2010/09/28(火) 21:15:45それは書けることは知ってるけど、書かないな
>>527 のように書けることは今日初めて知った
でも今後も書くことはないだろうなぁ
少なくとも今の俺のやり方を続けていれば書くことはない
0533デフォルトの名無しさん
2010/09/28(火) 21:18:08俺の発言の何に対するレスなのか全くわからん
反論なのか同意なのかもわからん
たのむ、詳しく解説してくれ
0534デフォルトの名無しさん
2010/09/28(火) 21:21:19あとwhere節の中の定義でトップレベルの定義内で使われてる型変数を参照したり
こんなもん使うことないだろうと思ってたが、他人の書いたコードを解析する為の実験用の書き捨てコードなどで
山程使ってた、不思議!!
0535475
2010/09/28(火) 21:43:52なんともタイミングが悪く、DION恒例のアクセス規制が始まってしまいました。........orz
(このカキコは、カキコ代行人さんに依頼してもらっています)
個人的にはカキコするならするで、怒濤のカキコをしたく。
あまり代行人さん達に迷惑をかけたくないので、規制が解除されるまでROMに落ちます。最後に、
>>526-534
Haskellには専用の隔離スレがあるから、固有の議論をしたかったら、そこへ逝ケ!!ウザイよ
0536デフォルトの名無しさん
2010/09/28(火) 21:46:04いつも一言多い奴だな。お前こそウザイぞ。
0537デフォルトの名無しさん
2010/09/28(火) 21:49:260538デフォルトの名無しさん
2010/09/28(火) 21:50:34だよな、ここは関数型言語は何故普及しないのか、
その理由を考えるスレのはずだよな
普及の方法や設計方法を考えたりする場でもなかったな
0539デフォルトの名無しさん
2010/09/28(火) 23:03:13rLeft = Right . Left
rrLeft :: a -> Either b (Either c (Either a d))
rrLeft = Right . Right . Left
まさか こんなコードの保証人になった理論家はいないよな?
0540デフォルトの名無しさん
2010/09/28(火) 23:19:08Leftを女にすべき
0541デフォルトの名無しさん
2010/09/28(火) 23:56:41そんなふうに考えていた時期が
0542デフォルトの名無しさん
2010/09/29(水) 02:31:20>>538
Haskell屋が語ったインタビューが『言語設計者たちが考えること』に載ってる
これが正しいかはともかく、彼らがどう考えているかという参考にはなる
まあ一部だけ転載
―― 関数型プログラミング言語が主流になっていないのは、なぜだと思いますか?
Simon Peyton Jones: マーケティングが下手だからでしょう!
これはプロパガンダという意味ではありません。そういった取り組みは今まで十分やってきました。
マーケティングとは、対象となるニッチ市場を注意深く選択した後、
そのニッチ市場に関数型プログラミングを訴えかけるための最も効果的な手段を適用し、
確固たる地位を築いていくということです。
古き良き80年代には、我々は関数型プログラミングがあらゆることに向いていると考えていました。
しかし、この新テクノロジを「あらゆることに向いている」と称することは、「特に向いているものは何もない」
と称することと同じだったのです。(後略)
Paul Hudak: 私は、関数型プログラミングが、いわゆる従来のプログラミングとは大きく違うからだと考えています。
これにより受け入れられにくく、習得しづらく、サポート(ライブラリや実装など)も難しいものと
なってしまうのでしょう。
0543デフォルトの名無しさん
2010/09/29(水) 20:10:03基礎的な理論があるというのはやっぱり強みであるわけで、ただ、その理論の適用
範囲を無意識にプログラムに限定してしまっているというのがまずいと思うんだ。
なんというか、例えば、型の理論をプログラム以外に適用することはできない。=>真
が暗黙に承認されている気がする。
0544デフォルトの名無しさん
2010/09/29(水) 20:17:52他の分野への応用ならそういう言語を作ればいいけど、
それはいわゆる関数型言語とは別のものになるんじゃね
0545デフォルトの名無しさん
2010/09/29(水) 20:47:25今のままでは関数型言語の要素もかじった手続き型OOPL with IDEの土俵に立った時点で負け
これから先さらに複雑になって人間の頭だけじゃ到底扱えないような複雑、精密なシステムが出てくれば
自と先に挙げた流儀は主流になってくる筈
それにはまだまだ研究によって解決されるべき問題があるからまぁ果報は寝て待てというか、
これから先も変わらないような土台となる部分からさらっていくべきとかいろいろ
0546デフォルトの名無しさん
2010/09/29(水) 21:10:01これは関数型言語的だ!と判断する要素だけ抽出して(難しいけど)移し替えれば
多分プログラムに限定する必要はないと思う。
別にすべての関数型言語好きが、"プログラムである"&"それは関数型的"で
あることを要求しているとは限らないよ。”プログラムである”という部分を
抜いてしまって、別のものに置き換えてしまっても案外満足してしまうかもしれない。
>>545
大きく強固な土台があった上の一分野としてはありかもしれないけれど、
それだけで戦うのはきつすぎるだろ。自分で高い山の頂上だと思っている
ところだけを地上に持ってきてもそれは高い山の頂上だとは一般的に思われない。
545自身それが至高だと思うのは対比するべき部分あってのことじゃない?
0547475
2010/09/29(水) 22:06:53ただ、いくつか質問をもらっているので、それらだけレスして、今度こそ最後とします。
>>499
Prologの型検査は動的ですので、この「静的型検査を活用した設計支援」という目的には適しません。
なお、「型付き論理型言語」については、もし機会があればPrologスレに新ネタを投入するつもりです。
>>500
型推論の有効性は関数定義における記述の省力化もありますが、(map/filter/fold等に代表される)
パラメタ多相による高階総称関数を「安全に記述できる」事が最大の利点だと考えています。
>>502
「IEEEソフトウェア’88 岩波書店(1988年), 絶版」という書籍(論文集)に収録されている論文
「プログラミング - 魔術か科学か? C.A.R. ホーア」(原題 Programing: Sorcery or Science?)で引用されている一節です。
>>519
たとえ話として、Wordを使って自然語で書いた仕様書にスペルミスがあり、これの見落としが原因で重大な障害(バグ)が
発生したとします。この場合、このスペルミスは単なる「記述ミス」でしょうか、それとも「設計ミス」でしょうか?
0548デフォルトの名無しさん
2010/09/29(水) 22:50:02”関数型的な思考プロセス”でプログラムを組んでいる、と言われる。
(これはある程度承認される言明のはず)
次に、関数型を押す人の内なるモチベーション、というか欲求としては
プログラミング自体よりも実のところその”関数的な思考プロセス”
というところに重きを置いていると個人的考えとして思う。
というわけで、>>546の補足として、関数型的な人は実は”関数的な思考プロセス”
を取ることができる対象であれば、別にプログラムでなくても充分満足できるのでは
ないか、と思うんだ。
もし、実用性がないおもちゃみたいなものだ、という疑念が根深くあるならば、
逆に、本当に子供向けおもちゃにしてしまうという手もあると思う。
世界的に売れる余地があって、実際売ることができれば、それはそれでひとつの勝利
だと思うし。子供に刷り込みを行って拡大するという古典的な手が使える。
0549478
2010/09/29(水) 23:02:55> 型推論の有効性は関数定義における記述の省力化もありますが、(map/filter/fold等に代表される)
> パラメタ多相による高階総称関数を「安全に記述できる」事が最大の利点だと考えています。
だから、そのパラメタ多相を使って設計をコードに落とし込んだ例を
私は一度も見せてもらっていないし、解説も聞いていない。
だから最大の利点と言われても、関数指向設計技法という文脈において
どう有利に働くのかほとんど想像できない。
> たとえ話として、Wordを使って自然語で書いた仕様書にスペルミスがあり、これの見落としが原因で重大な障害(バグ)が
> 発生したとします。この場合、このスペルミスは単なる「記述ミス」でしょうか、それとも「設計ミス」でしょうか?
それだけの情報しか与えられないのなら、私ならそれは記述ミスと判断する。
アホか、>>538 の皮肉が本当にもっともだと思ってるのか?
普及の方法や設計方法を考えれば、それが足りないために普及しなかった、
と結論づけることもできるだろ。
消えるのは構わんが、自分が始めた議論は責任を持って終わらせてから消えろ
0550デフォルトの名無しさん
2010/09/29(水) 23:19:03そもそも、関数型的な思考プロセスってどういうものですか
自分は Haskell が好きで、今はアルゴリズムデザインを勉強中ですが、
プログラムを組み立てている時に特に意識するのは、
引数に関数を適用して評価して戻り値を返すという順ではなく、
戻り値を引っ張ってくるために引数に関数を適用して評価するという順で考えることです。
でもこれは遅延評価という Haskell 特有のものなので、
関数型的な思考プロセスという枠で括るには狭すぎる考え方だと思います。
関数型的な思考プロセスって何なんですか?
0551デフォルトの名無しさん
2010/09/30(木) 00:00:21関数型言語を使うコミュニティでなぜかうまく会話が成立する考え方という意味。
具体的ではないし、分かりにくいのではあるけれど、例えば、考え方が共通の集団において
内容としては全然違うんだけれど、なぜか同じ考え方に属する概念だなと感じて
実際ちょっとがんばって理解してみようと思うとわかりやすいというような概念があると
思うんだ。
具体的区別の基準を超えてしまって、ある種のまとまりの中になぜかまとめてしまう。
考え方=思考プロセスというものはなぜかそういうことをしてしまうものなんだ、
という前提に自分は立っていて、その前提からの発言。
そういう意味で、自分は>>550の考え方は関数型的な思考プロセスだと感じる。
0552550
2010/09/30(木) 07:32:24でも、>>550 で例に挙げた「引数を引っ張ってくる」という考え方は、
たとえば OCaml や F# では通用しないんですけど・・・
(遅延評価のライブラリなどを使えば部分的には使えますがデフォでは違う)
0553デフォルトの名無しさん
2010/09/30(木) 13:02:42設計段階で決めつけてしまうのは非常に危険。
柔軟性のない設計は、ほんの少しのミスで破綻してしまう。
ただし、副作用が強いか弱いかとか、失敗する確率が高いか低いかのような
「雰囲気」を表現することは有用。
設計段階での「強い静的型付け」は普及しない。
設計で決められるのは「雰囲気」だけだ。
0554550
2010/09/30(木) 20:11:29「関数型言語を使うコミュニティでなぜかうまく会話が成立する考え方」の例を、
誰でもいいんですけど、いくつか挙げていただけないでしょうか。
それらの例を元にして、>>548 の
> 関数型的な人は実は”関数的な思考プロセス”
> を取ることができる対象であれば、別にプログラムでなくても充分満足できるのでは
> ないか、と思うんだ。
というのがどういう事か考えてみたい。
0555デフォルトの名無しさん
2010/09/30(木) 23:33:56たまたま自分が失念していた、自分がアホで知らなかった、という解釈をする傾向が
高いように感じる。(なぜか遡及して存在を認めてしまう)
なので、例をあげてもそうであるのかどうか多分分からないと思う。
というわけで、言えることは、そういうことがあるということに気をつけて物事に
接していると結構高い頻度でであえるはずだ、ぐらい。
0556デフォルトの名無しさん
2010/09/30(木) 23:43:31どうせ554にはいってもわからん。
0557デフォルトの名無しさん
2010/09/30(木) 23:58:53いい例が思いついた。人工知能。
Lsipと人工知能って一緒に語られることが多いけれど、あれってよくよく考えると
ギャップ大きすぎるよね。最初から人工知能を作ることが目的の人が必要に迫られて
Lispをやるから一緒に語られることが多いというのならわかるけれど、
どうも、Lispをやっていてなぜか人工知能に目覚めるという人が結構いるようだ。
なんでLispやってていきなり人工知能やろうってなるのよ?
0558550
2010/10/01(金) 00:19:24関数型的な思考プロセスとはそんな曖昧で捕らえどころのないものなのですか。
>>548 はそんなものを指して「ある程度承認される言明のはず」と言い、
関数型を押す人の内なるモチベーションをこれで説明し、
関数型的な人はプログラム以外でもこれを適用できる対象があれば満足、
などと持論を展開していたのですか。
Aを使ってBを論ずるのに、そのAがこれほど曖昧では、B対して誰も
「それは一理あるかも」とも「それはどうかな」とも言えなくないですか。
この場合 A(>>548 の言う「関数型的な思考プロセス」)は
はっきりした文章で定義できなくとも、少なくともいくつか事例を挙げて
認識を共有しないと、Bはちゃんと議論できないと思うのですけど・・・
0559デフォルトの名無しさん
2010/10/01(金) 00:45:57議論を基軸に考えすぎ。仮にその方向で話を展開していっても、大した結論でないよ。
0560550
2010/10/01(金) 07:28:27では議論するのは止めてもいいです。
ただ純粋に >>548 の言っていることをちゃんと理解したいだけなんです。
とにかく、関数型言語を好む人の「関数型的な思考プロセス」というのが
少なくとも自分にはあまりに漠然としすぎていて分からないため、
>>548 が言いたいことがほとんど理解できていない状況です。
0561デフォルトの名無しさん
2010/10/02(土) 11:58:39だから何って訳でもないケド
0562デフォルトの名無しさん
2010/10/03(日) 23:56:04ttp://raintown.org/lava/
こいつは化ける
0563デフォルトの名無しさん
2010/10/04(月) 00:52:460564デフォルトの名無しさん
2010/10/04(月) 00:59:20[fun of programming] (和訳:[関数プログラミングの楽しみ])
この本のトピックのひとつで Lava の考え方が学べる
0565デフォルトの名無しさん
2010/10/04(月) 01:30:440566デフォルトの名無しさん
2010/10/04(月) 01:58:15アプリ全体(GUI、入出力、ファイル処理、通信)を考えると
どうしても関数型言語でやるべきないようじゃなくなるのです。
0567デフォルトの名無しさん
2010/10/04(月) 07:58:250568デフォルトの名無しさん
2010/10/04(月) 08:30:06はげどう
私はパーサーコンビネーター、FRP、STM, Iterateeのような技には感動した
0569デフォルトの名無しさん
2010/10/04(月) 11:36:260570デフォルトの名無しさん
2010/10/04(月) 12:52:42同じく
というか、関数型に限らずたいていの言語は
「どうしてもその言語でやるべき」という状況は無いと思うが
>>566 には「使える箇所が小さい」という根拠を示してほしいな
0571デフォルトの名無しさん
2010/10/04(月) 13:31:30どうしてもという状況が無いなら、低コストの言語が選ばれる。
コストが高くなると、採算がとれる箇所は減る。
0572デフォルトの名無しさん
2010/10/04(月) 17:15:25副作用ダメゼターイ
みたいな先入観があるかな。
0573デフォルトの名無しさん
2010/10/04(月) 17:21:220574デフォルトの名無しさん
2010/10/04(月) 17:21:27それの延長上にあるんだよ
0575デフォルトの名無しさん
2010/10/04(月) 17:35:370576デフォルトの名無しさん
2010/10/04(月) 17:56:120577デフォルトの名無しさん
2010/10/04(月) 18:15:46関数型の方がコストが高いのは、>>565 の
「使える素養を持った人が少ない」からだよな
なんかニワタマループに陥るな
0578デフォルトの名無しさん
2010/10/04(月) 18:17:05OOぐらいできるよ
0579デフォルトの名無しさん
2010/10/04(月) 20:04:09副作用は、引数と戻り値の型を無視するバックドアだから型理論を台無しにする
OOは、クラスとメソッドの名前だけ決めて型は後で考えるという設計もできるので
副作用があっても平気なのだ
0580デフォルトの名無しさん
2010/10/04(月) 21:10:27上手ーくやれば何とかならんでも無いかも
生成時点から状態が変わらないオブジェクトなら関係ないしな
…まあコンストラクタがかなりカオスなことになりそうだがw
0581デフォルトの名無しさん
2010/10/04(月) 22:37:55>「使える素養を持った人が少ない」からだよな
明らかに自惚れ。使える素養を持った人は山ほどいるだろ。
物理系でもCSの他分野でも応用数学でも、優秀なやつはいくらでもいる。
そしてそういう優秀な奴らは、HaskellだのLispだの、
わざわざ小難しいマニアックな道具なぞ選択しない。そんな馬鹿じゃない。
手続き型だと圧倒的に難しいというアプリがあるわけでもないし、
その状況でわざわざ小難しい道具を選択すること自体、
なんていうか、筋が悪い。
0582デフォルトの名無しさん
2010/10/04(月) 22:51:49>そしてそういう優秀な奴らは、HaskellだのLispだの、
>わざわざ小難しいマニアックな道具なぞ選択しない。そんな馬鹿じゃない。
ダウト
0583デフォルトの名無しさん
2010/10/05(火) 07:18:02君は使える素養を持ってないから、
わざわざ小難しい道具と感じてしまうんだよ
0584デフォルトの名無しさん
2010/10/05(火) 11:06:18わざわざ注意が必要なもの使わずに関数型でやったほうが楽なものが多数あるんだが。
0585デフォルトの名無しさん
2010/10/05(火) 11:36:10手続き型「だけ」関数型「だけ」で書くという発想こそ、たいへん筋が悪い
0586デフォルトの名無しさん
2010/10/05(火) 11:53:51安全のためには「純粋」関数型「だけ」でないとダメという事だろう
個人的には、何が安全で何が危険かを自分の頭で考えず
えらい人に定義してもらうやり方は嫌いだ
そういうことをすると、頭の中がコンプライアンス不況になる
0587デフォルトの名無しさん
2010/10/05(火) 12:12:41自分の頭で考えていないと思う根拠は?
お前はただの先入観でそう思っているだけじゃないのか?
0588デフォルトの名無しさん
2010/10/05(火) 13:07:17型や参照透明性のレベルで議論できる安全性なんて、JavaやC#の
ちょっとした書き方の工夫で簡単に達成できるだろ。。。
いつまでもそのようなプリミティブなレベルに拘泥してるから、
プロダクト開発者たちと議論がかみ合わない。
0589デフォルトの名無しさん
2010/10/05(火) 13:15:36示してから言えw
0590デフォルトの名無しさん
2010/10/05(火) 13:21:590591デフォルトの名無しさん
2010/10/05(火) 13:26:52考えるなら人と違うことを考えないと意味ないから
0592デフォルトの名無しさん
2010/10/05(火) 13:28:46人と違うことを考えるだけではまったく意味が無い
その考えが他の人にも広く採用されるようになって初めて意味がある。
0593デフォルトの名無しさん
2010/10/05(火) 13:57:31そーだねーオブジェクト指向とか関数型とかもCで書き方工夫すれば出来るもんねー
じゃぁ速そうだから全部Cで書けばいいんじゃない?
0594デフォルトの名無しさん
2010/10/05(火) 15:28:15単にできるできないじゃなくてね。
だから、たとえばHaskellのSTMのような安全性を、簡単に達成できるちょっとした
書き方の工夫を、どうやればいいのかぜひ示してほしいんだけど。
0595デフォルトの名無しさん
2010/10/05(火) 16:09:210596デフォルトの名無しさん
2010/10/05(火) 16:34:27main::IO ()
がミソ。
遅延評価だからmain関数がIOモナドをいきなり世界に返すことで実行開始。
実行開始してから必要な評価が行われる。
0597デフォルトの名無しさん
2010/10/05(火) 16:35:470598デフォルトの名無しさん
2010/10/05(火) 18:14:05そりゃ教え方が悪いんだよ
講師がいるのか書籍なのか知らんが
遅延評価の方が遙かに直感的だ
0599デフォルトの名無しさん
2010/10/05(火) 18:49:33遅延評価を理解しようと思ったらクロージャの実装について理解しなきゃいけない。
完全に理解するためには一度遅延評価機構を実装してみないと難しいぞ。
0600デフォルトの名無しさん
2010/10/05(火) 19:05:02C++のテンプレートは全く逆だ
ダックタイピング+コンパイル時にすべて評価される
0601デフォルトの名無しさん
2010/10/05(火) 19:09:33「完全に」理解する必要なんて無いよ
>>597 は「プログラミング初心者がC言語のポインタを理解する」
のと比較してるんだから
プログラミング初心者が入門書なんかを読んで、
ポインタで何ができるのか、どうやってできるのか、
そういう基礎を学ぶことと比較してるんだよ
「その程度」の遅延評価を理解を得るのに
同じような程度にポインタを理解するよりも感覚的に難しいというのなら、
それは教え方が悪いとしか言いようがない
0602デフォルトの名無しさん
2010/10/05(火) 19:16:110603デフォルトの名無しさん
2010/10/05(火) 19:17:21文系なら使い方だけちゃちゃっと覚えるんだろうけどさ。
0604デフォルトの名無しさん
2010/10/05(火) 19:22:43だから何だというんだ?
反論であるならば、最後まできっちりと喋りきってくれ
まさか、プログラミング初心者が学ぶための入門書に
載っているレベルのメモリ構造やハードウェア諸概念が、
>>599 の言うクロージャの実装と同レベルなんて言わないでしょうね
0605デフォルトの名無しさん
2010/10/05(火) 19:32:54・ヒープ領域に確保するということ
・間接参照の概念
・ポインタ演算の意味
これくらい分かっとけば大体使えるだろ。
0606デフォルトの名無しさん
2010/10/05(火) 19:44:13そうだよ
「これくらい分かっとけば大体使えるだろ」
これがプログラミング「初心者」の理解するC言語のポインタだよ
だから「これくらい分かっとけば大体使えるだろ」という程度に遅延評価を理解するのも、
本来それほど難しいものではないと言っている
(この程度の理解なら)むしろ遅延評価の方が直感的ですらある
難しさで比較するなら、どちらも同じ程度で比較しなきゃ比較の意味が無い
そして >>597 の提示した理解度はプログラミング初心者のそれ
なのに、なぜか遅延評価の方だけより深く理解する難しさで比較したがる輩がいる
0607デフォルトの名無しさん
2010/10/05(火) 19:45:11例えばNintendoDSではヒープとスタックでそれぞれ速度が10倍違うメモリを使っていて
パフォーマンスを追求するにはハードウェアの仕組みについても理解しなきゃいけないんだよ。
ポインタを利用するということはどこからどうやってデータを入出力するかってことで、
効率との戦いなんだ。
0608デフォルトの名無しさん
2010/10/05(火) 19:45:59すまん、言葉が足らんな
> 難しさで比較するなら、どちらも同じ程度で比較しなきゃ比較の意味が無い
難しさで比較するなら、どちらも同じ程度の理解度で比較しなきゃ比較の意味が無い
0609デフォルトの名無しさん
2010/10/05(火) 19:46:50毎度おなじみ「使える」のレベルの違いでもめているね。
終わらない論争になるから、早いところ落とし前付けてね。
0610デフォルトの名無しさん
2010/10/05(火) 19:55:38今回の「使える」のレベルはそれほど曖昧ではないだろ
>>597 がプログラミング初心者と言っている以上、
プログラミング初心者が入門書程度のプログラムを実行した時に
その動きが予測できる程度が、今回の「使える」だろ
そして >>597 によれば、C言語ならポインタを使ったプログラムだ
なら、遅延評価も同程度の「使える」で判断すればいいのではないか
プログラミング初心者が「使う」ということに関して、
これ以上に理にかなった解釈があればぜひ提示して欲しい
0611デフォルトの名無しさん
2010/10/05(火) 20:00:410612デフォルトの名無しさん
2010/10/05(火) 20:07:23それは「理解」の程度によるよ
使い方に関して低い程度の理解でよければ、
仕組みを理解しなくても問題ない
たとえば emacs の仕組みを理解してなくても、
ファイルを開き、テキストを編集し、保存する
という程度の使い方を理解できている人は大勢いるしね
0613デフォルトの名無しさん
2010/10/05(火) 20:30:26責任取る気がないなら、もっと自由な言語を使わせてあげればいいのに
0614デフォルトの名無しさん
2010/10/05(火) 21:00:07必要なときに評価されてます、程度の認識と
あとは無限リストとかの扱い方を覚えれば大丈夫じゃないか?
ポインタは未だによく解らない、というか
C言語のポインタが解りにく過ぎると思う
Delphiにもポインタ自体はあるが、悩んだ記憶ないんだがなあ
0615デフォルトの名無しさん
2010/10/05(火) 21:07:28CPUの構造を勉強すれば直ぐわかるよ。
0616デフォルトの名無しさん
2010/10/05(火) 21:07:530617デフォルトの名無しさん
2010/10/05(火) 21:16:23introduction to functional programming using haskellの後半の章とか
0618デフォルトの名無しさん
2010/10/05(火) 21:24:340619デフォルトの名無しさん
2010/10/05(火) 21:25:370620デフォルトの名無しさん
2010/10/05(火) 21:28:25どうもです。
>introduction to functional programming using haskellの後半の章とか
これは7章のとこでしょうか?
0621デフォルトの名無しさん
2010/10/05(火) 21:39:320622デフォルトの名無しさん
2010/10/05(火) 21:43:33こことかここの最後のReferenceから辿れるページの方が詳しいかと
0623デフォルトの名無しさん
2010/10/05(火) 21:49:18ありがとうございます、読んでみます。
0624デフォルトの名無しさん
2010/10/05(火) 23:00:34なんだ、ポインタ程度も理解できずに議論してたのか
まだ遅延評価は早いんじゃない?
0625デフォルトの名無しさん
2010/10/05(火) 23:01:22小飼弾w
http://blog.livedoor.jp/dankogai/archives/50996734.html
0626デフォルトの名無しさん
2010/10/05(火) 23:23:29書こうと思えば関数型言語風に書くことが可能。
オブジェクト指向言語で関数型言語風に
コードを書くことはできるが、関数型言語で
オブジェクト指向風にコードをかけない。
そんなことできないのが関数型言語というものだから。
できることが、
オブジェクト指向言語 > 関数型言語
なので関数型言語は普及しない。
0627デフォルトの名無しさん
2010/10/05(火) 23:36:310628デフォルトの名無しさん
2010/10/05(火) 23:43:37マルチコアマルチCPU環境下でスケールするための有効な手法、
っていうことで皆騒いてるんだと思ったけど
スケールした実例があるかは知らん
0629デフォルトの名無しさん
2010/10/05(火) 23:55:33あ、マジマジ。
例えば関数型のforと同じように動くfor関数を
作ることができる。オブジェクト指向では。
でも関数型で、オブジェクト指向のforのような
動きをするものは作れない。
0630デフォルトの名無しさん
2010/10/06(水) 00:17:170631デフォルトの名無しさん
2010/10/06(水) 00:31:590632デフォルトの名無しさん
2010/10/06(水) 00:44:570633デフォルトの名無しさん
2010/10/06(水) 00:47:35関数型言語風とはどのようなものだ?
生憎とそれらしいものを見たことがない、関数型のforの意味の分からんし
(C言語でもオブジェクト指向ができる、というレベルのものだったら話にならん)
C/C++ や Java、C# などで簡単なプログラムを書き、
その関数型言語風とやらを実演して見せてくれ
関数型言語の何をどのように真似て、どのような効果が得られたか、
文章で解説を添えてくれるとなお助かる
>>626 には無理だったら別の人でもいいが
0634デフォルトの名無しさん
2010/10/06(水) 03:01:02だからCでもOO指向モドキができると言い張る輩が存在する。
気の利いた言語ならライブラリレベルで実現できる。
しかし関数型は言語機能で見ると7割以上を占めるから、
他の言語では中々真似ができない。
例えばCではクロージャが作れなかったり、
末尾呼び出しをループの代わりにするなんて発想はできない。
0635デフォルトの名無しさん
2010/10/06(水) 03:19:24ループを無理やり再帰の形に直す意味が無いだけなんじゃ……
0636デフォルトの名無しさん
2010/10/06(水) 03:20:050637デフォルトの名無しさん
2010/10/06(水) 03:33:51まあ理解できないんだろうな
0638デフォルトの名無しさん
2010/10/06(水) 07:40:16簡単に最適化できるけどなw
あとHaskellだと末尾再帰だからといって効率が良いとは限らない。
ループのほうが可読性が高いと思ってる奴はFORTRANでも使ってろ。
0639デフォルトの名無しさん
2010/10/06(水) 10:08:36>>626
0640デフォルトの名無しさん
2010/10/06(水) 10:49:00高階関数と再帰はどちらが可読性が高いですか?
0641デフォルトの名無しさん
2010/10/06(水) 11:00:25状況に依って使い分けてる。
Lisp だけど、返り値を使いたいときは map 系使って、返り値に興味ないときはループ。
0642デフォルトの名無しさん
2010/10/06(水) 11:59:22え、限らないんだw
どういうことなの・・・
0643デフォルトの名無しさん
2010/10/06(水) 12:49:16ttp://d.hatena.ne.jp/kazu-yamamoto/20091122/1258899591
0644デフォルトの名無しさん
2010/10/06(水) 13:00:510645デフォルトの名無しさん
2010/10/06(水) 13:22:27それだけは判った
0646デフォルトの名無しさん
2010/10/06(水) 13:25:43末尾再帰でもヒープを消費することがあるってのは事実だけど、
それを言ったらCのwhileだってループ内でmallocすればどんどんメモリを使う
それから、末尾再帰でリストを先頭から構築したいときは、(:)で末尾から逆順で構築していって、
最後にreverseするのが常套手段
だから>>643の(++)を使った例は恣意的
0647デフォルトの名無しさん
2010/10/06(水) 13:28:59アセンブリとかVMとかへのコードの出力を考えた時に、
何が起きてるのか予想ができない。
つまりデバッグできるんかいそれ!
0648デフォルトの名無しさん
2010/10/06(水) 13:31:26モナドらへん?それってモナドデバックしてるのとちゃうんかい!
0649デフォルトの名無しさん
2010/10/06(水) 13:33:59おまえらほんんんとに判ってんのか?
0650デフォルトの名無しさん
2010/10/06(水) 13:34:34評価順序がどうでもいいってことは、自分の好きな順序で評価されると思って良いってことだよ
具体的な評価順を知りたければ必要呼び(call by need)を調べればいい
ただしコンパイラが最適化のために勝手に評価順を変えることはある
>>648
ghciでステップ実行すると、部分式を評価し始めるたびに止まる
0651デフォルトの名無しさん
2010/10/06(水) 13:41:29それで非正格ユーザーは納得してんのか?
なんでこんなとこで止まるねん、こいつおかしいで!とかないの?
0652デフォルトの名無しさん
2010/10/06(水) 13:44:41> 非正格だと評価順序が関係なくなるのは理解できるんだが
ダウト
0653デフォルトの名無しさん
2010/10/06(水) 13:46:22もうええわ
0654デフォルトの名無しさん
2010/10/06(水) 13:46:37どういう順序で評価しても結果は変わらないから問題ない
(もちろん、非正格な関数は非正格に振る舞うようにしないといけない
遅延評価なら計算できる式を無限ループさせてしまうような評価順は駄目だし、そういうことをするコンパイラは欠陥品)
0655デフォルトの名無しさん
2010/10/06(水) 13:51:350656デフォルトの名無しさん
2010/10/06(水) 13:56:080657デフォルトの名無しさん
2010/10/06(水) 13:57:500658デフォルトの名無しさん
2010/10/06(水) 13:58:41「評価順序が決まってなくても、決まった順序で入出力できる」ための仕組みがIOモナド
>>656
そりゃそうだ
遅延評価は評価順序の一つ
Haskellは非正格な言語で、非正格性を保つ限り評価順序は自由であり、遅延評価をベースとした処理系が多い
0659デフォルトの名無しさん
2010/10/06(水) 13:59:10(p 1) (p 2) (p 3)を
((p 1) (p 2)) (p3)とやっても
(p 1) ((p 2) (p 3))とやっても
どちらもプリントするっていうアクションが返されて(評価時にプリントされるわけではないので)
それをプリントするため、どちらも同じ表示結果になる
この順番を制御してるのはIOモナド
0660デフォルトの名無しさん
2010/10/06(水) 14:00:110661デフォルトの名無しさん
2010/10/06(水) 14:01:35つまり、副作用がないので入力が同じなら常に出力も同じになることが保証されているから
同じ入力が来たときに評価をすっ飛ばして以前の結果だけを返すこともある。
だから常に関数の中身が評価されるとは限らない。
0662デフォルトの名無しさん
2010/10/06(水) 14:03:57その手続き型言語のコードでバグがあったら、手続き型言語の手順でバグ取りします
つまりhaskellは手続き型言語です
0663デフォルトの名無しさん
2010/10/06(水) 14:05:03main関数が返すIOモナドの内包順だよ。
不正確な俺のイメージで表現すると、
玉ねぎのように何重もの皮に包まれていて、それをめくっていくように評価される。
最初にmain関数が返すIOモナドは一番外側の皮しか見えないが、
評価されるたびに中身の皮が作られていく、イメージw
0664デフォルトの名無しさん
2010/10/06(水) 14:05:46リストを先頭から食べながら、先頭から返してくように書かないと、
「逆順で構築していって、最後にreverse」は無限リストに使えないし。
0665デフォルトの名無しさん
2010/10/06(水) 14:06:43やらないか
0666659
2010/10/06(水) 14:09:45モナドってのは数学的には、結合法則と単位元があるもの
>>659の説明は、まんま結合法則が成り立つよっていうことを言ってる
単位元ってのは(x+単位元)がxと同じになるってこと
IOモナドでいえば、
モナドを使わない世界で何も無いデータを表示することと、
IOの世界で何も表示されないってことが同じってこと
IOモナドによって副作用がないとかよく言われるけど、あれって、モナドのおかげって言うよりも
IO処理が第一級の値になってるから、だと思うんだよね
違ったら教えてください詳しい人
0667デフォルトの名無しさん
2010/10/06(水) 14:10:39無限リストに使えないのはその通り
それを承知の上で末尾再帰で書きたいケースもある
IOモナドの中とか
いずれにしても(++)はひどい、と言いたかっただけ
0668デフォルトの名無しさん
2010/10/06(水) 14:14:57>IO処理が第一級の値になってるから、だと思うんだよね
これよ!
これの説明でなんか判りそうな気がする!
もうちょい詳しく!単位元とか判らん!
0669デフォルトの名無しさん
2010/10/06(水) 14:15:42そもそも関数型言語がさっぱりなので入門にいい言語教えて。
0670デフォルトの名無しさん
2010/10/06(水) 14:16:44IO aという型があって、それを作るためにreturn、(>>=)、putStr、exitWithなどなどの関数が用意されているというのがポイント
IO型についてはこれがおすすめ
ttp://web.archive.org/web/20080202180610/www.ice.nuie.nagoya-u.ac.jp/~h003149b/lang/haskell_io.html
0671デフォルトの名無しさん
2010/10/06(水) 14:18:41単に「モナド」と言われても判らんのよ。普通はモナカのお菓子の仲間か何かですか?
って思うわけじゃん?
0672デフォルトの名無しさん
2010/10/06(水) 14:20:090673デフォルトの名無しさん
2010/10/06(水) 14:21:27IOという名前の抽象データ型があって、それを操作するAPIは…のように考えるといい
0674デフォルトの名無しさん
2010/10/06(水) 14:23:050675デフォルトの名無しさん
2010/10/06(水) 14:23:06ちゃんと日本語に訳すればよかったんだよ
次元波動超弦励起縮退半径跳躍重力波超光速航法みたいな
0676デフォルトの名無しさん
2010/10/06(水) 14:24:57ただ、実行しないから副作用じゃないもんキャンペーン中は副作用がありません
0677659
2010/10/06(水) 14:27:10とりあえずの理解の仕方としては、何かをプリントする、みたいなIO処理(副作用)がアクションに評価されて
アクションをくっつけるのに使ってるのが>>=や>>などのIOモナド的な記法
んで、Main関数は、そのくっつけられたアクションを受け取って実行する関数、みたいに思うと理解しやすいと思う
俗にHaskellではIOの実行をperformと言っていて、評価(evaluate)という用語とは分けて使ってる
0678659
2010/10/06(水) 14:34:51評価した結果はアクションで、これは好きな順番にくっつけたり、複製したり削除したり、まぁ好きに扱える
なので副作用がない。Mainに渡すと実際に副作用が起きる
0679デフォルトの名無しさん
2010/10/06(水) 15:06:20関数型言語がさっぱりなら尚更。
0680デフォルトの名無しさん
2010/10/06(水) 15:09:32でもラピュタ王並に読める!読めるぞ!
なんつーか、C++における例外機構みたいな、別の経路があるんだよね???
0681デフォルトの名無しさん
2010/10/06(水) 15:19:44そりゃもちろんSchemeでしょ。
そんでもって計算機プログラムの構造と解釈を教科書に勉強するのがセオリー。
0682デフォルトの名無しさん
2010/10/06(水) 15:37:18どうも。入門サイトで比較して見ようと思います。
0683デフォルトの名無しさん
2010/10/06(水) 15:47:01肥大化しすぎと言われるC++の仕様の1.4倍のページ数がある事実について。
0684デフォルトの名無しさん
2010/10/06(水) 15:58:320685デフォルトの名無しさん
2010/10/06(水) 16:01:580686デフォルトの名無しさん
2010/10/06(水) 17:03:070687デフォルトの名無しさん
2010/10/06(水) 17:09:510688デフォルトの名無しさん
2010/10/06(水) 17:10:40Cとperlとjavaだ。
0689デフォルトの名無しさん
2010/10/06(水) 17:14:330690デフォルトの名無しさん
2010/10/06(水) 18:44:040691デフォルトの名無しさん
2010/10/06(水) 18:50:28それが(PERLなりに)保守性の高いコードだとしても。
0692デフォルトの名無しさん
2010/10/06(水) 19:44:150693デフォルトの名無しさん
2010/10/06(水) 19:48:500694デフォルトの名無しさん
2010/10/07(木) 01:28:55haskellの話題に戻すが、
このスレできっちりモナドについて噛み砕いた説明ができれば認めてやろう
0695デフォルトの名無しさん
2010/10/07(木) 01:42:30Haskellにおけるモナドについてはもう語り尽くしただろ。
初心者にも分かりやすい説明もあればブログも本もあるからそっちを嫁
0696デフォルトの名無しさん
2010/10/07(木) 03:42:40せめてそういうこと言うならそれぞれリンクでも貼れよ
嫁、じゃねーよボケ
0697デフォルトの名無しさん
2010/10/07(木) 05:23:05対称性という観点からすると、
副作用のある手続きはMonadで書くよりもArrowで書いたほうが美しいと思うんだがどうか
0698デフォルトの名無しさん
2010/10/07(木) 05:28:06正気か?
ならMomadとArrowがどうチガウのか説明してみ?
0699デフォルトの名無しさん
2010/10/07(木) 05:42:43http://www.aya.or.jp/~takuo/arrow_for_2ch/arrow_for_2ch.pdf
美しいというのはコードが綺麗にかけるとかそういう事よりも、数学的対称性の美というか。
上のpdfの6〜7ページでもMonad、Arrowの両方でStateを実装しているけど、Arrowのほうが対称的っぽくない?
MonadはListやMaybeなどと形式を合わせるために歪な形に変形しているように見える。
0700デフォルトの名無しさん
2010/10/07(木) 20:10:22Monadの目的はストリームにフィルタをbindすること。
Arrowはフィルタだけを組み合わせる。
0701デフォルトの名無しさん
2010/10/07(木) 20:27:38やっぱStateArrowっぽい感じ(A×S→B×S)になんのかな
0702デフォルトの名無しさん
2010/10/07(木) 21:59:57モナドにしろアローにしろ肝心のことが書かれてない気がするんだよ
おれがいまだに理解できてないからな
0703デフォルトの名無しさん
2010/10/07(木) 22:03:08非正格言語でなぜ副作用を扱えるのか、
原理を説明して見せてくれないかな
0704デフォルトの名無しさん
2010/10/07(木) 22:06:33肝心のことって何?
0705デフォルトの名無しさん
2010/10/07(木) 22:07:02一般的な正格言語でも同じように参照透過性を維持しつつ副作用を組み込めないのか
実現できるとしたらどんな形か
辺りかなあ
0706デフォルトの名無しさん
2010/10/07(木) 22:09:26これは演算子の優先順位とかが無くて誤解が少ないからな
ちなみにSICPぐらいは読んでるから
0707デフォルトの名無しさん
2010/10/07(木) 22:28:59お前の理解のためになんで俺らがエネルギー使うの。
関数型言語すげーって言っとけばいいんだよ。
理解したいならブログとかHaskellスレの過去スレ読め。
0708デフォルトの名無しさん
2010/10/07(木) 22:29:48正格性と副作用は関係ないと思う
関数の引数が未定義ならばその関数の値も未定義であることを正格という
関数の中で、その関数の外の環境を変化させることを副作用という
0709デフォルトの名無しさん
2010/10/07(木) 22:41:15だからどこ読めば理解できるのか示せっての
自分で説明してみろ
>>708
だったらなんでML系でモナドやらアロー使わないんだよ
下手糞な用語説明なんか要らないの
0710デフォルトの名無しさん
2010/10/07(木) 22:47:35(define (putStrLn x) (lambda () (write x) (newline) #t))
(define m (putStrLn "Hello World"))
(define f (lambda (_) m))
(define main (>>= (>>= m f) f))
;;ここまで副作用なし
(main) ;;副作用あり
0711デフォルトの名無しさん
2010/10/07(木) 22:47:52; 何もせずにxを返すIO命令(副作用なし)
(define (io-return x) (lambda () x))
; IO命令aを実行し、結果vを得た後、IO命令(f v)を実行するIO命令(命令を作る手続き自体には副作用なし)
(define (io-bind a f) (lambda () ((f (a)))))
; 文字を読むIO命令
(define io-getchar (lambda () (read-char)))
; 文字cを書き、nilを返すIO命令(命令を作る手続き自体には副作用なし)
(define (io-putchar c) (lambda () (write-char c)))
; IO命令の実行(Haskellでは処理系が暗黙に行うが、Schemeはそれをしないので必要)
(define (run-io io) (io))
; 使用例
; 入力を一行読み、逆順に出力するIO命令(この定義自体に副作用はなし)
(define io-revline
(io-bind io-getchar
(lambda (c)
(if (eq? c #\Newline)
(io-return 'nil)
(io-bind io-revline
(lambda (_)
(io-putchar c)))))))
; io-revlineを実行した後改行するIO命令(定義に副作用なし)
(define haskell-main
(io-bind io-revline
(lambda (_)
(io-putchar #\Newline))))
; 実行(副作用あり)
(run-io haskell-main)
0712デフォルトの名無しさん
2010/10/07(木) 22:50:130713デフォルトの名無しさん
2010/10/07(木) 22:54:28こういうの待ってたのよ
あんがとね
何が違うのか考えてみるわ
0714デフォルトの名無しさん
2010/10/07(木) 23:07:55関数型言語はコメントと同じようにかけないんだ。
これが手続き型などなら、コメントを英語にしたのと
同じようにかけるが、関数型言語では
コメントとかけ離れたコードになる。
0715デフォルトの名無しさん
2010/10/07(木) 23:11:37Haskellだとbindが中置だしdo記法があるから、かなり手続き型っぽい見た目になるよ
あと、Haskell風IOをむりやりSchemeで実現している>>711を見て、関数型言語のスタイルをどうこう言うのは的外れだと思う
0716デフォルトの名無しさん
2010/10/07(木) 23:29:25だからHaskellの過去スレ読めって言ってんだろ。
ドコドコのどこを読めばいいかなんていちいち覚えてるわけ無いだろうが。
自分で調べろ。
お前が楽して勉強するために俺がめんどくさい事する理由なんてないね。
0717デフォルトの名無しさん
2010/10/07(木) 23:30:32最低限下地を揃えてから出直しな。
ここはお前が勉強するためのスレじゃないんだよ。
0718デフォルトの名無しさん
2010/10/08(金) 00:02:01おんなじことしか言えないアホはもうだまれ
お前らが普及しない理由だw
0719デフォルトの名無しさん
2010/10/08(金) 00:04:25・スレタイ読め
・過去スレを当たれ
・ググレカス
当たり前の2chの常識しか言ってないぞ。
これができないなら半年ROMれと言われる。
0720デフォルトの名無しさん
2010/10/08(金) 00:12:40これでも普及しない要因を探ってるつもりだよ?
話を戻すと、
要するに関数の評価が必要になる順番を利用しながら
副作用のパスを矛盾がないように構築して後で実行するってことね
ひとまず理解できましたよ?
0721デフォルトの名無しさん
2010/10/08(金) 00:21:20で、戻した話から導かれる「関数型言語が普及しない理由」とは何か?
探っている途中なら、考えの途中まででいいから説明してみてくれないか
0722デフォルトの名無しさん
2010/10/08(金) 00:22:470723デフォルトの名無しさん
2010/10/08(金) 00:26:34では Haskell で
printf "%3d" 1
0724デフォルトの名無しさん
2010/10/08(金) 00:39:37(format t "~3D" 1)
正直、どれも大差ないような
0725デフォルトの名無しさん
2010/10/08(金) 00:40:100726デフォルトの名無しさん
2010/10/08(金) 00:59:350727デフォルトの名無しさん
2010/10/08(金) 01:14:350728デフォルトの名無しさん
2010/10/08(金) 07:15:17Haskell は IO モナド内ならお前の大好きな printf デバッグができる
IO モナド内でなければ、そもそもお前の大好きな printf デバッグする必要がない
0729デフォルトの名無しさん
2010/10/08(金) 08:37:540730デフォルトの名無しさん
2010/10/08(金) 09:57:04伝統的にはmonadは単子と訳すがそれで分かりやすいか??
0731デフォルトの名無しさん
2010/10/08(金) 10:27:42串にささって単子、単子
0732デフォルトの名無しさん
2010/10/08(金) 10:34:380733デフォルトの名無しさん
2010/10/08(金) 13:24:510734デフォルトの名無しさん
2010/10/08(金) 13:51:28「モナド化する関数」(\a ->M b)をつなげていくことができるもの
だからな。すごく言語化しづらい。
フィルタそのもののArrowの方がまだ説明しやすいわ
0735デフォルトの名無しさん
2010/10/08(金) 14:06:39モナドの概念自体はMLどころかJavascriptとかでも作れる
http://d.hatena.ne.jp/m-hiyama/20060419/1145432492
普及しないのは、普通のプログラミング言語だと
副作用のある関数を簡単に作れるからじゃないかな。
そういう関数が途中に交じるとモナドの利点が台無しになってしまう。
あと今のままだと教えるのが面倒くさいし。
名前の問題もそうだけど、もっと理解しやすい形にしないといけないのかも。
0736デフォルトの名無しさん
2010/10/08(金) 14:16:47特にJavascript特有の言語機構を使ってないので大体の手続き型言語で再現できるはず
構造体っぽいのがないと厳しいかも知れんけど
0737デフォルトの名無しさん
2010/10/08(金) 14:43:07お前らの大嫌いな言語内言語を使えば、副作用が途中に交じらない。
SQL も正規表現もそうやって普及した。
0738デフォルトの名無しさん
2010/10/08(金) 14:46:33というか、モナドそのものが言語内言語を作る機構とも言えるよな
Persecとか
0739デフォルトの名無しさん
2010/10/08(金) 14:47:240740デフォルトの名無しさん
2010/10/08(金) 14:52:33言語内言語というのは何らかの解釈機構が必要だけど、
Parsecには解釈機構はない。
0741デフォルトの名無しさん
2010/10/08(金) 22:18:540742デフォルトの名無しさん
2010/10/08(金) 22:23:28Haskellには一応副作用がある関数を作る機能はあるし、
FFIを使えばC言語の副作用がある関数を呼ぶこともできるが、危険。
なぜなら、>>661がその理由。
複雑になるとどの関数がどの順番に呼ばれるか予想が難しい。
0743デフォルトの名無しさん
2010/10/08(金) 22:32:03camlも副作用ある関数はいくつもある。
0744デフォルトの名無しさん
2010/10/08(金) 22:40:17副作用がある関数が作れるのかってことですよ。
作れるのはわかりましたが、
もしかして作りにくいんですか?
0745デフォルトの名無しさん
2010/10/08(金) 22:44:22それとも入出力を伴う関数のこと?
前者は>>742が言うように危険。別に作りにくいということはない
後者はHaskellの初歩。日常的に作る
0746デフォルトの名無しさん
2010/10/08(金) 22:45:39OCamlやSchemeなら日常的に副作用のある関数を作る
0747デフォルトの名無しさん
2010/10/08(金) 22:46:58副作用を持つ関数も、
副作用を持たない関数も
同じように作れる、手続き型言語、オブジェクト指向言語
と、
副作用を持つ関数が危険な言語では
後者、つまり関数型言語が普及しないのは
当たり前でしょという話です。
0748デフォルトの名無しさん
2010/10/08(金) 22:50:16この二つに異る型を当てるか、同じ型として扱うかは一長一短の設計判断
Haskellは前者を選び、CやOCamlは後者を選んだ
0749デフォルトの名無しさん
2010/10/08(金) 23:01:18でも、>>747 の言う手続き型言語やオブジェクト指向言語は、
逆にその副作用の危険性を、入門を抜けた人でもあまり意識しないから、
それがバグを生んだりすることは多いんだよ
関数型は入門の時から強制的に意識させられて、
副作用の扱い方を基礎から自然と学ぶ
まぁ、だから関数型は面倒で普及できないというのには同意
0750デフォルトの名無しさん
2010/10/08(金) 23:01:36それは関数型言語だけでは?
0751デフォルトの名無しさん
2010/10/08(金) 23:02:51関数型言語でも、副作用の有る関数を使う以上、
バグは同じように生まれる。
0752デフォルトの名無しさん
2010/10/08(金) 23:04:26そんなことはないよ
例えばJavaScriptで、
var f = function (x) { return g(99) + x; };
を、
var _g = g(99);
var f = function (x) { return _g + x; };
に最適化して良いのは、gが副作用を持たない時だけ
0753デフォルトの名無しさん
2010/10/08(金) 23:05:150754デフォルトの名無しさん
2010/10/08(金) 23:06:03それはコンパイラ内部の話であって、
ユーザー(プログラム言語使用者)にとっては
関係ない話ですよね。
0755デフォルトの名無しさん
2010/10/08(金) 23:06:30ソースコード中のunsafeという文字列を検索すれば一瞬で突き止められる。
0756デフォルトの名無しさん
2010/10/08(金) 23:06:540757デフォルトの名無しさん
2010/10/08(金) 23:07:130758デフォルトの名無しさん
2010/10/08(金) 23:07:44自分で書けw
人に頼むな。
本当にわからないなら該当スレで質問しろ。
ここは素人が紛れ込んでいいスレじゃないんだよ。
0759デフォルトの名無しさん
2010/10/08(金) 23:08:16関数型言語とかreal worldにはあまり関係のない話しですよね
0760デフォルトの名無しさん
2010/10/08(金) 23:08:38なぜ書けといったのか理解できませんでしたか?
関数型言語が普及しないのは、
RDBMSを操作するコードを見れば分かるってことですよ。
0761デフォルトの名無しさん
2010/10/08(金) 23:09:39だったらお前が書け。
そしてコードの比較解説を自分でやれ。
やらないなら出てくるな。
0762デフォルトの名無しさん
2010/10/08(金) 23:10:070763デフォルトの名無しさん
2010/10/08(金) 23:13:24>だったらお前が書け。
お断りだね!
0764デフォルトの名無しさん
2010/10/08(金) 23:14:31副作用のあるコードばかり書かないといけなくなる。
そうなると、関数型言語を使っている意味が無くなる。
0765デフォルトの名無しさん
2010/10/08(金) 23:15:050766デフォルトの名無しさん
2010/10/08(金) 23:19:02HaskellDBのサンプルを探したけど消えてるっぽいのでGoogleキャッシュで
http://webcache.googleusercontent.com/search?q=cache:ryssnqUKVx8J:www.haskell.org/haskellDB/example.html+haskelldb+sample&cd=1&hl=ja&ct=clnk&gl=jp [+]
>>764
それは誤解
関数型言語の利点は便利な言語機能がたくさんあることであって、
副作用の隔離は比較的どうでもいい
0767デフォルトの名無しさん
2010/10/08(金) 23:19:25副作用とは関数の入出力以外の作用の事を言うんだよ。
純粋関数型言語では副作用なしにIOアクションを行う。
IOアクションは副作用ではないよ。
0768デフォルトの名無しさん
2010/10/08(金) 23:20:01グローバル変数の副作用は殆どの言語で意識されたが、
auto(死語)やprivateにすれば安全だというのが多数派の結論。
それに対し、まだ安全ではないと主張する少数派が関数型言語だな。
0769デフォルトの名無しさん
2010/10/08(金) 23:21:230770デフォルトの名無しさん
2010/10/08(金) 23:21:58>>749 では、普段から意識するかどうかの違いを言いたかった。
意識する事で、まずバグそのものが減る。
意識する事で、バグが出ても、どこでどのようなバグが出てるのか、
把握するまでの時間が比較的短くなる。
0771デフォルトの名無しさん
2010/10/08(金) 23:24:03IOアクションばかり使っていたら、
結局関数型言語を使う意味がなくなってしまう。
外部のサーバーとの通信やハードウェアへのアクセスなんか、
もろ関数の入出力以外の作用だしな。
0772デフォルトの名無しさん
2010/10/08(金) 23:24:17クラスメンバ関数内でクラスメンバ変数の値を変更するのも、副作用だよ。
0773デフォルトの名無しさん
2010/10/08(金) 23:26:05そりゃ意識すれば、どんな言語でもバグは減るでしょw
0774デフォルトの名無しさん
2010/10/08(金) 23:31:19グローバル変数に比べて副作用が小さくなればそれでいい
全か無かを考えるのは一部の人だけ
0775デフォルトの名無しさん
2010/10/08(金) 23:34:18関数型言語にとって、例外的な処理や危険な処理が
実用的なソフトでは主な処理だからなんだよな。
つまり実用的なものを作ろうとしたら、
関数型言語っぽくないコードになってしまう。
それなら関数型言語にする意味無いんじゃね?って話になる。
0776デフォルトの名無しさん
2010/10/08(金) 23:35:19それは当たり前。
意識する訓練を受ける時間が関数型の方が長いよね、という話。
>>749 では、手続き型では副作用の危険性を
入門を抜けた人でもあまり意識しないと言った。
少なくとも、副作用の危険性を解説した入門書は見たことがない。
一方関数型は、入門書で副作用が何かをちゃんと解説してるものが多い。
副作用を伴わない計算という特徴を紹介してるのだから当たり前。
手続き型よりも関数型の方が、意識する事に慣れさせられる。
0777デフォルトの名無しさん
2010/10/08(金) 23:36:13関数型言語の利点が殺されることもないって言ってるだろ
自分に都合の悪いレスを無視するのはやめようぜ
0778デフォルトの名無しさん
2010/10/08(金) 23:38:20世の中副作用が有る処理が主なんだから
どうしようもない。
教育用としてはいいんじゃね?
だけど実用的じゃないから
普及しない。
0779デフォルトの名無しさん
2010/10/08(金) 23:39:410780デフォルトの名無しさん
2010/10/08(金) 23:41:21簡単に消せないなら無理に消さなくてもいい
0781デフォルトの名無しさん
2010/10/08(金) 23:42:22関数型っぽく実用的なものを作るために、
FRP などの技術や Monad、Arrow などの仕組みがある。
あと、関数型言語にする意味は関数型っぽく書くことではないような気がする。
少なくとも Haskell でプログラムする意味のひとつは、
副作用を伴う部分と伴わない部分をしっかりと分けられる事だと思う。
手続き型でも分けられるが、Haskell の方が分け方が綺麗だ。
0782デフォルトの名無しさん
2010/10/08(金) 23:45:50副作用うんぬんはそれほど重要じゃない
0783デフォルトの名無しさん
2010/10/08(金) 23:48:50確かに、しっかりと分けることは良いことだ
マジで頼むからlazyな部分とeagerな部分をしっかりと分けてくれ
0784デフォルトの名無しさん
2010/10/09(土) 00:25:38FRPとか使ったとして、副作用を分離して(゚д゚)ウマーとなるのとめんどくささとでTotalではどっちが勝ちますか?
OCamlぐらいが実用的なアプリには調度良い?
0785デフォルトの名無しさん
2010/10/09(土) 02:47:01そろそろ視点を変えやるか
関数型はどれもこれもGC必須なんだよ
だから普及云々以前に使われない
ランタイムは必然的に大きくなる
機能とかは最低限あればどうでもいい
シンプルに書けて速度が出てバイナリが小さい事
そしてGCがないこと
これを満たした関数型が出てくれば変わるかもしれない
0786デフォルトの名無しさん
2010/10/09(土) 02:55:59Java なり .Net 製のアプリとか普通に見かけるよね?
むしろ GC ありじゃないと使用者も少なくなるだろ。
0787デフォルトの名無しさん
2010/10/09(土) 03:26:10大いに関係あるんだよ
JavaやC#は高々1言語の問題だが、
関数型を選ぶということはGCを外せない、
GCを使わないという選択自体がまるで無理という事
これはもう関数型の欠陥と言っていいだろうねえ
0788デフォルトの名無しさん
2010/10/09(土) 05:27:19そう言う場面は限られているので、普及しない理由とは無関係だと思う。
0789デフォルトの名無しさん
2010/10/09(土) 08:08:220790デフォルトの名無しさん
2010/10/09(土) 08:12:33コンパイルが通るとまず間違いなく動くのは
確かに新鮮な驚きと感動だったけどさ……
0791デフォルトの名無しさん
2010/10/09(土) 09:09:10バグの危険性を意識する訓練が足りないようだな。
0792デフォルトの名無しさん
2010/10/09(土) 09:35:380793デフォルトの名無しさん
2010/10/09(土) 11:25:340794デフォルトの名無しさん
2010/10/09(土) 12:36:06現実世界をモデリングするときは、オブジェクト指向が適している。
それだけの話。
0795デフォルトの名無しさん
2010/10/09(土) 12:40:00何かをするに当たって法則よりも手順を決めることが多いから
手続き型が直感的だと思う人が多いのだろう。
0796デフォルトの名無しさん
2010/10/09(土) 12:43:28力学的なシミュレーションとかそういう話?
0797デフォルトの名無しさん
2010/10/09(土) 13:14:113Dゲームの世界とか。
空があって地面があって木があって人がいてとかそんなの。
他にも電子メールソフトであつかうメールがどういう実態であるかとか、
Officeソフトのファイル形式とか
画像ソフトのフォーマット形式とか
そういう物体的なもの。
0798デフォルトの名無しさん
2010/10/09(土) 13:17:20これをオブジェクト指向で作ろうとしたら、
携帯電話クラスがあって、液晶クラスを内包していて、
キー入力クラスがあって、イヤホン端子があってとか
オブジェクト指向なら素直に表現できるが、
これが関数型言語だと難しい。
0799デフォルトの名無しさん
2010/10/09(土) 13:21:30"いかに人間が楽をできるか"ってのが一番重要なんじゃないの?
どっちもどっちなら関係ないけど。
0800デフォルトの名無しさん
2010/10/09(土) 13:23:253Dゲームは良く知らないけどオブジェクト指向の得意分野っぽいね
メール、Office、画像フォーマットについてはオブジェクト指向が適しているようには思えないな
良くて関数型言語と同程度じゃないか
0801デフォルトの名無しさん
2010/10/09(土) 13:26:16上のほうにリストがあって、下にプレビューがあって。
そういう構成のソフトを作るときには
結局オブジェクト指向の方が得意だねってことになるんだよ。
0802デフォルトの名無しさん
2010/10/09(土) 13:34:12キー入力関数があって, その入力を処理した結果が, 宛先振り分け関数にわたって,
その一部が液晶制御関数にわたって...
同じじゃん
0803デフォルトの名無しさん
2010/10/09(土) 13:39:52うん。だから
外枠の全体的なものを構成するものはオブジェクト指向で
関数はその中の一処理を担当するのがいいんだよ。
で、ものづくりをするとき、一処理だけで終わるなんてのはまず無く
製品として全体的な部分(GUIなど)がどうしても必要になるから、
一部分しか作れない(作りにくい)関数型言語は普及しないということになる。
0804デフォルトの名無しさん
2010/10/09(土) 13:42:580805デフォルトの名無しさん
2010/10/09(土) 13:44:31外界を分離するわけだが、確かにそうすれば
関数型言語の世界はそれでうまくいくだろう。
だけど、実際問題、外界はどうしても必要なわけで、
その外界を関数型言語でどうやってプログラミングするわけ?
これが関数型言語の限界なわけ。
0806デフォルトの名無しさん
2010/10/09(土) 13:45:57じゃあ、関数型言語だけで ”実装された” GUIライブラリがあるわけ?
関数型言語で呼び出すんじゃない。GUIライブラリ側の実装の話。
0807デフォルトの名無しさん
2010/10/09(土) 13:47:53関数型にも普通に GUI ライブラリがあって、
何も問題なく GUI (MVC の V と C の部分)を構築できる。
一部分しか作れない(作りにくい)関数型言語というのは、
単に GUI が問題なくできることを知らなかっただけなのでは?
もしそうであるなら、「知らない」という事が普及しない理由にならないか?
0808デフォルトの名無しさん
2010/10/09(土) 13:48:39何言語で作られているのか?
0809デフォルトの名無しさん
2010/10/09(土) 13:53:13たとえば Haskell だと、
今のところ広く使われているのは、OS の API を呼ぶ部分は C 言語。
その上のマルチプラットフォーム用のインターフェースはたぶん C 言語。
その上に Haskell を被せている。
しかし、Haskell は OS の API を呼べるから、
直接 Haskell で基盤の部分を構築することもできる。
それをしないのは、マルチプラットフォームで動かすのに適していないから。
0810デフォルトの名無しさん
2010/10/09(土) 13:56:45それぞれgtk(C)とwxWidgets(C++)のHaskellバインディング
>>805
外界とやりとりするためのIOモナドじゃないか
0811デフォルトの名無しさん
2010/10/09(土) 13:56:59直接 Haskell で基盤の部分を構築することもできが
マルチプラットフォームで動かすのに適していないからしない。
そのせいで普及もしない。
0812デフォルトの名無しさん
2010/10/09(土) 13:58:56そんなんじゃなくて、生産管理みたいな巨大なモデルだろう。
0813デフォルトの名無しさん
2010/10/09(土) 13:59:11> 外界とやりとりするためのIOモナドじゃないか
だからやりとりはできるだろうが、
外界そのものだって作らないといけないんだよ。
外界は作りにくいから、モナドを使って
他の言語に任せた!じゃいけないでしょ。
0814デフォルトの名無しさん
2010/10/09(土) 14:02:39自前で作るよりC/C++から借りてこられるならその方が良い
クロスプラットフォームが必要ないなら直接winAPIやxlibを呼んでもいい
xmonadなんかはそうしてる
0815デフォルトの名無しさん
2010/10/09(土) 14:04:07もしかして、意味をはき違えている?
マルチプラットフォームで動かすのに適していというのは、
Haskell で Windows の API を直接呼ぶプログラムを書いてしまうと、
Linux などの他のプラットフォームとソース互換性が取れないでしょ。
移植するのにソースを大幅に改変しないといけないから面倒。
だから、基盤の部分の上にインターフェースを被せる。
Java の GUI ライブラリが直接 OS の API を呼ばないのと一緒だよ。
あと、そもそも OS の API が C 言語から呼ばれることを前提として作られているのだから、
その上に各言語のインターフェースを被せるのはしょうがないよ。
Python や Ruby だって C 言語で書かれた GUI ライブラリの上に、
自身の言語のインターフェースを被せてるよね。
普及しない理由としては的外れだと思うよ。
0816デフォルトの名無しさん
2010/10/09(土) 14:05:25外界を作るってどういう意味?
外界とやりとり出来るってのはOSのAPIを呼べるってことであって、
他の言語で出来る事は基本的になんでもできるんだが
0817デフォルトの名無しさん
2010/10/09(土) 14:24:33外界ってのは、状態を持ったオブジェクトのことだよ。
0818デフォルトの名無しさん
2010/10/09(土) 14:31:52それなら、関数型言語が状態を持ったオブジェクトを作れない/作りにくいってのは誤解
状態を持ったオブジェクトを必要以上に作らないようなスタイルが推奨されるけど、あくまで推奨
0819デフォルトの名無しさん
2010/10/09(土) 14:33:41Haskell ならステートモナドや IORef などを使えば、
状態を持ったオブジェクトを作ることができるよ。
おそらく、それでは関数型らしくないから、結局手続き型みたいになって、
手続き型の方が有利だよね、だから普及しないんだよ、
と言いたいのだと勝手に解釈してみた。
でも、ステートモナドや IORef などの状態を伝播させる仕組みを、
何かアプリを作る Haskell プログラマが直接扱うことは多くないよ。
そういった仕組みは Haskell で作られたもう一段上のライブラリの中に隠されてる。
それを使う Haskell プログラマは十分関数型っぽく書けるんだよ。
0820デフォルトの名無しさん
2010/10/09(土) 15:17:19haskellなら、外界に影響を及ぼすような状態オブジェクトならIORefやIOArrayを使えるし、
外界に影響を及ぼさないならSTモナド中でSTRefやSTArrayの中身をガリガリ更新しながら使えばいい
後者の場合、中では副作用の嵐であっても外からは純粋な関数として扱えるという利点がある
0821デフォルトの名無しさん
2010/10/09(土) 15:41:54ちげーよw
外界っていうのはIOで分けれた内と外という意味の外のほうだよ
0822デフォルトの名無しさん
2010/10/09(土) 15:43:07下品な庶民には使いこなせなくて当然だ。
0823デフォルトの名無しさん
2010/10/09(土) 15:44:29使いこなす必要はないよ
窓の杜なんかでフリーアプリを公開してる連中だって、
C/C++ や C#、Java なんかを使いこなしてるとは思えん
0824デフォルトの名無しさん
2010/10/09(土) 20:32:230825デフォルトの名無しさん
2010/10/09(土) 20:33:31使いこなしてるからアプリが作れるんだろw
0826デフォルトの名無しさん
2010/10/09(土) 21:23:19それ以上のことは、わからない。
0827デフォルトの名無しさん
2010/10/09(土) 22:33:46関数型言語がほしいな。
0828デフォルトの名無しさん
2010/10/09(土) 22:36:23Haskellを使っててオブジェクト指向機能が欲しくなったことが一度もないので、
どういうときに便利なのか興味がある
0829デフォルトの名無しさん
2010/10/09(土) 22:39:010830デフォルトの名無しさん
2010/10/09(土) 23:04:080831デフォルトの名無しさん
2010/10/09(土) 23:17:51関数型言語としての機能を持った
オブジェクト指向言語が普及する。
0832デフォルトの名無しさん
2010/10/09(土) 23:42:53これから・・・?
0833デフォルトの名無しさん
2010/10/09(土) 23:57:59プロセス指向に置き換わる。
0834デフォルトの名無しさん
2010/10/10(日) 00:37:390835デフォルトの名無しさん
2010/10/10(日) 00:42:550836デフォルトの名無しさん
2010/10/10(日) 01:26:21関数型が広まったとしても、手続き型もオブジェクト志向も生きてるだろうな
そうなると終着点は関数的に使える手続き型OOPLや
続き的な処理も書ける関数型OOPLになるんじゃね
0837デフォルトの名無しさん
2010/10/10(日) 01:43:550838デフォルトの名無しさん
2010/10/10(日) 02:15:00言語としては何も変わってない。
0839デフォルトの名無しさん
2010/10/10(日) 02:45:08は?w
お前プロセス指向とオブジェクト指向の違うも理解してないの?w
0840デフォルトの名無しさん
2010/10/10(日) 06:27:27「プロセス指向」なんて
言葉を使われてもねぇ。
2ちゃんねるでもお前ぐらいしか
言ってないだろw
0841デフォルトの名無しさん
2010/10/10(日) 09:53:18手続き型言語の世界では設計時に何に注目するかによって
手続き指向、データ指向、オブジェクト指向に分かれます。
>>837は正しいですが>>838は間違いです。
0842デフォルトの名無しさん
2010/10/10(日) 09:55:14こういうことじゃないかな、違う?
・オブジェクト指向
目的を実現させるために協力する必要がある個々の要素の間の関係に注目し、
それをプログラム構造に反映させる手法。
主に役割でモジュールを分ける。
・プロセス指向
目的を実現させるために必要な機能やデータの流れに注目し、
それをプログラム構造に反映させる手法。
主に機能でモジュールを分ける。
>>833 の言う根拠は不明だけど
0843デフォルトの名無しさん
2010/10/10(日) 10:23:39その解説だとプロセス指向のやってることってまんま関数型の得意分野の気がするんだが..
0844デフォルトの名無しさん
2010/10/10(日) 10:55:40違うよ。
オブジェクト指向と比較した場合のプロセス指向はマネジメントの言葉ではなくて、
技術的な言葉ですよ。
プロセス指向とは:
オブジェクトを実体的なプロセス(OSが提供するプロセスに非ず。あるいはグリーンスレッド。)
によって表現し、すべてのオブジェクト=プロセスを並列に計算する。
メッセージパッシングはサイズが決まったキューを通す。
この方法のメリットは
・マルチスレッドでもデッドロック/ライブロックが起こらない
・意識しなくともマルチコアを有効利用できる
・CSPやパイ計算などの理論的背景を持つので矛盾がない
・オブジェクト指向の設計技法を利用出来る
・関数型言語と親和性が高い
0845デフォルトの名無しさん
2010/10/10(日) 10:57:480846デフォルトの名無しさん
2010/10/10(日) 10:57:590847デフォルトの名無しさん
2010/10/10(日) 11:04:29アクターモデル CSP pi-calculus
どれもよく似ているから、これらに基づいたプログラミングをプロセス指向プログラミングと呼ぶんですよ。
確かerlangの英語版リファレンスにこの言葉が出てきたと思う。
0848デフォルトの名無しさん
2010/10/10(日) 11:17:38なるほど、そういうことか。
確かに関数型に合いそうだ。
その説明でキーワードが分かって色々調べるきっかけにはなったから良いけど、
それってオブジェクト指向と「比較」した場合のプロセス指向の説明なの?
自分でオブジェクト指向の設計技法を利用出来るって言ってるじゃん。
同列で比較できるものではないような気がするんだが
0849デフォルトの名無しさん
2010/10/10(日) 11:19:21利用出来るよ。
詳しくは俺の博士論文を。
0850デフォルトの名無しさん
2010/10/10(日) 11:22:58その博士論文へのリンクを貼ってくれないと読めないです
0851デフォルトの名無しさん
2010/10/10(日) 11:26:19恥ずかしいので自分で探してください
0852デフォルトの名無しさん
2010/10/10(日) 11:29:57論文の公開を恥ずかしがる人間の心理が全く分からないですが、
ここにリンクを提示できない理由があるのなら仕方がありませんね。
探してみますので、タイトルなど何かそれと分かるキーワードは無いでしょうか
0853デフォルトの名無しさん
2010/10/10(日) 11:32:010854デフォルトの名無しさん
2010/10/10(日) 11:36:29じゃあ2ちゃんに来るなよ
はずかしいやつだな
0855デフォルトの名無しさん
2010/10/10(日) 11:36:34では、論文のありかも示さないまま
>>849 で「詳しくは俺の博士論文を」と言った理由は?
少し矛盾してませんか
>>849 なんて初めから言わなければいいと思うのですが
0856デフォルトの名無しさん
2010/10/10(日) 11:38:19その間の葛藤ってところかな。
0857デフォルトの名無しさん
2010/10/10(日) 11:47:14大人のくせに、博士のくせに
0858デフォルトの名無しさん
2010/10/10(日) 11:52:09あるのは年齢に関係ない知識と経験の差だけ。
0859デフォルトの名無しさん
2010/10/10(日) 14:41:200860デフォルトの名無しさん
2010/10/10(日) 15:04:200861デフォルトの名無しさん
2010/10/10(日) 16:17:27共存する。
使う場所が異なるから。
野球チームの監督ができれば、
システムを組めるようになる。
選手の動作は、オブジェクト指向で定義して
選手同士の相互作用、すなわち
並列的なルール、ロジックはプロセス指向で組めるようになる。
0862デフォルトの名無しさん
2010/10/10(日) 16:39:38ってなったらごちゃごちゃして分けわかんなくなったりしない?
0863デフォルトの名無しさん
2010/10/10(日) 16:45:32使う場所は同じだろ。
全く同じ場所で使える。
オブジェクト指向はプロセス指向で置き換えられるが、
プロセス指向はオブジェクト指向で置き換えようとすると設計変更が必要になる。
0864デフォルトの名無しさん
2010/10/10(日) 16:46:19プロセス指向があればオブジェクト指向は要らない。
0865デフォルトの名無しさん
2010/10/10(日) 17:27:330866デフォルトの名無しさん
2010/10/10(日) 18:57:23その中に手続き型、関数型、プロセス指向が
含まれるって感じ。
一番外のオブジェクト指向を使わないで
中だけ使う方法もあるが、ほかシステムとの連携なんかを
考えるとオブジェクト指向でラッピングしたほうがいい。
0867デフォルトの名無しさん
2010/10/10(日) 20:06:41どう考えても逆だろ。
オブジェクト指向で組まれたシステムは一つのプロセスの中で動かしたほうが良い。
0868デフォルトの名無しさん
2010/10/10(日) 21:09:20感じとか、常識とかじゃなくって、
もっと論理的に話してくれ
0869デフォルトの名無しさん
2010/10/10(日) 22:22:25プロセス思考だとか言ってるのはただの一学生の妄想話。
0870デフォルトの名無しさん
2010/10/10(日) 22:48:20いや、process-orientedでググッてみろよ。
論文とかでこの言葉を使ってる人は結構いるぞ。
0871デフォルトの名無しさん
2010/10/10(日) 23:37:02なんだよ。
まあ、プロセスは、while(1)の無限ループつくって、そのなかでメッセージを
うけとる。システムで共有するqueueをつかってな。コンカレントキュー。
そのメッセージをプロセスがもってる状態遷移マシン、つまり
デザインパターンでいうステートにわたして適切な処理をする。
んで、プロセスとか、メッセージとかキューとかステートっていうのは
オブジェクトで作ると便利かな、っていう程度でオブジェクト指向をとりいれればいい。
0872デフォルトの名無しさん
2010/10/11(月) 00:07:11完全に独立した処理単位さえあれば不完全なオブジェクトなどいらんw
0873デフォルトの名無しさん
2010/10/11(月) 00:22:03不完全なものを組み立てるというところにも技術が出てくる。そのための工学。
オブジェクトはオブジェクトで必要なわけで、関数型がその領域に入り込む
余地があるかどうかというところが問題だ。
0874デフォルトの名無しさん
2010/10/11(月) 00:32:47しかし、オブジェクトはすべて独立していて、
メソッド呼び出しによって内部の状態(フィールド)を書き換えるわけだろ?
問題はあるオブジェクトを処理中に別のオブジェクトの時間は完全にストップしていることで、
本来のオブジェクトの在り様とはは少し違うってことだね。
よりオブジェクトらしいオブジェクトをつくろうと思ったらプロセスになるんだよ。
0875デフォルトの名無しさん
2010/10/11(月) 00:38:43Erlangで全部のインスタンスに1つのプロセスを割り当てるようにしてみたところ、
さすがに耐え難いパフォーマンスになったという報告が読んだことがあるような
粒度として、オブジェクト指向のオブジェクトは小さすぎるのだろう
0876デフォルトの名無しさん
2010/10/11(月) 00:39:58読みたいからソースおしえて
0877875
2010/10/11(月) 00:41:46どこで読んだんだ……?
0878デフォルトの名無しさん
2010/10/11(月) 00:46:32さすがにリバーシをプロセス指向で設計する時に
StoneオブジェクトやPointオブジェクトを
そのままプロセスで実現しようとは思うまいw
もちろんそんな細かいオブジェクトもプロセスで表現可能だが、
やっぱりそこは考えなきゃいけないところだよねw
0879デフォルトの名無しさん
2010/10/11(月) 00:53:14細かい系のオブジェクトは作らなくて済むよね
0880デフォルトの名無しさん
2010/10/11(月) 01:09:49プロセス = フォンノイマンアーキテクチャ
0881デフォルトの名無しさん
2010/10/11(月) 01:21:04権威ある人の論文や記事を出して、
こういうことだとズバッと言えばすむ事ではないのか
0882デフォルトの名無しさん
2010/10/11(月) 01:28:360883デフォルトの名無しさん
2010/10/11(月) 01:35:26そうなると虎の威でも何でもないと困ると思うが
0884デフォルトの名無しさん
2010/10/11(月) 01:35:590885デフォルトの名無しさん
2010/10/11(月) 01:37:07ここの連中の数行しかない書き捨て文よりは、
論文の方がはるかに分かりやすくて信用できるとは思わんか
0886デフォルトの名無しさん
2010/10/11(月) 01:43:30そこまで厳密性を求めていないでしょ。
0887デフォルトの名無しさん
2010/10/11(月) 01:49:03昔、一部の人がエージェント指向をもてはやした事がありました。
あなたと同じ言い方でこうも言えます。
「プロセス指向は要らないよw
サーバから完全に独立したエージェントさえあれば不完全なプロセスなどいらんw」
オブジェクト指向は大規模ソフトウェア開発というニーズに答えて普及しましたが、
エージェント指向はソフトウェア業界にニーズがなく普及しませんでした。
プロセス指向もそれで解決できるニーズがないと普及しないと思うんですが、
プロセス指向はいったい何を解決できるのですか?
0888デフォルトの名無しさん
2010/10/11(月) 02:02:59えっと、エージェント指向ってセルラオートマトンの一種を利用したプログラミングじゃなかったけな。
エージェント指向でぐぐったらITProの記事が出てきたけど、
ここに書いてあることって全部嘘っぱちだよね。
0889デフォルトの名無しさん
2010/10/11(月) 02:10:29言葉が作られた時点ですでに普及していたんだよ。
ネットワークを介していろんなアプリケーションサーバが連携しあうのは、
今では普通のコトでしょ。
0890デフォルトの名無しさん
2010/10/11(月) 09:03:590891デフォルトの名無しさん
2010/10/11(月) 09:09:33自分の頭にあることのほうが正しいと思いたがる動物の性を
まざまざと見せつけられましたw
0892デフォルトの名無しさん
2010/10/11(月) 09:39:36話を噛み合わせるのは無理だ。というより、手法のすり合わせをするのは無理だ。
各個人ごとに思い入れのある手法やら現在研究している手法だかがあるわけで、
それを放棄しろといってるようなもんじゃん。
するべきは、どういう手法をとるかということじゃなくて、手法はなんでもいいけど
どういう方針でやっていくべきなのかを考えるべきだ。
0893デフォルトの名無しさん
2010/10/11(月) 10:28:22現実にあるシステムを
そのままの形でコンピュータ化するのが
一番分かりやすい。
目で見た物に対して、○○オブジェクトと
するだけで、コンピュータ化するときの
名前そのものになるオブジェクト指向が一番分かりやすいのさ。
0894デフォルトの名無しさん
2010/10/11(月) 10:32:45今ならDCIか
そういやDCIはScalaと相性がいいらしいな
0895デフォルトの名無しさん
2010/10/11(月) 10:46:43MVCがVVVになるな
0896デフォルトの名無しさん
2010/10/11(月) 10:58:54いや、かみ合わないとまずのではと思ってるのは互いの独自の手法ではなくて、
現在の話の文脈内における「オブジェクト指向に対してプロセス指向って何なの?」の事。
その根幹の部分が、関数型は何故普及しないのかという
会話をしている人間の中でちゃんと噛み合ってないと、
そのプロセス指向を知らなかったから普及しないのか、
プロセス指向が関数型に合わないから普及しないのか、
プロセス指向は合うけどそれを補うオブジェクト指向が合わないのか、
という話に一向に進まないよ。
現に、関数型の普及という話からは遠ざかってるじゃん。
だから、権威ある人の論文なり記事なりを出して、
とりあえずこの文脈の中だけでも「結局プロセス指向って何」を
仮定しておいた方が会話がより健全な方向へ進むと思うんだ。
(ここでグダグダ言い合うよりもね)
なんなら別に権威はなくても、、
審査をちゃんと通った博士論文でも良い。
0897デフォルトの名無しさん
2010/10/11(月) 11:02:420898デフォルトの名無しさん
2010/10/11(月) 11:34:58情報を「そのまま」送ると、クラスもオブジェクトもないoctet-streamになる。
「そのまま」では満足できない奴らがオブジェクトを発明した。
0899デフォルトの名無しさん
2010/10/11(月) 11:56:370900デフォルトの名無しさん
2010/10/11(月) 12:01:45エンドユーザーまたはドメインのエキスパートの認識を忠実にマッピングしてそれをベースにするのが
よさげってのがDCIのD
ただし、この認識が不変であるものじゃないと色々大変なことになる
だから初期のヒアリングが重要なわけね
0901デフォルトの名無しさん
2010/10/11(月) 12:06:46だから、そのオブジェクト指向でのオブジェクトが
現実とはかけ離れたものだと言ってるんだよ。
あるオブジェクトにメッセージを送って帰ってくるまでの間、
他のオブジェクトはただじっとしているだけって不自然でしょ?
普通に考えてみなよ。
AさんとBさんが会話している間、Cさんはおとなしくしているわけがないでしょ?
それぞれ独立して計算しないとオブジェクトとは言えないでしょうが。
より独立性の高いオブジェクトがプロセスなんだよ。
0902デフォルトの名無しさん
2010/10/11(月) 12:22:36AさんとBさんが会話している間、
Cさんはおとなしくしてもらってかまわないんだが、
人間が何かしているはずだからって
Cさんにも何かさせるのか?
CPUの無駄遣いじゃね?w
0903デフォルトの名無しさん
2010/10/11(月) 12:25:11すべて1スレッドとして生成すればいいだけ。
これもまたオブジェクト指向で実現可能なこと。
こういうのは、パターンと呼ばれる。
プロセス指向ってのは新たな言語とかオブジェクト指向を
置き換えるものではなく、ただのオブジェクト指向の
パターンの一つでしかない。
0904デフォルトの名無しさん
2010/10/11(月) 12:26:29Aさんはマネジャ、Bさんは販売員、Cさんは造花職人
だったとしたら?
オブジェクト指向だったら
AさんがBさんに造花を売るように指示を出している間、Cさんは造花づくりをサボる。
AさんがCさんに造花を作るように指示を出している間、Bさんは店をほっぽり出すわけだ。
0905デフォルトの名無しさん
2010/10/11(月) 12:28:57それじゃあもう既にオブジェクト指向とは呼べないねw
メッセージパッシングする相手が送りたい直接のオブジェクトじゃないんだから。
0906デフォルトの名無しさん
2010/10/11(月) 12:31:58ようなスタイルは屁理屈オブジェクト指向と呼ぼうw
0907デフォルトの名無しさん
2010/10/11(月) 12:36:07至極単純。
オブジェクト指向で並列パターンを設計する必要など無い。
0908デフォルトの名無しさん
2010/10/11(月) 12:41:28Cさんは自分の仕事をするだけだろ。
仕事がなくなったら誰かが会話にくるまでおとなしく待っている。
その間はCPU時間を使わない。
0909475
2010/10/11(月) 13:00:27>>550
関数型という概念の特徴を一言で言えば「宣言的(declarative)かつ作用的(applicative)」です。
宣言的とは、物事を静的な関連として表現することを意味し、暗黙的な(時間の経過を含む)状態の変化を考慮しません。
宣言的ではない概念の代表が「手続き型(あるいは手順型、命令型)」であり、状態を変化させる命令の反復で表現します。
宣言的な概念には、関数型の他にも論理型や代数型などがあります。
宣言的な概念の一つである論理型は、物事の対象物(集合)の間にある関連を命題(言明)で表現します。
関数型は、関連のサブクラスである関数(写像)によって物事を表現し、関数に対象物を作用(適用)させる事が特徴的です。
次に例を示します。まず階乗(n!)のアルゴリズムを考えます。たとえば「x := 0; for i := 1 to n; x := x * n」と
「f(n) ::= if n = 0 then 1 else n * f(n - 1)」を比較して、直感的に後者の方が分かり易いと感じたなら、その人は
関数型的な思考プロセスの持ち主だといえるでしょう。
更に、関数型的な思考プロセスにもその抽象化レベルに差異(段位)があります。低レベルから高レベルへ列挙してみます。
・入門級:再帰関数による反復の抽象化(上で示した階乗計算)
・初級: map/filterといった高階関数を利用した列構造処理の抽象化
・中級: 無限リスト(あるいは遅延リスト)を利用したストリーム指向/データフロー指向
・上級: モナド/アローを利用した関数代数指向(圏論の応用)
・達人級:モナド/アローに変わる新しい概念を考案/設計できるプログラム代数/プログラム変換指向
この段位は、私の勝手な解釈ですので、異論/反論は大いに認めます。
ちなみに>>844が言うところの「プロセス指向」は、この関数型的思考プロセス段位であれば「中級」に相当します。
0910デフォルトの名無しさん
2010/10/11(月) 13:03:35というか、両者はそもそも相反する要素なのか?
0911デフォルトの名無しさん
2010/10/11(月) 13:07:53メッセージの方式が違うだけ。
キューに入れるか関数を呼ぶか。
純粋関数型言語だったら、キューは副作用があるから関数を使うべきだろうな。
0912デフォルトの名無しさん
2010/10/11(月) 13:10:06オブジェクト指向にとってのスレッドって抽象化レベルでの異物だろ?
スレッドを扱うためには手続き的なロック/アンロック機構を使ってアトミック性を保障しなきゃいけない。
まずその段階でデッドロック/ライブロックの可能性に頭を悩ませながら、バグと戦わなければならない。
しかも並列化はオブジェクト指向にとっての異物だから、
それを扱うために設計レベル/実装レベルともに余計な複雑さが混入する。
プロセス指向ではそういった心配事から開放される上に、
メッセージパッシングによる本来の意味でのオブジェクト指向的な抽象化を実践することができるんだよ。
これを従来のオブジェクト指向に対してプロセス指向と呼ぶ。
0913デフォルトの名無しさん
2010/10/11(月) 13:10:55スレッドセーフなキューの実装は存在するよ。
0914デフォルトの名無しさん
2010/10/11(月) 13:11:48スレッドセーフでIOのないキューの実装は存在するよ。
0915デフォルトの名無しさん
2010/10/11(月) 13:14:15> オブジェクト指向にとってのスレッドって抽象化レベルでの異物
> 並列化はオブジェクト指向にとっての異物
それって「非プロセス指向にとってのスレッド」の間違いじゃないの?
ロック/アンロック機構が云々ってのもOOPに限った話じゃない。
要は「プロセス指向でないもの」に共通の話じゃないか。何故OOPと対比する?
0916デフォルトの名無しさん
2010/10/11(月) 13:15:22並列化を考慮している抽象化技法は他にいくつもあるよ。
プロセス指向だけじゃない。
0917デフォルトの名無しさん
2010/10/11(月) 13:17:350918デフォルトの名無しさん
2010/10/11(月) 13:17:53そうすると尚更「OOPvsプロセス指向」の話でなくなってしまうんだけど。
0919デフォルトの名無しさん
2010/10/11(月) 13:21:50一体お前らは何の話をしているんだ?
関数型言語はなぜ普及しないのかを議論しているんじゃなかったのか?
0920デフォルトの名無しさん
2010/10/11(月) 13:22:330921デフォルトの名無しさん
2010/10/11(月) 13:26:50> アクターモデル
アクターモデルはパラダイムではなくて理論。
プロセス指向を説明する理論はアクターモデルだけじゃなくて、
pi-calculusなどもあるし、ホーアのCSPもある。
他にもいろいろあるね。
0922デフォルトの名無しさん
2010/10/11(月) 13:31:52「すべてはオブジェクトである」と言っているオブジェクト指向パラダイムと
「すべてはアクターである」と言っているプロセス指向パラダイムとでは、
相容れないことは明白だよねw
0923デフォルトの名無しさん
2010/10/11(月) 13:36:41メッセージキューの重要性と、キューには副作用があるのかどうかについての話
OOPは、メソッド≒関数という立場を取っているために巻き添えを食らった
0924デフォルトの名無しさん
2010/10/11(月) 13:38:10XX指向って言ってる奴にかぎって, 数式与えてもまともなものが上がってこない
現実に付いては………
0925475
2010/10/11(月) 13:38:53「あらゆる並行プログラミング言語はプロセス指向である」と言い切ったのと同一人物なんだろね。
以下は「Erlang Part2」スレ#74からの引用
>> また、CSPを基礎理論とするOccamやGHC(KL1)等も
>> プロセス指向言語と呼んだほうが正しい分類なのか?
>
>そうだよ。
かなり思い込みの激しい性格らしい(自称:博士さん?)から、このレスに絶句したよ。
プロセス指向について議論を続けるなら、その前に「Erlang Part2」スレの#61-83を一読することを勧める。>>all
0926デフォルトの名無しさん
2010/10/11(月) 13:42:14これがでるとは思わなかった
過疎板は一味違うなー
0927475
2010/10/11(月) 13:49:33元祖「Erlang」スレ(dat落ち)の#839にカキコした内容をコピペしておく。
>まず、一般的なプログラミング言語と比較すると、Erlangのスレッドは粒度が非常に小さい、
>言い換えると、スレッド生成やスレッド間通信のコストが極端に低いということを理解してくれ。
>普通の言語が関数(あるいは手続きやメソッドと言い換えてもいい)を呼び出すのと同じ感覚で、
>Erlangではスレッドが生成する。つまり、関数呼び出しとスレッド生成が(Erlang)では等価になる。
>
>次に、質問にあったTreeやListといったデータ構造を、Erlangではどのように処理するのか?という点。
>ちょうどWikipediaのErlangのページにListをQuickSortする処理が紹介されているから、それを嫁。
>あるListを受け付けたErlangスレッドのQuickSort処理内容を、以下に解説する。
>
>(1) そのListの先頭要素について、ある値(Pivot)より大きい部分Listと小さい部分Listに分割し、
>(2) それらを処理する2個の子スレッドを生成して、それら部分リストを渡し、
>(3) 子スレッドの処理結果(ソートされた2個の部分List)と値(Pivot)を結合して、それを処理結果として返す。
>
>普通のプログラミングでは関数呼び出しの箇所が、Erlangではスレッド生成に置き換えられていることが
>分かってくれるだろうか。Tree処理も同じだ。Treeの各ノードを辿りながら、そのノードに対応する
>子スレッドを次々に生成し、それら子スレッドの「協調計算」の最終結果がTree全体の処理結果になる。
>
>逐次言語に後付けでスレッド機構を組み込んだ、一般的なプログラミング言語に慣れた多くの人にとって、
>このような協調計算型プログラミングモデルの認知には、発想の転換が求められるよ。
>Erlangプログラマには、資源の排他制御などという原始的な仕掛けは見えないし、見る必要性が無い。
>プログラマは本質の平行処理・分散処理(=協調型計算)のアルゴリズム設計に集中できる。
>>878
StoneオブジェクトもErlang等ならプロセス(スレッド)で実現される。Pointオブジェクトは微妙だけど(w
0928デフォルトの名無しさん
2010/10/11(月) 14:01:08でも実際のところ、OOPLでOOを徹底してる言語って少ないし
関数型でも純粋なものとそうでないものもあるワケだから
そこら辺うまく折衷してやれば相容れないってほどでも無いんじゃないか?
0929デフォルトの名無しさん
2010/10/11(月) 14:17:04ま、こういうのはたいてい嘘w
ただし、○○の場合はって例外事項が出てくる。
0930475
2010/10/11(月) 14:20:22もちろん個人的な見解だけど、Haskell流のモナドやアローの概念って、
普通の(手続き型言語思考に染まった)プログラマには理解不能だと思う。
おそらく、既存のモナドやアローを使った関数型プログラミングはできるようにはなるだろう。
でも、(彼らが)自分で直面した問題/課題に対して、独自のモナド/アローを新規に考案/設計できるか?となると
大いに疑問が残る。はっきり言って、圏論の概念を(直感的/感覚的でもいいから)理解していないと無理だと思う。
だから、このままじゃあHaskellが一般のプログラマに普及するのは絶望的である、と悲観視している。
もちろん、理解できるヤシだけが使えればいいという「選民指向」な発想もありだとは思うがね....。
それに対して、能動的なアクター(or オブジェクト)とそれらの間のストリーム(or データフロー)で
システムの振る舞いをイメージできる、(>>844が言うところの)「プロセス指向」は、
関数型的思考プロセス段位であれば「中級」に相当するレベルだから(>>909)、
一般のプログラマにも普及する見込みがあるのでは?と考える。
0931デフォルトの名無しさん
2010/10/11(月) 14:41:22> でも、(彼らが)自分で直面した問題/課題に対して、独自のモナド/アローを新規に考案/設計できるか?となると
> 大いに疑問が残る。はっきり言って、圏論の概念を(直感的/感覚的でもいいから)理解していないと無理だと思う。
> だから、このままじゃあHaskellが一般のプログラマに普及するのは絶望的である、と悲観視している。
「独自の」モナド/アローを新規に考案/設計しなければ解決できない問題とは、
たとえばどんなものが挙げられる?
俺は、一般のプログラマがそういうものに出会う機会はそれほど多くないと思う。
まぁ「一般のプログラマ」の定義にもよるが、たとえば趣味でゲームを作ってる奴、
会社内で事務系ツールやアプリを作ってる奴らは、そういうものに出会うかな?
Yampa を使って FPS を作る例(The Yampa Arcade)がある。
独自にモナド/アローを新規に考案/設計しなくても、
既存の Yampa を使ってこれくらいのことは出来る。
0932デフォルトの名無しさん
2010/10/11(月) 14:46:51間違えた
誤 The Yampa Arcade
正 The University of New South Wales School of Computer Science and Engineering
0933デフォルトの名無しさん
2010/10/11(月) 14:49:50> もちろん個人的な見解だけど、Haskell流のモナドやアローの概念って、
> 普通の(手続き型言語思考に染まった)プログラマには理解不能だと思う。
逆もまた然り
0934デフォルトの名無しさん
2010/10/11(月) 14:54:59とりあえず数学的用語を使わずにモナドを説明したもので理解できるかどうかが鍵になると思われ
0935475
2010/10/11(月) 15:03:13確かに、事務系アプリやゲームアプリの開発環境って、ほぼ部品(コンポーネント)がそろっているから、
それらを(VB系ならDrag&Drop操作だけで)組み合わせることで、大半は用が済むんだよね。
問題は、そのような現実世界の開発現場で利用できるモナド/アローが(現時点では)整備されていない点。
自分もモナド/アローと格闘中の段階だから、Yampaとか詳しく知らないけど、それって
開発現場で即利用できるパッケージ(たとえば帳票印刷パッケージとかバーコード表示コンポーネント等)ではなく、
(UNIX C であれば yacc&lex とかに相当するような)もっと低レベルな仕組みではないのかな?
0936デフォルトの名無しさん
2010/10/11(月) 15:07:57あれらはそれこそプログラムではない領域のため。
0937475
2010/10/11(月) 15:16:03たとえば、Erlangのような(>>844が言うところの)「プロセス指向」であれば、
>>927 にカキコしたように、自分でも他人に(おそらく分かり易い)説明ができるんだ。
でも、Haskellスレは常時ROMしていて、たびたび「モナド/アローを分かり易く説明してくれ」という
要望は見かけるんだけど、まともなレスは皆無に近い。(「Arrowの紹介 for 2ch」は希有な存在)
おそらく、まだ誰も(他人に自分の言葉で簡潔に説明できるほど)理解してるヤシはいないんじゃないかと想像w
0938デフォルトの名無しさん
2010/10/11(月) 15:17:49教義化させようとするのはまずい。また閉じた世界にするのか?
0939デフォルトの名無しさん
2010/10/11(月) 15:20:04モナドは結合ができるファンクタって感覚
使う上の理解じゃその程度で十分、つうかその程度の理解で使える設計のライブラリじゃねぇと誰も使えない
0940デフォルトの名無しさん
2010/10/11(月) 15:20:59Yampa はアローを使用した FRP のひとつだ。
昔の FRP ではリークが起きるという問題/課題に直面し、
それを解決するために新規に考案/設計されたアロー(の応用)だ。
(それだけを解決するために作られた訳ではないが)
言いたかったのは、自分で作るひとはごく僅かで、
大半の人はその技術をライブラリという形で利用するということ。
現時点では整備が「まだ足りない」というのは同意。
しかし、君の考え
「圏論の概念を理解できないからHaskellが一般のプログラマに普及するのは絶望的」
というのは疑問だ。
> 問題は、そのような現実世界の開発現場で利用できるモナド/アローが(現時点では)整備されていない点。
という反論の仕方では、整備されれば「モナド/アローを深く理解しなくても」
普及できるかも知れないと言っているように聞こえるぞ。
0941475
2010/10/11(月) 15:25:14えーと、>>935で書いた帳票印刷パッケージとかバーコード表示コンポーネントのような
事務系パッケージって、そのパッケージ開発ベンダにとってはプログラミングそのものなんです。
で、そういったパッケージ開発ベンダってのは大企業から中小企業まで現実に存在してるわけで、
そんな彼らは難しい概念を正確に理解しないとパッケージなんて設計できないはずですよ。
過去のオブジェクト指向の普及であれば、まだ手続き型言語思考の延長でしたからなんとかなったけど、
モナドやアローの設計ってそうはいかない(一から勉強し直し)のではないでしょうか?
0942デフォルトの名無しさん
2010/10/11(月) 15:30:53実際に動くものを作ったことある?
って質問したくなる奴がいるな。
0943475
2010/10/11(月) 15:35:06>という反論の仕方では、整備されれば「モナド/アローを深く理解しなくても」
>普及できるかも知れないと言っているように聞こえるぞ。
>>935の冒頭で書いたように、業務パッケージが整備されればHaskellも普及すると思うよ。
でも、整備が終わるのは(今から数えて)10年以上は必要になるんじゃないかと。
スレタイを「Haskellは何故【今普及していない】のかを考える」、あるいは
「Haskellは【今後数年のうちに普及するようになる】かを考える」と解釈すれば、NO だと考える。
もし「Haskellは【未来には(10年以上先の世界では)普及している】かを考える」であれば、もちろん YES。
Haskell以外の関数型言語(たとえば F# や SMLなど)であれば、また話は変わるけどね。
0944デフォルトの名無しさん
2010/10/11(月) 15:36:16猫オブジェクトをどうやって表現するの?
猫、鳴く、にゃーにゃー。
猫、名前、タマ
みたいなの。
0945デフォルトの名無しさん
2010/10/11(月) 15:37:340946デフォルトの名無しさん
2010/10/11(月) 15:41:43言葉がなぜこういう風に分けられているのかを考えると、
こういう風に分けるのが理解しやすいからではないのだろうか?
関数型って全部動詞でしょ?
0947デフォルトの名無しさん
2010/10/11(月) 15:43:18get_name(cat) => tama
みたいな。少なくともHaskellにはある
0948475
2010/10/11(月) 15:51:55ところがぎっちょん、>>909で書いたけど、純粋な関数型言語は時間の概念が無いから、
get_nameから戻るとタマの存在は消えてしまうんだよね。"tama" という名前は残るけど。
だから、Haskellの場合だと、ステートモナドを使ってタマの存在が継続することを表現しなきゃならない。
ここでもモナド・モナド・モナド・モナド・モナド・モナド・モナド........。
0949デフォルトの名無しさん
2010/10/11(月) 15:54:060950デフォルトの名無しさん
2010/10/11(月) 15:54:08> そんな彼らは難しい概念を正確に理解しないとパッケージなんて設計できないはずですよ。
いや、それほど正確に理解しなくても作れる。
圏論の概念など直感的/感覚的にすら理解できなくても作れる。
IO モナドをどう使えば何が出来るか、何が出来ないか、
Arrow を使えばどう記述しやすくなるか、ならないか、
それを知っていれば作れる。
逆に訊くが、バーコード表示コンポーネントに
圏論の概念の何が必要か挙げてくれ。
0951デフォルトの名無しさん
2010/10/11(月) 16:00:03perl製
use threads;
use Thread::Queue;
my $q = Thread::Queue->new;
my $th = neko($q);
$q->enqueue({command=>'namae'});
$q->enqueue({command=>'nake'});
$q->enqueue({command=>'sine'});
$th->join;
sub neko {
my $q = shift or die $!;
return threads->new(sub {
while (1) {
my $message = $q->dequeue();
if ($$message{command} eq 'namae') {
print "タマ\n";
} elsif ($$message{command} eq 'nake') {
print "にゃーにゃー\n";
} elsif ($$message{command} eq 'sine') {
print "ぎゃーーーーー\n";
last;
}
}
});
}
0952デフォルトの名無しさん
2010/10/11(月) 16:05:380953デフォルトの名無しさん
2010/10/11(月) 16:07:28packageをクラスに見立ててオブジェクト指向は実現できるよ。
0954デフォルトの名無しさん
2010/10/11(月) 16:08:23それ、nakeと命令したら、にゃーにゃーと言って、
sineと命令したら、ぎゃーと言って、
namaeと言ったら、タマと言う猫になってるよw
人語を話す猫はちょっと想定外w
0955デフォルトの名無しさん
2010/10/11(月) 16:09:04あぁ、Perlだからオブジェクト指向の例だったのね。
0956デフォルトの名無しさん
2010/10/11(月) 16:15:22オブジェクト指向版
my $cat = neko->new;
$cat->namae;
$cat->nake;
$cat->sine;
package neko;
sub new {
my $self = shift or die $!;
my $hash = { namae => 'タマ' };
return bless $hash, $self;
}
sub namae {
my $self = shift or die $!;
print $self->{namae}, "\n";
}
sub nake {
my $self = shift or die $!;
print "にゃーにゃー\n";
}
sub sine {
my $self = shift or die $!;
print "ぎゃーーー\n";
}
0957デフォルトの名無しさん
2010/10/11(月) 16:15:33get系メソッドで状態が変化するわけではないので
letかwhereで束縛するだけでいいのでは
0958デフォルトの名無しさん
2010/10/11(月) 16:17:34>>944が作って欲しいのはこう言うのじゃないの?
>>955
いや、>>951はプロセス指向版
0959デフォルトの名無しさん
2010/10/11(月) 16:18:21理解した!
スレッドつかったら、プロセス指向になるんだ!
0960デフォルトの名無しさん
2010/10/11(月) 16:19:33仕事が早いw
0961475
2010/10/11(月) 16:20:28>IO モナドをどう使えば何が出来るか、何が出来ないか、
>Arrow を使えばどう記述しやすくなるか、ならないか、
あ、スマンが、それを分かり易く、言い換えると「数学用語を使わずに」説明してくれないかな?
>>935で書いたけど、自分はモナド/アローと格闘中。で、一時的に敗北を認め、
今は代数の勉強からやり直しているところ(群と束までは何となくイメージが湧くんだけどね)。
だから、説明してくれるとすごく嬉しいね。
>逆に訊くが、バーコード表示コンポーネントに
>圏論の概念の何が必要か挙げてくれ。
バーコード表示コンポーネントなら不要かもしれない。スマン。
ただ、事務系処理と圏論の概念という話題は、>>475の関数指向設計技法の話と関連するかもしれない。
まだモヤモヤした状態なので、後からレスするよ。
0963デフォルトの名無しさん
2010/10/11(月) 16:23:44スレッドでもいいんだけど、ネイティブスレッドは非常に重いので、
今必死で各方面でerlangのような軽量プロセスを実装しようと試みている人がいるよ。
perはメモリ周りが柔軟なので、ネイティブだけど割と軽い。
Cと比べたら激遅なんだけどねw
あと、スレッドを使うだけではなくて、ロック機構を全く使っていないことに注目して欲しい。
メッセージパッシングにスレッドセーフなキューを採用している。
0964デフォルトの名無しさん
2010/10/11(月) 16:25:17オブジェクト指向言語での
書き方の一つなんじゃねーか。
紛らわしいw
0965デフォルトの名無しさん
2010/10/11(月) 16:26:33いや、ちょっとまって、どこをどう見たら>>951と>>956がおなじに見えるの?
0966デフォルトの名無しさん
2010/10/11(月) 16:34:52オブジェクト指向のインスタンスのメソッドをたたくことをメッセージというが
これは
プロセス指向のメッセージパシングのメッセージとはぜんぜん別物。
しかたがないから名前つけるか。
前者:オブジェクト指向メッセージ(略してOM)
後者:プロセス指向メッセージ(略してPM)
以上
0967デフォルトの名無しさん
2010/10/11(月) 16:39:46use threads;
use Thread::Queue;
my $q = Thread::Queue->new;
my $th = neko($q);
my $q2 = Thread::Queue->new;
my $th2 = neko($q2);
$q->enqueue({command=>'namae', namae=>'タマ'});
$q2->enqueue({command=>'namae', namae=>'シロ'});
$q2->enqueue({command=>'nero'});
$q->enqueue({command=>'nake'});
$q->enqueue({command=>'sine'});
$q2->enqueue({command=>'sine'});
$th->join;
$th2->join;
sub neko {
my $q = shift or die $!;
return threads->new(sub {
my $namae = '';
while (1) {
my $message = $q->dequeue();
if ($$message{command} eq 'namae') {
$namae = $$message{namae};
print "命名:$namae\n";
} elsif ($$message{command} eq 'nake') {
print "にゃーにゃー\n";
0968475
2010/10/11(月) 16:40:00% オブジェクト TAMA の定義
tama(InqueryStream, ReplyStream) :- tama(InqueryStream, ReplyStream, 'TAMA').
tama([namae | InqueryStream], [Name | ReplyStream], Name) :- tama(InqueryStream, ReplyStream, Name).
tama([nake | InqueryStream], ['NYA NYA' | ReplyStream], Name) :- tama(InqueryStream, ReplyStream, Name).
tama([shine | InqueryStream], ['GYA---' | ReplyStream], Name) :- tama(InqueryStream, ReplyStream, Name).
% オブジェクトTAMA の使い方。ここで、instream はキー入力(標準入力)に、outstream は画面出力(標準出力)に相当する。
?- instream(InqueryStream), tama(InqueryStream, ReplyStream), outstream(ReplyStream).
0969デフォルトの名無しさん
2010/10/11(月) 16:40:28print "$namaeが寝ます。\n";
sleep(3);
print "$namaeが起きました。\n"
} elsif ($$message{command} eq 'sine') {
print "$namaeが死んでしまいました\n";
last;
}
}
});
}
0970967
2010/10/11(月) 16:45:13これは一つの関数のローカル変数に過ぎない。
関数型言語なら引数に与えて再帰することで状態を持たずに済むので、
プロセス指向は非常に関数型言語にとって有利な方法なんだ。
0971デフォルトの名無しさん
2010/10/11(月) 16:49:10> あ、スマンが、それを分かり易く、言い換えると「数学用語を使わずに」説明してくれないかな?
IO モナドを使えば IO との入出力ができる。
印刷ライブラリも呼べる。
FFI を使って Haskell 用には書かれていないライブラリにも
IO モナドとしてアクセスできる。
バーコードを印刷するアプリの「モナド」に関しては
これくらい知ってるだけで基礎知識としては十分。
あとは自分でライブラリを探して利用することができる。
代数や圏論など出る幕ではない。
>>961
んだよ、じゃあ帳票印刷パッケージでいいよ
代数やら圏論やらの理解がどれほど必要だ?
0972デフォルトの名無しさん
2010/10/11(月) 16:51:06> 帳票印刷パッケージ
そんなもんそのへんの乞食にやらしとけよw
100円ぐらいやってくれるんじゃね?
俺らの仕事は数億円の仕事だからさw
一緒にしないでよw
0973デフォルトの名無しさん
2010/10/11(月) 16:51:35おっとスマン
FFI を利用して外部ライブラリを呼ぶのなら、
メモリ領域破棄のタイミングについても知っていないと、
商用のアプリやライブラリとしてはちょっとお粗末だった。
でも、やっぱり代数や圏論の知識は要らんな。
0974デフォルトの名無しさん
2010/10/11(月) 16:56:53俺じゃなくて、745 に言ってくれ。
彼が >>941 で自ら例を挙げたんだから。
彼は、君が乞食にやらしとけよと言うモノを作るのに、
代数やら圏論やら難しい概念を正確に理解することが必要なんだと言っている。
0975デフォルトの名無しさん
2010/10/11(月) 17:00:040976475
2010/10/11(月) 17:01:57>一緒にしないでよw
事務系処理であれば、大企業の基幹システム開発とか銀行の勘定系システムだと、
ハード抜きソフト開発費だけで数億の案件なんてザラにあるんだよ。
君が言う100円くらいでやってくれるというCOBOLプログラマが奮闘している。
ところでHaskellで数億円って、どんなお仕事なの?教えて欲しいなーーーーw
0977デフォルトの名無しさん
2010/10/11(月) 17:02:130978デフォルトの名無しさん
2010/10/11(月) 17:04:33鉄道関係でZ言語使って設計したよ。
実装は他の言語だがな。
0979475
2010/10/11(月) 17:17:37Zは形式的仕様記述言語だろ。関数の概念も使うけど、それを言い出せば手続き型言語でも関数は使う。
レスとしては、適切ではないな。
で、HaskellでHaskellで数億円って、どんなお仕事なの?
0980デフォルトの名無しさん
2010/10/11(月) 17:21:55それ以前にHaskellで商売してるって誰が言ってるの?
0981デフォルトの名無しさん
2010/10/11(月) 17:25:43Zは述語論理の言語だよ。
0982デフォルトの名無しさん
2010/10/11(月) 17:29:48帳票印刷パッケージで代数やら圏論やら
難しい概念を正確に理解する必要性を説いてくれないだろうか。
バカの戯言など無視して集中してくれ
0983デフォルトの名無しさん
2010/10/11(月) 17:30:12> よく見て欲しいのが$namae変数。
> これは一つの関数のローカル変数に過ぎない。
> 関数型言語なら引数に与えて再帰することで状態を持たずに済むので、
> プロセス指向は非常に関数型言語にとって有利な方法なんだ。
それは名前を取得しているだけだから
ローカル変数ですむんだろ?
function get_namae() {
return "tama"
}
と同じこと。
現実的には、名前を決めるメソッドも必要。この場合はどうなるのさ。
0984デフォルトの名無しさん
2010/10/11(月) 17:31:52オブジェクト指向では状態を持たないとやりたいことは実現できないよ。
0985デフォルトの名無しさん
2010/10/11(月) 17:41:14> と同じこと。
ぜんぜん違う。
その方法ではオブジェクト指向的には、
タマバージョンとシロバージョンの2種類のクラスを別々に作る必要が出てくる。
一つのクラスでやろうと思ったら名前をつけるメソッドを用意して、
フィールドにnamae変数を用意しなければならない。
一方でプロセス指向ではフィールドに該当するものを持っても良いし持たなくても良い。
関数型言語を使うなら持たなくても良い。
0986デフォルトの名無しさん
2010/10/11(月) 17:50:01それでプロセス指向ならどうするか
って答えがでてないよ。
0987デフォルトの名無しさん
2010/10/11(月) 17:55:20>>967
コードを良く読んでいないでしょ?
実行すらしていないんじゃないの。
0988デフォルトの名無しさん
2010/10/11(月) 17:57:14オブジェクト指向はObserverパターンを散々推奨しておいて今更dequeue()はないだろ
両方とも詰んでるんだよ
0989475
2010/10/11(月) 17:57:52>>475で始めた一連のカキコでは「関数指向設計技法」というものを提案した。
で、入出力データを代数的データ型で定義するところまでは説明したけど、
それら入出力集合間の写像(関数)をどのように定義する方法論については、以下のように
曖昧な表現で終わっており、それを>>500でツッコまれていた。
>>497
>(2)副関数群への分解手順(アルゴリズム)について、JSP法の考え方に沿って(JSP法を模倣して、あるいは
> JSP法の用語を使って)、指導者が普通のプログラマへ説明する
実は、事務系処理は(100円でもやってもらえるような)比較的単純な機械労働のように
見られがちだけど、世界中のソフトウェア工学の権威が取り組んできていたにもかかわらず、
未だに解決できていない領域の一つだったりする。
上の写像定義であれば、入出力集合間の関係が準同形であれば比較的たやすい。
形式的な関数定義を導出することが可能。(言い換えると、プログラムの自動生成が可能。)
ところがそうでない場合、これをJSP法では「構造不一致」と呼ばれているが、
case-by-caseで、言い換えると設計者の「経験と勘」で対応せざるをえないのが現実。
JSPにおける構造不一致(structure clashs)については、以下の文献を参照してくれ。(英語だよ)
・The Jackson Development Methods (Michael A Jackson 1992)
http://www.jacksonworkbench.co.uk/resources.htm
(長いので続く)
0990デフォルトの名無しさん
2010/10/11(月) 17:59:29そのコードのどこに、名前を変更する処理が入ってるのさ?
インスタンス生成時に、値設定しているだけじゃないか。
> タマバージョンとシロバージョンの2種類のクラスを別々に作る必要が出てくる。
それから、これ訂正すべきだな。
クラスは1種類(猫クラス)だけで十分。
インスタンスは複数必要だが。
事実プロセス指向とやらでも、インスタンスは複数あるよな。
> $q->enqueue({command=>'namae', namae=>'タマ'});
> $q2->enqueue({command=>'namae', namae=>'シロ'});
0991デフォルトの名無しさん
2010/10/11(月) 18:01:03インスタンスを、その言語で定義されたインスタンスというもので表すか、
perlのようにハッシュをインスタンスとして使うかの違いでしかないのか?
0992デフォルトの名無しさん
2010/10/11(月) 18:02:55プロセス指向は、その構造体をハッシュにすることで
構造体の型の定義を作らないですむようにしたもの。
これでいいのか?
0993デフォルトの名無しさん
2010/10/11(月) 18:09:31http://msdn.microsoft.com/ja-jp/library/acdd6hb7(VS.80).aspx
これを使えば、あと状態を変えることができなくなる。
プロセス指向ってのは、このように
状態を最初に設定することだけできて、
後から設定する変数を持たないようにしたクラスと同じ。
プロセス指向だけで、ソフトウェアが作れることはまずなくて、
状態をあとから変更できないようにしておけば、
バグが少なくなるよって考え方のことだろう。
0994475
2010/10/11(月) 18:15:26えーと、>>968では副作用なんてありませんですよ。関数型言語じゃなくて論理型言語だけどねw
Prologだとretract/assertみたいな副作用が必須だったけど、並列論理型言語では副作用無しに状態を保持し、
ストリームを応用してクラス間の継承(インヘリタンス)すら記述できます。
というか、Haskellでの参戦者はいないの? (自分は、このスレじゃHaskellに批判的な立場だから書かないぜ)
ストリーム(無限リスト)を使えば、>>968相当の処理は、もっとエレガントに記述できるんだけど。
これは関数型的思考プロセス段位であれば「中級」に相当するレベルだよ。>>909
誰も皆、モナド・モナド・モナド・モナド・モナド・モナド・モナド・モナド.... ばかり考えているから、
昔の純粋関数型言語におけるストリーム指向プログラミング技法なんて忘れ去られてしまったのかな?
>>993
(>>844が言うところの)プロセス指向を間違って理解しちゃってますヨ
0995デフォルトの名無しさん
2010/10/11(月) 18:19:37ソフトウェアを状態を持たないで作ることは不可能なんだよね。
それが関数型言語で言えばモナドになる。
オブジェクト指向で言えば、インスタンスのこと。
(インスタンスではないクラスはメソッドの集まりなんで状態を持ってないよ。基本的に。)
実体を持たないメソッドを抽象メソッドと呼ぶように、
状態を変更しないメソッドを、関数とかプロセス指向(?)とか
言っているだけではないか?
結局は特殊な性質を持ったメソッドに、さもえらそうな名前をつけているだけ。
0996デフォルトの名無しさん
2010/10/11(月) 18:21:51あぁ、C++でいうconstメソッドのことねw
0997デフォルトの名無しさん
2010/10/11(月) 18:40:540998デフォルトの名無しさん
2010/10/11(月) 18:44:190999デフォルトの名無しさん
2010/10/11(月) 18:47:21メソッドって特殊な性質を持った手続きのことでしょ
1000デフォルトの名無しさん
2010/10/11(月) 18:47:3610011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。