1 名前:デフォルトの名無しさん [04/05/04 14:53] Lisp Scheme ML Haskell FP Mirranda など 関数型言語について話し合いましょう 関連スレ 関数型プログラミング言語ML pc3.2ch.net/test/read.cgi/tech/1012445015/ 関数型プログラミング言語Haskell pc3.2ch.net/test/read.cgi/tech/1013846140/ LISP Scheme Part6 pc3.2ch.net/test/read.cgi/tech/1031560687/ Emacs Lisp pc3.2ch.net/test/read.cgi/tech/1004551074/
116 名前:デフォルトの名無しさん mailto:sage [04/05/12 04:01] 遺憾ていうより、たのしい。 wktm.moe-nifty.com/13hz/2004/03/post_25.html
117 名前:デフォルトの名無しさん mailto:sage [04/05/12 04:25] >>113 包丁屋には住みにくい世の中になりそうだな。 ところで包丁屋が使った金槌(VisualC++か?)を作った人間にも罪は及ぶのか? その金槌は包丁だけでなく鉄砲やピッキング用具を作るのにもよく使われているようだが。
118 名前:Aransk [04/05/12 16:33] >117 >VisualC++か? やっぱ、AlegroLispかなんか関数型言語じゃあWinnyは ちょっと無理なのかぁ。(-_-;)
119 名前:デフォルトの名無しさん mailto:sage [04/05/12 20:32] 作者はシミュレーション屋さんじゃなかったっけ>Winny
120 名前:デフォルトの名無しさん [04/05/12 21:55] Frantzのシャチョさんとハーレクインのシャチョさん、どっちが儲かってるんだろう? というか、関数型言語業界で一番成功したビジネスマンって、何やってる人なんだろう? やっぱ、APL関連かな(泣笑
121 名前:デフォルトの名無しさん mailto:sage [04/05/13 00:56] >>113 その例えだと、まるでその包丁そのものには悪意がないみたい。 その包丁には、作った人の悪意が確実に込められてるわけだし、 第三者が手に入れた時点でほぼ確実に凶器なる様に仕組まれている。 そして他の目的で使う人間は事実上いない。 とくれば、その包丁が罪な物に変わりはないと思うよ。
122 名前:デフォルトの名無しさん mailto:sage [04/05/13 01:19] 確かに、例えについてはちんぴら共が逝った通り、包丁よりも拳銃の方が的確。 拳銃所持を基本的権利と考える連中が居るように、それに対する考え方はそれぞれ。 >>118 別に出来ないことはないでしょ、GUIさえあれば。 ライブラリ不足は根性でどうにかなる。 暇なんでnyみたいだけどム板住人向きのファイル共有ソフトつー のを作ってみるわ。もちろん純粋関数型言語ネイティブな。少しまちなー。(嘘)
123 名前:デフォルトの名無しさん mailto:sage [04/05/13 01:22] 「このソフトを沢山の人が使えば、現在の著作権概念を覆すことが出来るぞ。ヒヒヒ…」 だなんてことは言ってないような>作者 つかスレ違い
124 名前:デフォルトの名無しさん mailto:sage [04/05/13 02:35] >>120 すでにハーレクィンは以下略な感じだけども。 エクスアナリス?とファンクショナルオブジェクトに分離?
125 名前:Aransk [04/05/13 15:12] 中村正三郎さんって、まあネットでは知られたプログラマー つ〜か、アンチ・マイクロソフトの塊のような人ですが、 Lisp、Schemeで人生の価値観が変わった!って どこかで書いていた。関数型言語って嵌る人は嵌るんですね。 アンチMSが多いのもGNU・Lispのせいかな?
126 名前:デフォルトの名無しさん mailto:sage [04/05/13 18:41] Lispの何処が関数型なんだか。Schemeだって、ちょっと関数型っぽい だけだろ。
127 名前:デフォルトの名無しさん mailto:sage [04/05/13 19:39] >>126 Lispが関数型言語かどうかはさておくとして(私には分かりません)、 あなたの関数型言語の定義を教えてください。
128 名前:デフォルトの名無しさん mailto:sage [04/05/13 21:15] >>126 関数型の定義が昔と今とで変わっただけだよ。
129 名前:デフォルトの名無しさん mailto:sage [04/05/14 05:34] >>126 でも関数型屋が関数型言語の歴史の話をするときに絶対言うのが 「関数型言語の歴史はLISPから。すなわち手続き型とほぼ同じ長さの歴史がある。」 だという罠
130 名前:デフォルトの名無しさん [04/05/14 12:50] おまぃら、手垢のついた蘊蓄並べあってて、何が面白いのですか? やぁねぇ〜、ヲタの会話って評論家みたいでぇ〜。自分ではナニも出来ないくせに(プ
131 名前:Aransk [04/05/14 14:32] Lispが関数型言語の中では最も実用されているのは 事実です。またIDEにしてもAlegroLispはGUIBuilder からDB機能までついており他の言語と遜色ありません。 長い歴史と言い、その言語仕様の歪み=実用性の高さ と言い、他を圧倒しております。(GNULispも含め) ワタクシFranzから一銭も頂いておりません。 念の為^m^
132 名前:デフォルトの名無しさん mailto:sage [04/05/14 14:38] >>131 デヴスは自分のスレに帰れよ
133 名前:デフォルトの名無しさん [04/05/14 19:02] LISP覚えてよかっっっっっっっっっった! 毎日が楽しいです
134 名前:デフォルトの名無しさん mailto:sage [04/05/14 19:40] 私はLispの副作用のせいで末期ガンになり、医者にも「残り半年」と見放されました。 ところが友人の勧めでMLに変えたところ、なんと3ヵ月後ガンが消えてました! 医者もびっくりです。毎朝スッキリ目が覚め、15Kgのダイエットに成功し、 宝くじは3億円当たり、巨乳の彼女もでき、人生が楽しくてしかたありません。 ありがとうML。 (宮城県 酪農家 28才)
135 名前:デフォルトの名無しさん mailto:sage [04/05/14 20:38] haskell版もよろ
136 名前:デフォルトの名無しさん [04/05/15 00:40] たかが言語で何能書きたれてるんだ?あん?
137 名前:デフォルトの名無しさん [04/05/15 03:18] おまぃら、手垢のついた蘊蓄並べあってて、何が面白いのですか? やぁねぇ〜、ヲタの会話って痴呆性老人の繰り言みたいでぇ〜。 いつまでたっても同じ事を繰り返し言ってるだけぇ〜、 話が面白くない殿方って、勉強も仕事も恋愛も中途半端って感じぃ〜。
138 名前:デフォルトの名無しさん [04/05/15 03:21] Aranskって実物も痛そうだけど、 2ちゃんの自称Aranskってチンポ生えてるし、 痴呆入ってるし、なんだかとてもきもい。
139 名前:デフォルトの名無しさん [04/05/15 09:58] 俺はチン毛小六の時からはえだしたぜ
140 名前:デフォルトの名無しさん mailto:sage [04/05/15 11:27] てか、Aranskはあのヘンテコなページ内容も含めて 関数型言語系のスレッドでは結構前から叩かれてきたように記憶しているのですが なぜか最近「ここのAranskは女、別物」説を声高に主張して、腐女子だのチンポだの 連呼する人が突然わいてきましたね。これって何?
141 名前:デフォルトの名無しさん mailto:sage [04/05/15 12:33] Aranskのジサクジエン
142 名前:デフォルトの名無しさん [04/05/15 12:54] >>140 ホムペ見れば、おねたんて判るだろ。 おまぃの目は節穴でつか?
143 名前:デフォルトの名無しさん mailto:sage [04/05/15 12:57] ホムペのは、私立女子大文学部卒の土方プログラマって感じがぷんぷん。 2ちゃんのは、COBOL運用歴30年もう定年ってな手垢な感じがぷんぷん。 よって、ホムペの中の人と、2ちゃんの中の人は、別物。
144 名前:デフォルトの名無しさん mailto:sage [04/05/15 13:01] Aranskの話題はあっちでやれよ
145 名前:デフォルトの名無しさん mailto:sage [04/05/15 13:27] >>142-143 ??? あとさ、なんでいつも二回にわけてレスつけるの?
146 名前:デフォルトの名無しさん mailto:sage [04/05/15 13:36] ほむぺぇー
147 名前:デフォルトの名無しさん mailto:sage [04/05/15 14:16] aranskは単なる少女マンガオタのデブオタクだろ。 2chのaranskも同じ人物。 頭おかしいんだからそっとしておいてやれ。
148 名前:デフォルトの名無しさん [04/05/15 15:44] 2ちゃんのPSYCHOからかうとおもれぇYOOOOOO!
149 名前:Aransk [04/05/15 16:48] 今日久々に新しいLisp本を本屋で発見! Cutt社???「楽しいLisp入門」です。 全然楽しくないんですがぁ。(-_-;) まだ、グレアムのLisp本の方が良かった。
150 名前:デフォルトの名無しさん [04/05/15 17:42] Cuttの本は、最初っからあんまパッとしないよ。 たしか一冊目は、Lisp処理系の本だけど、何を今更みたいな素人じみた内容だたー。 最近は営業考えて、オプソに接近してたみたいだけど、 まだLispにこだわってるのかぁ〜。Lispファソとして恥ずかしいな、
151 名前:デフォルトの名無しさん mailto:sage [04/05/15 20:49] カットシステム「やさしいLisp入門」 www.cutt.co.jp/book/4-87783-102-9.html 書名もまともに憶えられないくらい楽しくなかったのですね。 自分は大学生協で見かけたけど、目次をめくって、マクロのマの字も 出てこなかった時点でカス本だと思いました。
152 名前:デフォルトの名無しさん mailto:sage [04/05/15 22:14] やっぱLISPを使う醍醐味はマクロだよね!
153 名前:デフォルトの名無しさん mailto:sage [04/05/16 17:21] このスレのテンプレにAransk、ヒーロー勇気は放置と 今度から明記してください。
154 名前:デフォルトの名無しさん mailto:sage [04/05/16 17:36] Aranskとム板廃人列伝の1が二人で(一人で)会話してるだけのような 気がするんだが。
155 名前:デフォルトの名無しさん mailto:sage [04/05/16 18:40] >>154 あんた妄想癖が激しいな。 実生活だいじょうぶ?
156 名前:デフォルトの名無しさん mailto:sage [04/05/17 11:56] あまりにも見事に釣り上げられてますね… 向こうでもこっちでも、何でそんなに手当たり次第必死で噛みついてるんですか? 煽り方がずーっとワンパターンなのは何故ですか? いちいち口調を変えて名無しで連投し、指摘されると 「ショムニ」を真似してみただけだよ!そんなこともわからないなんてバッカミタイ♪ とか意味不明な開き直りをするのは何故ですか? >>148 は突っ込みに返せなくなっての負け犬の遠吠えですか?
157 名前:Aransk [04/05/17 16:23] >151,152 正直ワタクシも最初はLISPやSchemeのマクロに感激いたしました。 でも、どうなんでしょう? C++のオペレーター・オーバーロードでも間違いやすい。 文法まで変更できる能力って? 極端な話、同一言語であるアイデンティティーそのものまで 変更できるってことですよね? 一人で開発するのは良いけど、多人数になった場合に マクロの徹底なんかどうしておられるのでしょうか?
158 名前:デフォルトの名無しさん mailto:sage [04/05/17 20:02] てゆうか、プログラム言語ってのは使うための道具で決して飾り物ではないと 思います。なんにもできない(開発しない)のに道具ばかり選んでても意味 ないのでは。最近は Lisp に御執心のようですが ML や Haskell は結局 使いこなせなかったということですか?
159 名前:デフォルトの名無しさん mailto:sage [04/05/17 21:12] そもそもlispなんてS式なのをいいことに その場で問題に適した言語を作る ぐらいの勢いで使うものだと 思うのだが。
160 名前:デフォルトの名無しさん [04/05/17 22:48] 相変わらず、脳内就業時間終了と同時に、暇々サイコが粘着してるのが笑える。 あっちのスレもねw
161 名前:Aransk [04/05/18 14:54] >158 >ML や Haskell は結局使いこなせなかったということですか? 仰る通りです。結局、言語仕様を読み、ちょこっと試用した だけで終わってしまいましたぁ。^m^ >159 >その場で問題に適した言語を作る お差支えなければ、そのご自分でお作りになった 「その場での問題に適した言語」の一端でも ご披露頂けないでしょうかぁ?(*^^)v
162 名前:デフォルトの名無しさん mailto:sage [04/05/18 15:01] "Aransk"はアボーン設定しろよ。ここの住人は馬鹿だろ。 構ってチャンにエサやるな。
163 名前:Aransk [04/05/31 16:11] >213 :デフォルトの名無しさん :04/05/31 12:54 >Aransk様, TXL ttp://www.txl.ca/ の使用レポートおながいします。 向こうのスレはいくらなんでも、「あの顔だけ」はどうしても 許せない!って泣くメンバーがおりまして…。 今のところお出入り禁止命令が…。 全く似てないのか?それとも…似過ぎているのか?(^。^)y-.。o○ そこで代わりに、こっちでご回答を致します。 Queen's University, Kingston, CanadaこれだけでAransk様は 至極お気に入りで御座います。(*^^)v ただ、define 〜end define構文がどうしても美的センスに 合わないようで…(^_^;)
164 名前:Aransk [04/06/01 15:25] define 〜end define構文ってさぁ、プリプロセッサコマンドの マクロ定義を連想させない?(^_^;)
165 名前:デフォルトの名無しさん mailto:sage [04/06/01 23:21] VBを連想する。 嫌な気持ち。
166 名前:Aransk [04/06/02 13:11] >165 VBよりは、Parsing機能は高そうですよ。(*^_^*)
167 名前:デフォルトの名無しさん [04/06/08 21:25] >C言語の特徴を説明する上で、よく「関数型言語」という言葉が用いられます。 >これは、C言語が、関数が集まって形作られる言語であることに由来しています。 ttp://homepage3.nifty.com/mmgames/c_guide/01-01.html
168 名前:デフォルトの名無しさん mailto:sage [04/06/10 19:51] >>167 >167 お〜 知らんかったよ 「 C言語の特徴を説明する上で、よく「関数型言語」という言葉が用いられます」 Cはずいぶん書いたけど C は使ったことないしな main関数なんて書いたこともない
169 名前:デフォルトの名無しさん [04/06/11 19:12] 関数型言語っぽいビルドツールってありますか? makeはちょっとあれなので、他にいいものがあれば 参考にしたいです。
170 名前:デフォルトの名無しさん mailto:sage [04/06/11 19:26] 関数型言語 make ttp://spa.jssst.or.jp/2003/program/papers/03007.pdf
171 名前:デフォルトの名無しさん [04/06/11 21:54] C#かJavaから呼び出すのに適した関数型言語ってどれ? Haskell.netっての試したけどC#から呼び出すのはうまくいかなかった。 逆はかなり簡単だけど。
172 名前:デフォルトの名無しさん mailto:sage [04/06/11 23:41] 試したことないけど F# は?
173 名前:デフォルトの名無しさん mailto:sage [04/06/18 18:09] >>170 時間がなくて真面目に読んでなかったけど、 これなかなか面白いかも。Perlで書きなおしてみようかな。
174 名前:デフォルトの名無しさん mailto:sage [04/07/08 00:07] ttp://pc5.2ch.net/test/read.cgi/tech/1036013915/394 394は俺じゃないけど、helloworldとか足し算とかどうやるのか教えてクレクレ。
175 名前:デフォルトの名無しさん mailto:sage [04/07/08 10:06] ざっと見たけどコンビネータ理論で本当にプログラミング言語つくっちゃったっ て感じなのか? s とか k とかが乱舞してるね。すげ。 全然読んでないけど、真ん中らへんに helloworld っぽいのがあるし、足し算 もそのちょっと下にあるね。チャーチ数使うのかよ。 The function <add> which adds two Church integers is ^m`$m<inc>, i.e. ``si`k`s``s`ksk だそうだ。
176 名前:うーん mailto:sage [04/07/11 22:00] コメントとかで解説されないと ぜんぜんわかんねえや。
177 名前:デフォルトの名無しさん mailto:sage [04/08/08 16:28] ちょっと質問があります。 例えば、「お風呂を沸かす」を関数モデルで表現すると、どうなるんでしょうか。 わたしの脳みそでは、 1. 風呂に水を張る 2. 湯沸かし器を点火する 3. いい湯加減になるまで沸かす のようにしか考えられませんが、これって手続き的ですよね。
178 名前:デフォルトの名無しさん mailto:sage [04/08/08 17:24] よくわからんが いい湯加減になるまで沸かす(湯沸かし器を点火する(風呂に水を張る)) じゃだめ?
179 名前:177 mailto:sage [04/08/08 18:32] >>178 どうもです。 関数モデルだと手続き表現は、ただ関数の入れ子が深くなることで表現できる、ってことですね。 この場合、各関数の入力としてお風呂変数(水の高さ、温度、風呂釜の状態)を入れ、それを元に新しいお風呂変数を返す、って感じですか。 いい湯加減になるまで沸かす(湯沸かし器を点火する(風呂に水を張る(お風呂変数))) →新しいお風呂変数
180 名前:洩れ車@藤四郎 mailto:sage [04/08/09 07:37] >>177 以下、若干J言語の記述法を用いることをお詫びしますが、できるだけ分りやすくします。 (1)大枠としてはまずこう考えてはどうでしょうか。 h(x) を h(x) =: f(g(x)) と定義することを h =: f @ g と表記すると、 (「=:」は定義を、「@」は関数の合成を意味する。@ は小さい白丸と似たようなもの) お風呂を沸かす =: いい湯加減になるまで沸かす @ 湯沸かし器に点火する @ 風呂に水を張る x は「世界」である。「お風呂を沸かす」は、「お風呂が沸いていない世界」に働き掛けて、 「お風呂が沸いた世界」を得るための手続あるいは操作あるいは関数である、と。 つまり、 お風呂が沸いた世界 = お風呂を沸かす(お風呂が沸いていない世界) (「=」は相同を意味する) 途中経過は、 風呂桶に水を張っただけの世界 = 風呂に水を張る(お風呂が沸いていない世界) 加熱中の世界 = 湯沸かし器に点火する(風呂桶に水を張っただけの世界) お風呂が沸いた世界 = いい湯加減になるまで沸かす(加熱中の世界) ってことで。「世界」が大袈裟なら「風呂周りの系」でも可(と言うか適切かも)。
181 名前:デフォルトの名無しさん mailto:sage [04/08/09 07:38] (続き) (2)ただですね、「新しいお風呂変数」みたいな動的制御っぽい話になって来ると、 風呂周りの系 =: (0, 20, 0) NB. 初期値の構造体。(初期水量, 初期水温, 初期火力) 水量 =: 0&from NB. 構造体「風呂周りの系」から水量を取り出す関数。 水温 =: 1&from NB. fromはn番号の要素を取り出す2変数関数だが、Currying(projection) 火力 =: 2&from NB. を行う&演算子を用いて具体的な場所を指定済の1変数関数を作った。 風呂に水を張る =: 250&(0 amend) NB. 構造体の0番目の要素を250で置き換える関数。 湯沸かし器に点火する =: 0.1&(2 amend) NB. 火力を0.1で置き換える関数。 いい湯加減になるまで沸かす =: 単位時間沸かし続ける ^: _ (「^: _」は、結果が定常状態になるまで操作を繰り返させる後置演算子です。つまり、 f ^: _(s) は、x=f(x) となるまで f(f(f(...(s)...))) を繰り返し、その時の x を返します) 単位時間沸かし続ける =: ( NB. 実引き数は仮引き数 y. に代入される。 if. 41.5<: 水温(y.) do. y. return. end. NB. 終了条件は中で判定(汚いが)。 y.=. ((水温 + 火力)(y.)) (1 amend) y. NB. 「=.」は局所定義/局所再定義。 NB. ↑構造体の1番目を、構造体の1番目と2番目との和で置き換える手続。 y. return. ) みたいなやり方がやや関数的と言えるのではないでしょうか。
182 名前:デフォルトの名無しさん mailto:sage [04/08/09 22:29] けっきょく「あれやってこれやって……」という順番があるのだから、それは その順序が得られるように書くしかないわけで、関数的に書くというのはちょっ と変なんじゃないかなぁ。 個々の関数を副作用なしに書く定義を書いといて、 空の風呂 >>= 水を入れる >>= 点火 >>= 火を止める とかあたりでは。
183 名前:デフォルトの名無しさん mailto:sage [04/08/09 23:59] 「お風呂を沸かす」というのがすでに手続き的な表現かと。
184 名前:デフォルトの名無しさん mailto:sage [04/08/10 01:02] 関数的には? 「湧いたお風呂を得る」?
185 名前:デフォルトの名無しさん [04/08/10 09:37] >>184 馬鹿
186 名前:177 mailto:sage [04/08/10 10:00] >>180 - 181 ありがとうございます、、でも半分も理解できてないような、、ごめん。 最近、関数モデルの言語で、「手続きモデルを適用したほうがすっきりする問題」をうまく扱えるのかなあ、と思っていました。 結局、「順番に実行する」というのは、関数を順番に適用→関数を入れ子にする、で簡単に置き換え可能、と理解しました(でいいですよね?)。
187 名前:デフォルトの名無しさん mailto:sage [04/08/11 15:00] Haskell ならモナドでやるよ、ってことで >>182 を書いたんだけどな……。 >>= は演算子で、 Monad a => a b -> (b -> a c) -> a c の型を持つ。ちょっ とわかりづらいけど、初期の値を順に関数に通して結果を得るための演算子だ と考えてくれていい。 他にも、関数のリストを作って畳み込むことで結果を得るという考え方もある と思う。ステートが違うだけで同じ型の変数であると考えれば、 風呂 = foldl apply 空風呂 [ 水を入れる, 点火, 火を止める ] where apply :: a -> (a -> b) -> b apply x f = f x とかね。 もちろん、 Haskell にも do 〜 のような述語があるし、 ML 系にも begin 〜 end が(たしか)あるから、手続的に書こうと思えば割と 簡単に書けるよ。
188 名前:177 mailto:sage [04/08/11 19:04] >>187 あ、ごめんなさい。>>182 で">>="の意味がまったくわからなかったもので。 関数型言語でも、手続き的にしか考えられないものは手続き的に考えるしかない、ってことですか、、 メインが関数モデルで、必要悪で手続きモデルを使う、みたいな。 組み込み屋の戯れ言にお付き合い頂いてありがとう。 少しすっきりしました。
189 名前:187 mailto:sage [04/08/12 00:05] 必要悪というか、結局最終的には「これやって」という操作の部分が出てくる のは当然なわけです。関数の定義それ自体で動くわけではないですから。 なので、スタイルとして 1. 各関数の定義を宣言的に書く 2. 最後にそれをごちゃっとまとめる というステップで書くとよろしくやってくれる、という考え方なんだと思いま す。 むろん C でも綺麗に書こうとすればそういうスタイルはありだと思いますが、 関数型言語でやった方が圧倒的に書きやすいのです。
190 名前:177 mailto:sage [04/08/12 07:57] >>187 なるほど、、 私は、関数型言語使う人って、プログラムを全部関数的に構築したいのかなあ、って妙な誤解をしてました。 お話きいてると、その辺は割とあっさりしてる感じですね。
191 名前:デフォルトの名無しさん mailto:sage [04/08/13 06:05] よく耳にする「(純粋)関数型言語に代入はない」というのはミスリーディングな発言だと思う. 「関数型言語では代入の必要になる場所は少なく,使ったとしても隔離できる」
192 名前:デフォルトの名無しさん mailto:sage [04/08/13 07:01] それならLispと何も変わらないね。言語機能として隔離方法が 備わってるだけで。
193 名前:デフォルトの名無しさん mailto:sage [04/08/13 07:07] >>191 >使ったとしても隔離できる 「使う場合は隔離しなくてはいけない」だったりするのがイヤン
194 名前:デフォルトの名無しさん mailto:sage [04/08/13 11:42] 純粋な関数型言語には副作用がないといったほうがいいと思う
195 名前:デフォルトの名無しさん mailto:sage [04/08/13 16:22] だからそれがミスリーディングな言葉だという話の流れじゃないの? HaskellにはIO Actionを始めとしてモナド(特殊なコンテナだね)があり、 Concurrent Cleanには一意型変数があって好き放題いじれる。 もちろん(純粋でない)Schemeにはset!が、*MLには参照型変数がある。
196 名前:デフォルトの名無しさん mailto:sage [04/08/13 18:11] >>195 モナドはIOなどを副作用なく扱うためのものだろ?
197 名前:デフォルトの名無しさん mailto:sage [04/08/13 19:29] 代入が必ずしも副作用を伴うとは限らないことも理解できない人が暴れてるスレはここですな。
198 名前:デフォルトの名無しさん mailto:sage [04/08/13 19:47] >>197 モナドは副作用を伴わないが代入あるということ?
199 名前:デフォルトの名無しさん mailto:sage [04/08/14 00:37] Cleanの奴は代入ではなく新しい変数を宣言してるだけ。 でも実質的に破壊的代入だからミスリーディングだということ?
200 名前:デフォルトの名無しさん mailto:sage [04/08/15 13:23] 「(実質|理論)的には」(破壊的(な|でない)(代入|更新)|副作用|参照透明性)が(ある|ない) とかの話にはもう飽きた。 関数型言語と言えど魔法の弾丸ではない。それだけ。
201 名前:デフォルトの名無しさん mailto:sage [04/08/15 20:17] プ
202 名前:デフォルトの名無しさん mailto:sage [04/08/19 16:12] たとえば単語のリストを渡されて出現数を数えろと いわれたときに、適当にハッシュ表とカウンタ用意 して++とかしますが、これを関数型言語ではどんな 感じでやるのかな?
203 名前:デフォルトの名無しさん mailto:sage [04/08/19 16:45] >>202 関数的に書くんなら、連想配列を使って、 1. 要素を発見したら、個数を1つ増やした新しいセルを追加し、古いものを削除 2. なければ新しい要素を追加 とかじゃないか。 結局、やることはそう変わらないはず。ただし、++のように破壊的にやるので はなく、古いものを削除して新しいものを追加するというポリシを取る。 もっとも OCaml の場合には、標準ライブラリにハッシュテーブルがあるから、 これを使って破壊的にカウントすることになるだろうね。
204 名前:デフォルトの名無しさん mailto:sage [04/08/19 17:58] それだと連想配列が破壊的に書きかえられてるように 見えますが、関数型といってもそんなもんなんすか。
205 名前:デフォルトの名無しさん mailto:sage [04/08/19 18:31] あらかじめ単語に区切られた文章yの中に単語のリストxの各要素がどれだけ出現するか数える関数。 count x nil = すべて0 count x y::ys = if y ∈ x then (count x ys)のyに対応する単語の出現数を1増やしたもの。 else count x ys
206 名前:デフォルトの名無しさん mailto:sage [04/08/19 19:14] >>204 たとえば次のように書くと、 let alist = (word, count+1) :: (List.filter (fun (w, c) -> w <> word) alist) これは破壊的代入ではないよ。元の alist は破壊されなくて、そこの部分を 書き換えたリストを *新しく* 作る。だから、置き換える前のリストや、消し たセルを参照しているものがあっても副作用は起きない。 ただしこれ、実際にやると新しくリストをコピーすることになるので、著しく 効率が悪いはず。 Concurrent Clean だと、古い方のものが以後使われることがない(他で参照さ れていない)時には自動的に破壊的代入になるという話を聞いたことがあるん だけど、もしそうなら同じアルゴリズムで効率的に動作できるのかも。 そういうわけで、こんな感じかな(OCamlのコードです)。 let rec count x = function | [] -> x | y::ys -> try let w, c = List.assoc y x in let x' = (w, c+1) :: (List.filter (fun (w', c') -> w <> w') x) in count x' ys with Not_found -> count ((y, 1) :: x) ys try - with で囲んでるから末尾再帰じゃないので、さらに効率的ではないけ どね。
207 名前:206 mailto:sage [04/08/19 19:48] しまった。 List.assoc は 'a -> ('a * 'b) list -> 'b だった。真ん中らへんの let w, c = List.assoc y x in は、 let w, c = y, List.assoc y x in とでも読み換えてくれ。
208 名前:デフォルトの名無しさん mailto:sage [04/08/19 21:02] なるほど、毎回組み替えるわけか。文章の長さに比べて登場単語数が 十分小さければサーチ時間は一定とみなせると強弁できるかもしれない けれども、組み換えによるメモリの消費や割り当ての手間はけっこう 馬鹿にならないような気がする。貧乏性ですかね?
209 名前:デフォルトの名無しさん mailto:sage [04/08/19 23:38] 再起版のプログラムを書くとリストに破壊的代入を行っても問題ない(cleanで言うところの一意性)を証明して、ループと代入を使ったプログラムに最適化したりするという研究があったな。 プログラムに関するいろんな公理を教えておく必要があるが、デモを見た限り結構賢そう。 どこまでできるのかは知らないけど。
210 名前:デフォルトの名無しさん mailto:sage [04/08/19 23:46] 字面では毎回組み換えるようなことをやっておきつつ中では破壊的更新をおこなう,これ最強. あとは中で破壊的更新を使いつつも「外側から見ると参照透明な」関数とか. Haskell標準の配列型 ttp://www.sampou.org/haskell/tutorial-j/arrays.html ttp://www.sampou.org/haskell/report-revised-j/array.html Concurrent Clean標準の配列型 ttp://sky.zero.ad.jp/~zaa54437/programming/clean/LanguageReport21/Chap4.html#sc14 純粋関数型言語における「配列」の実現 ttp://www.nerimadors.or.jp/~kando/TITECH/FuncArray/FuncArrayImpl.html ...なんかを眺めていたらなかなか面白かった. >>209 ソフトウェア自動生産特論 ttp://www.futamura.info.waseda.ac.jp/~futamura/lecture/Automation/index.html とか?
211 名前:デフォルトの名無しさん mailto:sage [04/08/20 01:49] >>208 最初に書いたように、 OCaml にはハッシュテーブルがあるので、普通にやる 場合にはこれを使うのが普通でしょう。ただ、あまり関数的ではないアルゴリ ズムになります(下記)。 ちなみに OCaml にも配列はあり、破壊的な代入が可能です。理論の詳しい話 は知りませんが……。 let number2 lst = let rec main tbl = function | [] -> tbl | w::ws -> if Hashtbl.mem tbl w then let c = Hashtbl.find tbl w in Hashtbl.replace tbl w (c+1) else Hashtbl.add w 1; number2 tbl ws in main (Hashtbl.create 100) lst ;;
212 名前:デフォルトの名無しさん mailto:sage [04/08/20 14:01] >>210 配列であれhashであれ通常のループ+破壊書き換えで 動いてるプログラムなら見かけ上配列またはhashを 全コピー+1要素更新しながら末尾再帰するような プログラムに書き換えられて、それは実はループ変数 を末尾再帰のパラメタにするのと似たような手で 破壊書き換えに最適化できる、という感じなのかな。 なんか一回りしてるようだが面白い(笑)
213 名前:洩れ車@J算譜工房 mailto:PEB04516@nif [04/10/22 09:38:20] (奇しくもLISPと時を同じくして生まれた)APL言語と、その後継言語であるJ言語 (JayLanguage)の開発者、ケン(ケネス)・アイバーソン博士が亡くなりました。黙祷。 J言語のメーリングリストからの引用です: Ken Iverson passed away Tuesday evening, October 19th at the age of 83. Ken was at his computer Saturday afternoon working on a new J lab when he had a stroke. Three days later he died quietly with his wife Jean by his side, along with other family members. Ken had a wonderful and memorable life. He enjoyed it fully and he freely shared his joy with so many others. Many people have contributed to the start, growth, and evolution of J. But Ken's role was central and inspirational. J exists because of Ken and we will always remember that. The J Forum was a particular joy for Ken. He was an avid reader and was amazed and pleased with the civility. In his last days Ken expressed confidence that the J seeds he had planted had taken root and was satisfied that the steady and healthy growth would continue. Ken has passed a torch and it is now up to us. Ken's immediate family is having a private memorial service. In lieu of flowers, please make a memorial donation to the charity of your choosing or to the Academy of Life Long Learning (www.allto.ca). Ken's life was based on the importance of education and teaching and in recent years, with Jean's serious involvement, the Academy was an important part of Ken's wider life outside of J. /Eric Iverson
214 名前:デフォルトの名無しさん mailto:sage [04/10/22 20:22:24] 黙祷。 LISPの生みの親、Jマッカーシー氏はまだ生きてる、よね?
215 名前:デフォルトの名無しさん mailto:sage [04/10/23 02:09:48] >>214 元気にサイトの更新なさったりしてます。 ttp://www-formal.stanford.edu/jmc/
216 名前:デフォルトの名無しさん [04/10/23 04:27:03] すみません、業務でC++とか使ってて C, Perl, Ruby, Java も一通り触った事はあって、 オブジェクト指向開発とかは好きなんですけど、 関数型言語っていまだに理解できないんです。 ソースの字面を見ても意味が分からないし、 概念もさっぱり分からない。 logさえ分からないヘタレ高卒で数学の素養が 全くない漏れでも理解できる方法ってありませんか?