関数型言語Part5
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん
2009/09/09(水) 13:31:46関数型言語について話し合いましょう。
前スレ
関数型言語Part IV
http://pc12.2ch.net/test/read.cgi/tech/1083649982/
関連スレ
Lisp Scheme Part27
http://pc12.2ch.net/test/read.cgi/tech/1248657331/
関数型言語ML (SML, OCaml, etc.), Part 6
http://pc12.2ch.net/test/read.cgi/tech/1245017721/
関数型プログラミング言語Haskell Part11
http://pc12.2ch.net/test/read.cgi/tech/1252382593/
Emacs Lisp 3
http://pc12.2ch.net/test/read.cgi/tech/1191875993/
0002デフォルトの名無しさん
2009/09/09(水) 13:50:580003デフォルトの名無しさん
2009/09/09(水) 14:12:27http://pc12.2ch.net/test/read.cgi/tech/1176479959/
【.NET】F#について語れ【OCAML】
http://pc12.2ch.net/test/read.cgi/tech/1186030985/
0004デフォルトの名無しさん
2009/09/09(水) 19:28:02・関数がファーストクラスオブジェクトとして扱える
・リスト操作が簡単
・ラムダが簡単
としか思っていないし、それ以上のことはどうでもいい
純粋とか非純粋とかマジどうでもいい
0005デフォルトの名無しさん
2009/09/09(水) 20:13:170006デフォルトの名無しさん
2009/09/09(水) 20:14:54考えを改めると世界がよりよく見渡せるようになると思う。
今後もそんな目は要らないと言うのなら、どーでもいいが。
0007デフォルトの名無しさん
2009/09/09(水) 20:28:42別にそんな一所懸命、何かをわかってるフリしなくていいです。
0008t ◆SQYzTdSfUA
2009/09/09(水) 20:43:05失礼しました
ところで、前スレの990の
>ソフトウェア設計(あるいはプログラミング)という行為を、(理論を背景にして)
>より抽象的に、より形式的に実践しようとすることは大切だし、それを多くの人に広めたい。
というのは同意見です
現場でも理論的な背景を知り実践していくべきです
そういう意味ではHaskell, OCaml, Scala, haXeあたりを進んで実戦投入していけば、
いやでも広まると思います
もし現場で設計を担当していて、開発言語を決定できる権限のある方はこれらの言語を推してください
0009デフォルトの名無しさん
2009/09/09(水) 20:45:09JavaScriptは関数型言語か否か
0010デフォルトの名無しさん
2009/09/09(水) 20:48:36納期に間に合わなかったら誰が責任とるの?
0011デフォルトの名無しさん
2009/09/09(水) 20:56:54分かってないけどいーじゃん、フリぐらいさせろ。
別に大きく間違った事は言ってないよな。
0012t ◆SQYzTdSfUA
2009/09/09(水) 21:04:27Haskellじゃなくて他の"一般的な"言語を使っていたら納期遅れの責任を回避できるの?
どの言語を使おうが、責任の所在は変わらないと思う
0013デフォルトの名無しさん
2009/09/09(水) 21:04:59末端の単純労働力のレベルを知ってて仰ってるのん?
0014t ◆SQYzTdSfUA
2009/09/09(水) 21:13:58はい、ある程度は知っています
C++やPHPを使わせるよりは逆に安全だと思っています
実際に某関数型言語(詳しくは書けません)で協力会社さんに依頼を出したことがあります
確かに出来上がったコードは期待以下でしたが、それでもヌルポが頻発するよりましでした
0015デフォルトの名無しさん
2009/09/09(水) 22:03:580016t ◆SQYzTdSfUA
2009/09/09(水) 22:49:42システム開発の現場の方へ:
もし趣味で学んだ関数型言語がシステム開発に有用だと思ったら、
上長やリーダー(システム設計の責任者)にその件をぜひ提言して下さい
その提言が受け入れられたからといって、万一プロジェクトが失敗した責任があなたに
降り掛かってくる事はありません
安心して提言しましょう
システム設計責任者へ:
どの言語を選ぼうが、結局のところ設計責任はあなたにあります
胸を張って自分がいいと思う言語を選択してください
たとえそれが趣味であろうとなかろうと
一般的であろうとなかろうと
0017デフォルトの名無しさん
2009/09/09(水) 23:17:300018デフォルトの名無しさん
2009/09/09(水) 23:48:18実用プログラミング言語なんて、
それをつかう一般的プログラマにとって、
言語自体が把握できる大きさと複雑さに抑えられていて、
対象とする問題記述に可能な限り簡易であればそれでいいのだと思う。
0019デフォルトの名無しさん
2009/09/09(水) 23:52:22そうだとするとC++なんて実用言語としては論外だなw
C++をもちだすのはスレチだろうけど。
0020デフォルトの名無しさん
2009/09/10(木) 00:01:52まったくその通り。
念のため>>18ではライブラリも含めての複雑さ大きさ。
0021デフォルトの名無しさん
2009/09/10(木) 00:23:47でも複雑で巨大でも、使うプログラマからすれば必要な部分だけチョイスして
プログラムできればそれでいいんじゃないかと思うよ。
C++の全仕様を把握してるプログラマとかANSI CLの全ライブラリを熟知してるプログラマとか
存在しない(と思う)けど、別にそれは問題ないだろ。
0022デフォルトの名無しさん
2009/09/10(木) 00:28:54はい論破
0023デフォルトの名無しさん
2009/09/10(木) 00:45:17必要な部分だけ選択することができて、
名前などがうっかり重複してしまっても問題ないといいですね。
>>22
対象とする問題の種類と大きさによる。
0024デフォルトの名無しさん
2009/09/10(木) 01:35:18大抵のプログラム言語は名前空間なりパッケージシステムなりで
名前の重複は実用上問題にならないか、問題が起きても発見できるんじゃねえ?
0025デフォルトの名無しさん
2009/09/10(木) 01:57:340026デフォルトの名無しさん
2009/09/10(木) 02:11:060027デフォルトの名無しさん
2009/09/10(木) 15:15:17http://pc12.2ch.net/test/read.cgi/tech/1246289771/
0028デフォルトの名無しさん
2009/09/10(木) 15:19:100029デフォルトの名無しさん
2009/09/10(木) 15:24:580030ぅゅ ◆e6.oHu1j.o
2009/09/19(土) 17:32:10色々と質問攻めしたいんだけど
0031デフォルトの名無しさん
2009/09/19(土) 20:07:45マ板の名物精神病者につき、無視推奨
0032デフォルトの名無しさん
2009/09/19(土) 21:55:50Languageもまともに綴れないようだし。
0033デフォルトの名無しさん
2009/09/19(土) 22:15:06http://pc12.2ch.net/test/read.cgi/tech/1242484767/
0034デフォルトの名無しさん
2009/09/19(土) 23:11:29おっさんだと思ってた
おっさんは頭おかしい奴多いからな
0035デフォルトの名無しさん
2009/12/27(日) 12:28:360036デフォルトの名無しさん
2009/12/27(日) 12:41:18> ・関数がファーストクラスオブジェクトとして扱える
> ・ラムダが簡単
なんだこれは。ちゃんと整理しろ。
0037デフォルトの名無しさん
2010/02/27(土) 08:52:540038デフォルトの名無しさん
2010/02/27(土) 13:12:56関数の返り値を使って処理を行うスタイルが徹底されている言語
0039デフォルトの名無しさん
2010/03/28(日) 13:37:5694 :どうですか解説の名無しさん:2010/03/26(金) 16:46:32.35 ID:A/YF/FyF:
0040デフォルトの名無しさん
2010/03/28(日) 16:39:340041デフォルトの名無しさん
2010/10/19(火) 07:36:490042デフォルトの名無しさん
2011/01/10(月) 23:21:310043デフォルトの名無しさん
2011/06/23(木) 17:19:18.520044天使 ◆KOAgYBL/Xg
2011/06/30(木) 10:07:58.49もう、それはいいや
その段階は超えた
関数型言語って、わずかにズレてんだよなぁ・・・・
クラスなんてものを使わず、関数でかいていくのはいいんだけど、
それだけじゃダメで
根底に1つ、クラスが必要であって
そのクラスオブジェクトにlambdaやメンバ変数やメンバ関数を、 オブジェクトインスタンスごとに付け加えていく感じ
それによって、型 = データとなって、
プログラム中に同じ型が存在しなくなるみたいな、そういうやつ
関数型言語は、まだそれを夢想している段階の言語で、決定的なものが抜けているからオブジェクト指向言語にすら勝てない
2011年の今現在、関数型言語で関数型プログラミングするよりも
オブジェクト指向言語にて関数型プログラミングしたほうが圧倒的に優位
0045デフォルトの名無しさん
2011/06/30(木) 14:43:26.130046デフォルトの名無しさん
2011/06/30(木) 20:05:47.53OOPの発想をSMLで表現する方法が載っている
http://mlton.org/ObjectOrientedProgramming
0047デフォルトの名無しさん
2011/06/30(木) 22:41:51.86不勉強な馬鹿丸出しなんだが。
同時代関数型言語でオブジェクト指向機能ないのを探す方が難しい。
0048デフォルトの名無しさん
2011/07/01(金) 02:08:14.62いやいや、君ら最近覚えたような人だろうけど、
そういうことじゃないんだよね
上のコテの「OOPLで関数型」は散々議論をし尽くされた上での結論なんだよ
ひよっこには理解はできんだろうが、まあ可能性を探してくれたまえよ・・・
0049デフォルトの名無しさん
2011/07/01(金) 02:14:06.970050デフォルトの名無しさん
2011/07/01(金) 02:18:27.97判る判る・・・
0051デフォルトの名無しさん
2011/07/01(金) 02:21:16.40関数型の関数は重すぎるってことだな
さよなら・・・
0052デフォルトの名無しさん
2011/07/01(金) 03:37:00.13(注:◆KOAgYBL/Xgは うゆのトリップのひとつ)
うゆ君は英語論文も英語ブログも全然読めないですよね。
「散々議論をし尽くされた」とはどこの議論の事でしょうか?
ム板で技術に関する嘘をまき散らすのは止めてください。
0053デフォルトの名無しさん
2011/07/01(金) 03:47:33.74実現可能か?
俺は無理だと思う。
オブジェクト指向と関数型は
相容れない。
0054デフォルトの名無しさん
2011/07/01(金) 03:50:23.47俺は無理だと思う。
0055デフォルトの名無しさん
2011/07/01(金) 05:58:04.660056デフォルトの名無しさん
2011/07/01(金) 11:07:10.17λ計算じゃないんだから。
0057デフォルトの名無しさん
2011/07/01(金) 11:16:38.920058デフォルトの名無しさん
2011/07/01(金) 20:25:46.65純度を高くすると限りなくラムダ計算に近くなって、無くなると思うぞ
0059デフォルトの名無しさん
2011/07/01(金) 20:31:36.030060デフォルトの名無しさん
2011/07/01(金) 21:46:11.020061デフォルトの名無しさん
2011/07/01(金) 21:52:12.080062デフォルトの名無しさん
2011/07/01(金) 22:23:03.86変数なしに実行できるような文法を持ってる言語のことだよ。
0063デフォルトの名無しさん
2011/07/01(金) 22:59:51.500064デフォルトの名無しさん
2011/07/01(金) 23:28:34.240065デフォルトの名無しさん
2011/07/01(金) 23:29:01.80に興味を持って、解読不能なコンパイルエラーでいやになって、MLに移った
のだが。まあ、gcc2.95の時代なので、もっとましになっているとは思うが。
0066デフォルトの名無しさん
2011/07/02(土) 00:04:14.430067デフォルトの名無しさん
2011/07/02(土) 00:50:15.76>>58
思うって言われても…
現実のプログラミング言語で極限に近づいたものは何があるの?
0068デフォルトの名無しさん
2011/07/02(土) 01:04:59.380069デフォルトの名無しさん
2011/07/02(土) 04:56:56.34言語の問題ではなく、スタイルの問題だよ
純度の高いスタイルで書けば、副作用は限りなくゼロに近付くということ
0070デフォルトの名無しさん
2011/07/02(土) 05:27:43.51副作用を持つ関数がほとんど存在しない
例外はunsafePerformIOなど使って定義された関数
0071デフォルトの名無しさん
2011/07/02(土) 05:27:54.050072デフォルトの名無しさん
2011/07/02(土) 05:29:42.65ああん?生き別れの兄弟さん?ああん?
0073デフォルトの名無しさん
2011/07/02(土) 05:50:17.810074天使 ◆uL5esZLBSE
2011/07/02(土) 14:52:04.82仕事で仕方なくならわかるけど
家でもJAVAやってるなら本当にバカだよね。哀れ
ゴミ
0075デフォルトの名無しさん
2011/07/02(土) 15:12:36.77変数に$ついてる言語触ってるって事だよね
いちいちSHIFT+4キーおして $ 打ちまくってる感触はどう?
0076デフォルトの名無しさん
2011/07/02(土) 15:17:21.840077デフォルトの名無しさん
2011/07/02(土) 22:39:10.62これでもYOME
http://en.wikibooks.org/wiki/Haskell/Understanding_monads/IO
0078デフォルトの名無しさん
2011/07/02(土) 23:04:55.02副作用のないオブジェクトって何なの?
0079デフォルトの名無しさん
2011/07/02(土) 23:22:26.77javaでいうとStringとか。
オブジェクトはメッセージに対応するメソッドを持っていればいいだけで
別に内部で状態を変化させなきゃならんとかいう決まりはないよ。
newObject = Message( oldObject, arg1, arg2 );
こういう形で十分成立する。
0080デフォルトの名無しさん
2011/07/03(日) 00:34:23.99加工せず作って捨てる発想だと
効率が悪すぎるのさ
まあ幼稚園児では判らないかもしれない
つまり関数型の発想は園児レベル
その根底をぶち壊すしかない
0081デフォルトの名無しさん
2011/07/03(日) 01:00:52.02なんか名前がついてたと思うんだが思い出せない
0082デフォルトの名無しさん
2011/07/03(日) 01:04:41.430083デフォルトの名無しさん
2011/07/03(日) 01:08:28.900084デフォルトの名無しさん
2011/07/03(日) 01:31:56.150085デフォルトの名無しさん
2011/07/03(日) 01:32:53.09比較をパターンマッチでやる、
辺りの概念は同意できるんだけど。
副作用そのもの扱いが確立されてない。
モナドみたいなごまかし方ってどうなのかね。
0086デフォルトの名無しさん
2011/07/03(日) 01:38:59.17本当はCOWの事いいたかったんちゃうの?
0087デフォルトの名無しさん
2011/07/03(日) 01:41:28.12副作用なんだけどね。
副作用がだめというのなら
変数に入れてはいけない。
0088デフォルトの名無しさん
2011/07/03(日) 01:42:42.77何が効率悪いの?
空間?速度?
0089デフォルトの名無しさん
2011/07/03(日) 01:44:25.37イヤ。
10 = Xであるとき 11 = Xになってはいけないだけの話。
数学であるでしょ。アレがもとになってんの。
0090デフォルトの名無しさん
2011/07/03(日) 02:02:46.46どうやったら、10=Xのとき
11=Xになるというんだ?
0091デフォルトの名無しさん
2011/07/03(日) 02:14:31.09int X=10;
X=11;
0092デフォルトの名無しさん
2011/07/03(日) 02:16:41.03副作用じゃんw
0093デフォルトの名無しさん
2011/07/03(日) 02:21:26.16y = f( x );
ただし、これは副作用があるとは言わない。
0094デフォルトの名無しさん
2011/07/03(日) 02:25:11.17y = f( 3, 5 );
間違えた、こんな感じか。意味ないけど。
0095デフォルトの名無しさん
2011/07/03(日) 02:48:39.07ちょっと書きなおしたが関数の定義がこんなかんじだとする。
f( x, e ) = if( x - e ) x; else 1 + f( x + 1, e );
関数の呼び出しはこんな感じ。
y = f( 3, 5 );
で、関数というのは数だ。
数学表記で y = x + 1 なんかを関数というが正しく処理じゃなくて数なんだ。
関数定義というのは数式に名前をつけただけ。本来は関数の中には数(数式)が入る。
さっきの例で言うと
6 = ( if( 3 - 5 ) else 3; 1 + ( if( 4 - 5 ) else 4; 1 + ( if( 5 - 5 ) else 5; 1 + (・永遠に続く・) ) ) )
というひとつの式になる。
0 = ( if( 3 - 5 ) else 3; 1 + ( if( 4 - 5 ) else 4; 1 + ( if( 5 - 5 ) else 5; 1 + (・永遠に続く・) ) ) ) - 6
仮に方程式にしても通じる。もし、ここで変数への代入があった場合は?
考えてみたらわかるが5 = 4のような矛盾した数式が発生するため式として成立しなくなる。
0096デフォルトの名無しさん
2011/07/03(日) 03:01:02.73訳が分からなくなるのが関数型言語です。
0097デフォルトの名無しさん
2011/07/03(日) 03:07:45.92>>95を1行で要約すると?
↓よろー
0098デフォルトの名無しさん
2011/07/03(日) 03:10:54.360099デフォルトの名無しさん
2011/07/03(日) 03:11:32.25猫に小判、豚に真珠、馬の耳に念仏、非理数系に関数型。
0100デフォルトの名無しさん
2011/07/03(日) 03:13:17.930101デフォルトの名無しさん
2011/07/03(日) 03:15:46.99プロトタイプ作る生産性なら関数型の方が上だろ。
ただ、バカには使えないのと、パフォーマンスの調整がメンドイってのはあるけどな。
0102デフォルトの名無しさん
2011/07/03(日) 03:18:14.920103デフォルトの名無しさん
2011/07/03(日) 03:18:57.770104デフォルトの名無しさん
2011/07/03(日) 03:21:48.060105デフォルトの名無しさん
2011/07/03(日) 03:22:05.340106デフォルトの名無しさん
2011/07/03(日) 03:25:07.28俺は知らんから教えてくれ。
1. 比較元の関数型言語
2. 1より生産性の高いらしい言語
0107デフォルトの名無しさん
2011/07/03(日) 03:26:18.502.C/C++
0108デフォルトの名無しさん
2011/07/03(日) 03:26:44.69それ単体では生産性というか生産能力自体無いと思うの
0109デフォルトの名無しさん
2011/07/03(日) 03:28:03.30キター
何回繰り返すんですか
0110デフォルトの名無しさん
2011/07/03(日) 03:31:50.08関数型で生産性の高い言語って何だ?
ハスケル厨とかに言わせるとLISPは関数型じゃないってよ
0111デフォルトの名無しさん
2011/07/03(日) 03:33:12.03解る範囲で比較できる実際のプロジェクトの工数を書いてみようや。
生産性が低い
・Concurrent Clean
・Haskell
・Miranda
・Lazy K
・F#
・ML
・OCaml
・Scala
・Erlang
・LISP
・LOGO
・Scheme
・Mathematica
・R
・Unlambda
・APL
・XSLT
生産性が高い
・C
・C++
0112デフォルトの名無しさん
2011/07/03(日) 03:50:29.84命題:規模あたりの開発工数が多い言語は何か
規模あたりの開発工数が多い
・Concurrent Clean プロジェクト内容, 工数, 人数
・Haskell プロジェクト内容, 工数, 人数
・Miranda プロジェクト内容, 工数, 人数
・Lazy K プロジェクト内容, 工数, 人数
・F# プロジェクト内容, 工数, 人数
・ML プロジェクト内容, 工数, 人数
・OCaml プロジェクト内容, 工数, 人数
・Scala プロジェクト内容, 工数, 人数
・Erlang プロジェクト内容, 工数, 人数
・LISP プロジェクト内容, 工数, 人数
・LOGO プロジェクト内容, 工数, 人数
・Scheme プロジェクト内容, 工数, 人数
・Mathematica プロジェクト内容, 工数, 人数
・R プロジェクト内容, 工数, 人数
・Unlambda プロジェクト内容, 工数, 人数
・APL プロジェクト内容, 工数, 人数
・XSLT プロジェクト内容, 工数, 人数
・C プロジェクト内容, 工数, 人数
・C++ プロジェクト内容, 工数, 人数
規模あたりの開発工数が少ない
内容の規模 * 人数 / 工数 でおおよそ見積もれるはず。
0113デフォルトの名無しさん
2011/07/03(日) 03:52:03.020114デフォルトの名無しさん
2011/07/03(日) 03:58:26.06何をやりたいのか知らんが
開発工数と生産性の高さってあんま関係ないでしょ
マイナーすぎたら誰もメンテできなくて却下だし
どう見ても関数型に不利な結果になる
マイコンで動かす→CASMとか
iほんで → Objc
安藤idで → java
窓で → C#VBとか
ネトで → 色々
こういう定番がある所に関数型言語が入り込む余地を考えるに、
少なくともその環境のSDKが滞りなく使えることが条件
その上で生産性を示す必要がある
0115デフォルトの名無しさん
2011/07/03(日) 04:09:09.1010倍程度ならCで書いたほうが誰でも理解できてよろしい、
という世の中です。
100倍、1000倍、彼女が出きるとかなら判りませんが。
0116デフォルトの名無しさん
2011/07/03(日) 04:16:48.92やる前にプロジェクト破綻するのが予測できるってどうよ
0117デフォルトの名無しさん
2011/07/03(日) 04:18:04.71Haskell界隈でもside effectという言葉の意味が一定してない
その記事で言ってるside effectは参照透明性を壊さない
>>85
IOモナドはごまかしどころか入出力を関数的に扱う自然な方法だと思う
0118デフォルトの名無しさん
2011/07/03(日) 04:25:49.70東電に入れば
収入が保障されたり
芋づる式に彼女ができたり
放射能出しっぱでも賠償しなくていい
0119デフォルトの名無しさん
2011/07/03(日) 04:27:07.02>>114-115
いまさらファビョんなよ。普及なんて時間と社風の問題じゃねぇか。
amazonやら欧米企業は関数言語ユーザーが社員の半分以上いるらしい。
問題にならん。採用水準最底辺のアホの集団を基準に言うな。
規模あたりの開発工数が多い
・Concurrent Clean プロジェクト内容, 工数, 人数
・Haskell プロジェクト内容, 工数, 人数
・Miranda プロジェクト内容, 工数, 人数
・Lazy K プロジェクト内容, 工数, 人数
・F# プロジェクト内容, 工数, 人数
・ML プロジェクト内容, 工数, 人数
・OCaml プロジェクト内容, 工数, 人数
・Scala プロジェクト内容, 工数, 人数
・Erlang プロジェクト内容, 工数, 人数
・LISP zip開発,(1118行) 不明, 不明
(http://codepad.org/bHvTYKfo)
・LOGO プロジェクト内容, 工数, 人数
・Scheme プロジェクト内容, 工数, 人数
・Mathematica プロジェクト内容, 工数, 人数
・R プロジェクト内容, 工数, 人数
・Unlambda プロジェクト内容, 工数, 人数
・APL プロジェクト内容, 工数, 人数
・XSLT プロジェクト内容, 工数, 人数
・C プロジェクト内容, 工数, 人数
・C++ プロジェクト内容, 工数, 人数
規模あたりの開発工数が少ない
0120デフォルトの名無しさん
2011/07/03(日) 04:30:10.27仕事で使わなくても、ちょっと触ればいいだけだしな。
0121デフォルトの名無しさん
2011/07/03(日) 04:33:58.50話にならんのだがw
0122デフォルトの名無しさん
2011/07/03(日) 04:35:41.94ttp://www.aoky.net/articles/steve_yegge/tour_de_babel.htm
amazonに関しては事実だってな。
0123デフォルトの名無しさん
2011/07/03(日) 04:36:17.87再発明コードで比較してって生産性の比較になんの?
どんだけ行数短いですよコンテスト?
0124デフォルトの名無しさん
2011/07/03(日) 04:39:03.05机上の空論じゃなく事実(実績)を出せ。
プログラマーなんだろ。
文系やら厨房みたいな、俺の想像する生産性なんていらんから。
0125デフォルトの名無しさん
2011/07/03(日) 04:40:29.16なんか始まった?
0126デフォルトの名無しさん
2011/07/03(日) 04:40:49.50全く違うものを比較対象にしろと?
帰納法とか演繹とかしらないの?そもそもバカなの?
0127デフォルトの名無しさん
2011/07/03(日) 04:46:07.64どっちが効率的だなとか考えるわけか・・・。
0128デフォルトの名無しさん
2011/07/03(日) 04:48:03.380129デフォルトの名無しさん
2011/07/03(日) 05:04:22.67awkみたいのが生産性高いことになってしまう。
0130デフォルトの名無しさん
2011/07/03(日) 05:10:35.22>>129 それならそれでいいじゃん。実際生産性がどのくらいか調べたいだけなんだし。
事実を客観的に判断するだけだ。あと何を持って文字列と言ってんのかしらんがzipは
文字列じゃないぞ。スライド辞書とかバイナリだらけ。
0131デフォルトの名無しさん
2011/07/03(日) 05:11:57.24>>113
0132デフォルトの名無しさん
2011/07/03(日) 08:21:58.52代入自体は副作用じゃなく「再代入」が副作用、かな
0133デフォルトの名無しさん
2011/07/03(日) 09:21:48.000134デフォルトの名無しさん
2011/07/03(日) 10:18:02.910135デフォルトの名無しさん
2011/07/03(日) 10:41:39.190136デフォルトの名無しさん
2011/07/03(日) 11:55:03.97それって、ただの手続き型(c、basic)じゃね?
0137デフォルトの名無しさん
2011/07/03(日) 12:14:29.80副作用の有無の話なんだからその例で充分じゃね?
OOPLのオブジェクトだって、コンストラクタの引数で状態を設定したらあとは不変、にすれば副作用は無いんだから
0138デフォルトの名無しさん
2011/07/03(日) 12:31:38.65マルチパラダイムは何でもできるゆえに結局いいところも悪いところも取り込んじゃうし
まだ研究段階を出ていないと思う。
0139デフォルトの名無しさん
2011/07/03(日) 14:17:09.900140デフォルトの名無しさん
2011/07/03(日) 15:49:41.95Cはlispの4倍だってさ。
あと紛らわしいんで実例未調査の言語を外してみた。
規模あたりの開発工数が多い↑
・C zip開発,(4064行), 不明, 不明
(http://codepad.org/ZqNUwnvq)
・LISP zip開発,(1118行) 不明, 不明
(http://codepad.org/bHvTYKfo)
規模あたりの開発工数が少ない↓
未調査言語
・Concurrent Clean プロジェクト内容, 工数, 人数
・Haskell プロジェクト内容, 工数, 人数
・Miranda プロジェクト内容, 工数, 人数
・Lazy K プロジェクト内容, 工数, 人数
・F# プロジェクト内容, 工数, 人数
・ML プロジェクト内容, 工数, 人数
・OCaml プロジェクト内容, 工数, 人数
・Scala プロジェクト内容, 工数, 人数
・Erlang プロジェクト内容, 工数, 人数
・LOGO プロジェクト内容, 工数, 人数
・Scheme プロジェクト内容, 工数, 人数
・Mathematica プロジェクト内容, 工数, 人数
・R プロジェクト内容, 工数, 人数
・Unlambda プロジェクト内容, 工数, 人数
・APL プロジェクト内容, 工数, 人数
・XSLT プロジェクト内容, 工数, 人数
・C++ プロジェクト内容, 工数, 人数
0141デフォルトの名無しさん
2011/07/03(日) 15:51:09.48マ板でやれよ
0142デフォルトの名無しさん
2011/07/03(日) 15:55:54.00これからどの言語使おうってヤツらの参考資料になるだろ。
0143デフォルトの名無しさん
2011/07/03(日) 16:04:38.640144デフォルトの名無しさん
2011/07/03(日) 16:13:45.38NHK朝ドラ、水戸黄門が視聴率があるから一番すごいドラマって力説するか?
0145デフォルトの名無しさん
2011/07/03(日) 16:53:49.73制作期間と使用された技法数を語るようなもんだろ。
視聴者 = ユーザー数 だし。
0146デフォルトの名無しさん
2011/07/03(日) 17:16:06.02例えが的外だなw
正しく対比させてやろう。
■撮影技術
○○技法を使って作られた作品(NHK朝ドラ、水戸黄門等)・・・1000作品
△△技法を使って作られた作品・・・800作品
□□技法を使って作られた作品・・・500作品
水戸黄門の視聴率・・・○%
■プログラム技術
C++を使って作られた作品(Firefox等)・・・1000作品
Javaを使って作られた作品・・・800作品
Perlを使って作られた作品・・・500作品
Firefoxのユーザー数・・・○万人
視聴率=アプリのユーザー数。そんなのもで力説はしない。
力説するとしたら、その技法を使って作られた作品数だ。
0147デフォルトの名無しさん
2011/07/03(日) 17:38:27.10>力説するとしたら、その技法を使って作られた作品数だ。
それだったら普及してない言語はすべからくダメだろ。
その技法をつかって1つの作品を作るのに掛かった費用と期間だろ。
0148デフォルトの名無しさん
2011/07/04(月) 19:52:05.48そもそも手続き言語覚え始めにx=2の次の行でx=3とか違和感ありまくりだったはずだと
0149デフォルトの名無しさん
2011/07/04(月) 20:00:26.33俺も最初は違和感あったねえ、特に初めてBASIC触れたの小学生のときだったから
X = X + 1 が良くて X + 1 = X がダメな理由も分からなかった
左から右のほうがそれっぽいじゃん!とか思ってたw
0150デフォルトの名無しさん
2011/07/04(月) 20:46:57.44そもそも「言語の覚え始めの頃」という時期があったのかどうか
最初俺はベーマガとかプログラムポシェットのソースを読み上げる係だった
で、にーちゃんがそれを聞き取って、画面も見ずにひたすら打ち込む
にーちゃんが高校行ってからは、俺一人でソースを読んで打ち込んでた
そうこうしてるうちに、「こうプログラムすれば」->「こう動く」
という繋がりが頭の中にいっぱい作られた
何故それでできるのか、理由は置き去り
文法や理由を気にしだしたのは、ずーーーっと後のこと
> X = X + 1 が良くて X + 1 = X がダメな理由も分からなかった
そんな疑問、今の今まで思いつきもしなかった
お前等すげぇな
0151デフォルトの名無しさん
2011/07/04(月) 22:29:09.050152デフォルトの名無しさん
2011/07/04(月) 23:12:55.45mov eax, 4
と
movl $4, %eax
とか
0153デフォルトの名無しさん
2011/07/04(月) 23:37:00.57いい加減UNICODEでプログラミングしようぜ
⇒ とか ≠ とか使えるんだぞ。
0154デフォルトの名無しさん
2011/07/04(月) 23:41:40.760155デフォルトの名無しさん
2011/07/04(月) 23:49:03.41algol使え
0156デフォルトの名無しさん
2011/07/04(月) 23:51:47.870157デフォルトの名無しさん
2011/07/04(月) 23:59:21.290158デフォルトの名無しさん
2011/07/05(火) 08:09:08.63副作用のデメリットなんて昔から言われてたし
昔と比べて関数型の生産性が上がってるとは思えないし。
0159デフォルトの名無しさん
2011/07/05(火) 08:21:27.49マルチコアCPUの有効利用のためにマルチスレッド化が必須になって
手続型ではデバッグが難しくなったからではないでしょうか。
0160デフォルトの名無しさん
2011/07/05(火) 08:45:01.110161デフォルトの名無しさん
2011/07/05(火) 10:45:48.770162デフォルトの名無しさん
2011/07/05(火) 10:52:38.16クロージャの導入を計画したりしてるからその流れもあるんじゃね
0163デフォルトの名無しさん
2011/07/05(火) 12:34:57.46インパクトの有るところでは、parl本家より何ヶ月も早く(当時)最新の仕様に準拠したparlインタプリタをhaskellで実装したのがきっかけだったような
0164デフォルトの名無しさん
2011/07/05(火) 22:59:41.020165デフォルトの名無しさん
2011/07/05(火) 23:03:38.19Javaでイベントハンドラ的なものを記述するためにいちいち匿名クラス書いたりしてる
んならクロージャのありがたみは分かるはず
0166デフォルトの名無しさん
2011/07/05(火) 23:03:58.99イテレータとか書きやすくならね?
0167デフォルトの名無しさん
2011/07/05(火) 23:05:49.030168デフォルトの名無しさん
2011/07/05(火) 23:06:31.56いや別に
0169デフォルトの名無しさん
2011/07/07(木) 11:22:58.89元の論文"Software Transactional Memory"は言語に依存しない。
プログラミング言語で上手く扱う画期になったのが、
MSRの人たちが書いた"Composable Memory Transactions"
これはもちろんHaskellで取り扱ってる。
モナドの知識がSTMを扱う上で非常に役にたった。
0170デフォルトの名無しさん
2011/07/07(木) 21:36:13.200171デフォルトの名無しさん
2011/07/07(木) 21:49:35.63Peyton
Pyton
Python
。。。なるほどな
0172デフォルトの名無しさん
2011/07/07(木) 23:35:48.37楽に勤怠管理のシフトやエキスパートシステムこさえたい
0173デフォルトの名無しさん
2011/07/08(金) 00:00:24.88けど実際そうだしなw
CLRべったりなことやっていたのは最初の一二年だけだったけど。
0174デフォルトの名無しさん
2011/07/09(土) 01:21:31.340175デフォルトの名無しさん
2011/07/09(土) 06:50:07.25名前だけね
0176デフォルトの名無しさん
2011/07/09(土) 07:11:53.06っぽい言語ならね
0177デフォルトの名無しさん
2011/07/09(土) 08:10:05.74理由は、yaccやJavaCCみたいなコンパイラコンパイラ言語は関数型言語だから
0178デフォルトの名無しさん
2011/07/09(土) 08:11:57.320179デフォルトの名無しさん
2011/07/09(土) 08:39:44.870180デフォルトの名無しさん
2011/07/09(土) 08:40:40.090181デフォルトの名無しさん
2011/07/09(土) 09:07:39.28・ファーストクラスの関数オブジェクトを持つ言語
・関数は副作用を持たない(持たせる方にテクニックが必要)
・参照透過性が保たれる
0182デフォルトの名無しさん
2011/07/09(土) 10:39:50.05関数型プログラミングの考え方が浸透するかどうかに比べたら重要じゃないんじゃないか?
「Xは関数型言語だ」
として広く知られるよりも
「Xはプログラマがこういう性質を持つコードを書く手助けをするのでこういう風に楽ができる」
と広く知られて、それがまさに関数型プログラミングの利点なんだと広まる方が良さそうに感じるし
もっと言えば今プログラミングを学ぶ人がループや分岐を教わるときに
「構造化プログラミングだ!」と意識したりしないくらい浸透すれば言うことないと思う
0183デフォルトの名無しさん
2011/07/09(土) 11:51:43.42↓
「じゃあオブジェクト指向言語である○言語にもその機能を取り入れよう」
↓
「○言語に搭載されているXは関数言語由来なんだ」
↓
「だから教養知識として関数型言語を知っておくといいよ」
↓
「でも実際に使うのは○言語だけどね。使える人多いし、関数型言語と同じことできるし」
↓
「実際の開発ではフレームーワークやライブラリの数と質のほうが重要だからね」
0184デフォルトの名無しさん
2011/07/09(土) 12:04:08.69「オブジェクト指向言語である○言語」を実装したら次の書き込みをしてください。
それまで書き込み禁止ね。
0185デフォルトの名無しさん
2011/07/09(土) 12:27:40.13もしそういう言語があるのなら、それのどこに問題があるの?
>>182の最後に書いたのはまさにそういう「関数型プログラミングとは何か?普段のやり方のこと」という状態
プログラミング言語の紹介で関数型言語だと書くのが
今「この言語にはなんと分岐とループ、そして驚くべきことにサブルーチンがあります!」と書くくらいスベる状態を「言うことない」と書いた
OOPもまだ到達してない地平だけど
0186デフォルトの名無しさん
2011/07/09(土) 12:52:56.46問題はない。
ただ「実用的言語+関数型の機能」 VS 「関数型言語 - 実用的な機能」
という比較になるのが現実だから
どうやっても関数型言語は普及しないってだけ。
関数型言語の機能が追加された実用的な言語としては
JavaやC#がある。
0187デフォルトの名無しさん
2011/07/09(土) 12:58:16.02F#でOOPも使って書くコードの楽さ>>>>>>>>>>>>>>>>>>>>>>C#で関数型の機能も使って各コードの楽さ
なんだが。
より関数型的に書くならC#でかくのはCでOOPする並みに苦痛。
0188デフォルトの名無しさん
2011/07/09(土) 13:10:28.04どこにあるのか教えてくれよ。
0189デフォルトの名無しさん
2011/07/09(土) 13:30:36.010190デフォルトの名無しさん
2011/07/09(土) 13:37:17.87Haskell
0191デフォルトの名無しさん
2011/07/09(土) 13:46:56.60Haskellのどこがオブジェクト指向言語だ
0192デフォルトの名無しさん
2011/07/09(土) 14:16:35.16参照透明性・・・引数の情報だけを使って処理を行えば良い。
遅延評価・・・ifを使って必要なときに処理をするロジックを書けばよい。
0193デフォルトの名無しさん
2011/07/09(土) 15:46:50.070194デフォルトの名無しさん
2011/07/09(土) 15:53:23.60return a+b;
}
と書けるからといってCの関数は参照透過性が保証されるとは言わないと思うが
>>186
「関数型言語−実用的な機能」は実用的な機能のない関数型言語だから、それだけでは関数型言語が流行らない説明にはならない
「ものが切れないステンレスのハサミより、ものが切れる鉄のハサミの方が売れるから、ステンレスのハサミは作っても売れない」と主張されたら、それはおかしいと感じるだろ?
ものが切れるステンレスと鉄のハサミで比較するか、ステンレスでは十分鋭い刃が(現時点の技術では、もしくは原理的に)製造できない根拠が必要じゃないか?
0195デフォルトの名無しさん
2011/07/09(土) 15:57:35.45http://d.hatena.ne.jp/w_o/20061008#p1
0196デフォルトの名無しさん
2011/07/09(土) 16:05:42.60だから関数ごとに、参照透過性が保証されますって
ドキュメント残しておけばいいだけだって。
どうせ、参照透過性が保証された状態で、
やれることはどちらも変わらないのだから。
0197デフォルトの名無しさん
2011/07/09(土) 17:07:03.360198デフォルトの名無しさん
2011/07/09(土) 18:30:27.01関数型言語だって、副作用をもたらす関数は作れるわけで、
参照透過性を強制してないじゃん。
結局はドキュメントでしょ?
0199デフォルトの名無しさん
2011/07/09(土) 18:45:04.600200デフォルトの名無しさん
2011/07/09(土) 18:49:25.98その関数を使う関数は、普通の関数になるから
あまり意味はない。
0201デフォルトの名無しさん
2011/07/09(土) 18:52:46.64関数型言語である事と遅延評価を自然に使える言語である事は必ずしも一致しないんじゃないの
0202デフォルトの名無しさん
2011/07/09(土) 19:09:31.06関数型言語では、そうはならない。
0203デフォルトの名無しさん
2011/07/09(土) 19:15:26.61ようは副作用をもたらさない関数には
特殊なアノテーションを付けるようにして、
副作用をもたらさない関数から呼び出せる関数は
アノテーションがついている物だけとすればいいわけだし。
関数はstatic限定にする必要があるね。
0204デフォルトの名無しさん
2011/07/09(土) 19:46:50.68作れるけど、そういう部分は他とは違って見えるし、検査も行える
Cでコメントや別のファイルに「この関数は副作用を持たない」と書いた所で、それを守らなくても何も起きない
逆に副作用を持たない関数に副作用を持たないことを書き添え忘れても何も起きない
デフォルトは「副作用を持つかもしれないし、持たないかもしれない。副作用について誰も関知しない」だから
ドキュメントを書くことが求められるけど、書いたことを守っても守らなくても(または現状を正しく書いても間違って書いても)自分がやったことに気付くマークがない
だから「型宣言は強制するけど型検査はしない」ようなものだと書いてる
>>203
それはD言語のpureキーワードそのもの
逆の方が付け忘れた時の挙動が親切だが、FFIを考えるとそうなるな
0205デフォルトの名無しさん
2011/07/09(土) 23:25:53.15> だから「型宣言は強制するけど型検査はしない」ようなものだと書いてる
分かりにくい。
「動的言語みたい」でいいだろw
0206デフォルトの名無しさん
2011/07/10(日) 00:20:36.21動的言語は実行時に型検査するけど
Cは副作用についてコンパイル時にも実行時にも検査しない
0207デフォルトの名無しさん
2011/07/10(日) 01:16:14.010208デフォルトの名無しさん
2011/07/10(日) 01:32:58.61なんでやらないんだろう
0209デフォルトの名無しさん
2011/07/10(日) 01:36:46.220210デフォルトの名無しさん
2011/07/10(日) 01:49:51.83簡単じゃない。
0211デフォルトの名無しさん
2011/07/10(日) 02:28:32.541.メモ帳を開き"意見書"とタイトルを打ちます
2.希望の勤怠管理シフトデザインを入力し文書化します
3.上司の高田課長に提出します
4.高田課長から、篠原部長、織田常務、杉下社長まで承認が通るのをまちます
5.承認経路から与えられた管理者、総務の小杉に勤怠管理計画を提出します
6.新規勤怠管理計画始動のメールを社内全体に送信します
7.定期的な改訂、調査を行い今後の改善をしていきます
終わり
0212デフォルトの名無しさん
2011/07/10(日) 02:37:48.29#define int const int
#define char const char
・
・
・
略
0213デフォルトの名無しさん
2011/07/10(日) 07:02:24.300214デフォルトの名無しさん
2011/07/10(日) 07:12:24.940215デフォルトの名無しさん
2011/07/10(日) 07:34:02.68このレベルなのか・・・
0216デフォルトの名無しさん
2011/07/10(日) 11:09:21.560217デフォルトの名無しさん
2011/07/10(日) 12:11:08.95カレーかや部分適用語るなら圏論におけるExponentiatioonまでは知っとけよ
0218デフォルトの名無しさん
2011/07/10(日) 12:28:20.57>>204の最後にあるじゃん・・・
0219デフォルトの名無しさん
2011/07/10(日) 12:44:57.23Cはconstがちょっとアレなんで、Dと違って下位互換性ある形では
少々難しいかと
例えば以下のbの値はa経由で変更できる
int a = 0;
const int *b = &a;
printf("%d\n", *b); // 0
a = 1;
printf("%d\n", *b); // 1
マルチスレッドの場合、関数に渡したbが内部処理中に
別のスレッドによって変更されない保証ができない
まあ、副作用の無い関数にはポインタ変数渡せないようにするとか
方法はありそうだが
0220デフォルトの名無しさん
2011/07/10(日) 13:13:27.270221デフォルトの名無しさん
2011/07/10(日) 13:34:28.070222デフォルトの名無しさん
2011/07/10(日) 13:56:29.71こうすると b 経由では *b も b も変更できなくなるけど
a 経由で*bを変更できるのは変わらない
0223デフォルトの名無しさん
2011/07/10(日) 14:23:47.70配列や再帰データ構造が絡んだだけで、ほぼ解析不能になる。
0224デフォルトの名無しさん
2011/07/10(日) 14:42:31.150225デフォルトの名無しさん
2011/07/10(日) 14:46:18.09つまり、文字列を引数に取る関数はどうすればいいのでしょうか?
0226デフォルトの名無しさん
2011/07/10(日) 14:46:38.64strcmpすら使えん。
0227デフォルトの名無しさん
2011/07/10(日) 14:48:38.890228デフォルトの名無しさん
2011/07/10(日) 14:50:30.550229デフォルトの名無しさん
2011/07/10(日) 14:51:34.610230デフォルトの名無しさん
2011/07/10(日) 15:02:31.12restrictは違反したら未定義動作になるけど
エラーになるわけじゃないからなぁ
0231デフォルトの名無しさん
2011/07/10(日) 15:04:45.280232デフォルトの名無しさん
2011/07/10(日) 18:14:28.800233デフォルトの名無しさん
2011/07/13(水) 20:28:11.05問題はループだよな。副作用抜きなら再帰しか無いわけだし、末尾最適化に祈るしか無い。
0234デフォルトの名無しさん
2011/07/13(水) 21:25:57.660235デフォルトの名無しさん
2011/07/14(木) 00:52:39.96あほだろ
0236デフォルトの名無しさん
2011/07/14(木) 07:41:51.56配列の代わりにポインタのない構造体を使うってのはつまり型と要素数毎に
struct int3 {
int item1;
int item2;
int item3;
}
などを定義するってことか?馬鹿馬鹿しい
それで何かが良くなるとも思えないし、むしろ悪くなってるように見える
副作用を認めないと再帰しか認められないというのも正しくない
forやwhileによるループの表現力に影響するのは副作用の制限ではなく再代入の制限
0237デフォルトの名無しさん
2011/07/14(木) 07:53:13.06構造体にくるめば、関数の引数や戻り値として、配列を、その先頭を指すポインタではなく、
中身まるごと値としてやりとりできるから、ってことだろ。わかりづらいが
0238デフォルトの名無しさん
2011/07/14(木) 07:56:49.95for (i = 0; i < len; i++) { ... }
という文はiに再代入しているが、この文が含まれる関数が外側から見て参照透過性を壊すとは限らないという意味
0239デフォルトの名無しさん
2011/07/14(木) 08:15:47.36その方法も配列のサイズを宣言時に決めないといけないんじゃないか?
0240デフォルトの名無しさん
2011/07/14(木) 09:00:48.03「だいたいは凌げる」の「だいたい」にそれは入らないってだけだろ。
0241デフォルトの名無しさん
2011/07/14(木) 09:22:15.690242デフォルトの名無しさん
2011/07/14(木) 09:23:16.360243デフォルトの名無しさん
2011/07/14(木) 11:12:12.700244デフォルトの名無しさん
2011/07/14(木) 11:34:50.03できるんだし
0245デフォルトの名無しさん
2011/07/14(木) 11:36:49.28トランスレータ書いた方がマシなレベル
0246デフォルトの名無しさん
2011/07/14(木) 12:15:51.500247デフォルトの名無しさん
2011/07/14(木) 12:17:05.171960年代に逆戻りだな。
0248デフォルトの名無しさん
2011/07/14(木) 12:42:13.49Stalin や Chicken という Scheme コンパイラはそれぞれの理由で C のコードを吐くけど、
基本的に人間が書くようなのとは全く別物のコードになるから、全然話が違うと思う。
>>247 どこが?
なんでも値全体をコピー、なんてのはむしろ最近の発想だと思うが。
PHP で配列を参照渡しじゃなくて普通に渡した時とか。
ていうか基本的にGCとかないCでやろうというのが無謀で、もうちょっとなんとかなる
言語でやろうよ、とは思うけど。
0249デフォルトの名無しさん
2011/07/14(木) 22:34:49.23これははずかしい
0250デフォルトの名無しさん
2011/07/14(木) 22:36:36.230251デフォルトの名無しさん
2011/07/14(木) 23:13:27.670252デフォルトの名無しさん
2011/07/14(木) 23:14:16.930253デフォルトの名無しさん
2011/07/19(火) 06:24:42.440254デフォルトの名無しさん
2011/07/20(水) 22:23:00.00RVO効く環境なら引数で配列取るのと同等の速度が出るけどな。
0255デフォルトの名無しさん
2011/07/21(木) 12:09:25.56素人がわかりやすく勉強するには、どの言語+ドキュメントが良いでしょうか?
Lispで階乗書いて、それから先が進まない程度のレベルなんですが。
0256デフォルトの名無しさん
2011/07/21(木) 12:25:29.76プログラミングhaskellが入門者向けの内容で、薄くて良いよ
0257デフォルトの名無しさん
2011/07/21(木) 12:32:25.72早速ありがとうございます。
0258デフォルトの名無しさん
2011/07/21(木) 12:50:15.230259デフォルトの名無しさん
2011/07/30(土) 01:49:21.08こんなの見つけた
誰か行く人いる?
0260デフォルトの名無しさん
2011/09/26(月) 19:28:15.850261デフォルトの名無しさん
2011/09/26(月) 19:40:51.26> デフォルトスタンダード
【審議中】
∧,,∧ ∧,,∧
∧ (´・ω・) (・ω・`) ∧∧
( ´・ω) U) ( つと ノ(ω・` )
| U ( ´・) (・` ) と ノ
u-u (l ) ( ノu-u
`u-u'. `u-u'
0262デフォルトの名無しさん
2011/09/26(月) 20:11:30.940263デフォルトの名無しさん
2011/09/26(月) 20:18:30.760264デフォルトの名無しさん
2011/09/26(月) 21:03:36.710265デフォルトの名無しさん
2011/09/27(火) 01:14:55.21デファクトスタンダードなら、Haskellがそのために作られた。
実用的な汎用言語であるとともに、関数型言語の可能性を研究する目的で作られてる。
0266デフォルトの名無しさん
2011/09/27(火) 07:13:57.12どれが一番多く使われているかだろうがボケ
0267デフォルトの名無しさん
2011/09/27(火) 07:26:35.95ただし他人の同意を得られるとは限りません。
0268デフォルトの名無しさん
2011/09/27(火) 10:42:32.21> デファクトスタンダードなら、Haskellがそのために作られた。
これはイギリス内の話です。念の為。
フランスにはOCaml派がいますし、
世界各地にSML派がいます。
0269デフォルトの名無しさん
2011/09/27(火) 11:56:45.850270デフォルトの名無しさん
2011/09/27(火) 11:58:35.55僕はHaskellとSchemeしかやってないけど。
0271デフォルトの名無しさん
2011/09/27(火) 12:03:42.420272デフォルトの名無しさん
2011/09/27(火) 17:46:25.690273デフォルトの名無しさん
2011/09/27(火) 17:56:37.66かつてはCがそれに近かったが、いまは違うだろう。
0274デフォルトの名無しさん
2011/09/27(火) 18:31:15.48JAVAもかなり多いが。
洋物ならPythonとか。
まあ、Cバリアントは非常に多いから。細かい部分はおいておけば、
Cを理解できないプログラマ等はかなり少ないと思う。
研究者なんかだとMATLABしか理解できないって人は実際にいたが。
0275デフォルトの名無しさん
2011/09/27(火) 19:17:37.960276デフォルトの名無しさん
2011/09/27(火) 19:22:37.460277デフォルトの名無しさん
2011/09/27(火) 22:09:39.28それは別として、C++のテンプレートは関数型。
あとXSLTも関数型。
0278デフォルトの名無しさん
2011/09/27(火) 23:35:24.24単に、**という新機能・新構文を加えた、だけでいいと思うが
その方が何ができて何ができないかが明確に分かる
関数型の考えが取り入れられた言語を使ってる人たちの大半は、
そもそも関数型ってどういうものか実際のところ理解していない
ならば、関数型の考えを取り入れたと言ったところで、
なんだか凄いという曖昧な印象しか持ち得ない
0279デフォルトの名無しさん
2011/09/28(水) 00:11:18.270280デフォルトの名無しさん
2011/09/28(水) 01:22:56.68>なんだか凄いという曖昧な印象しか持ち得ない
それが狙いなんじゃないの?
すごそうだから使ってみようって思ってもらうためのキャッチコピー。
0281デフォルトの名無しさん
2011/09/28(水) 04:47:41.88なんて言われると、まるでマルチパラダイムこそ素晴らしく
「単なる関数型に勝る」という意味合いが含まれるな。
あ、でも実際そうなのか
0282デフォルトの名無しさん
2011/09/28(水) 07:12:16.38言語開発者がそう言って宣伝するのなら分かる
が、たいていは記者がそう言っている
マルチパラダイムを大々的に宣伝してるのも、
言語開発者じゃなくてIT系の記者
0283デフォルトの名無しさん
2011/09/28(水) 10:01:26.13(1) 条件判定式(if/case式)がある
(2) 局所宣言式(let/where式)がある
(3) 末尾再帰の最適化
これらすべてを満たせば、大半の人には関数型であると同意してもらえると思う。
ML/Haslell/Schemeはすべて満たすから文句無し。(ただしLispは(3)がNG?)
Smalltalk/Rubyは(1)のみで、Python/JavaScriptは全滅だから関数型とは認められない。
0284デフォルトの名無しさん
2011/09/28(水) 10:22:01.57まずはクロージャーがあるかどうかだろう。
Cは関数ポインタがあるが、クロージャーはないので、関数型言語ではない(GCC拡張ならある)。
でも、JavaScriptと(2)については、スコープを任意につくるためにfunction(){ ... }();とかやる方法が定着している。
キモイけど。
0285デフォルトの名無しさん
2011/09/28(水) 10:44:11.96C言語の枠内で可能な限りのことをやってみました、という点では非常に面白いのだが。
0286283
2011/09/28(水) 11:28:52.95>まずはクロージャーがあるかどうかだろう。
関数型言語を特徴付ける基準にはいくつかあって、クロージャはその一つだと思う。
でもSmalltalk/Rubyならブロックがあるから、関数型か否かを決める境界線(判断基準)としてクロージャは
弱いんじゃないかと考えて落とした。(他にラムダ式も同様の理由で判断基準から落とした。)
>でも、JavaScriptと(2)については、スコープを任意につくるためにfunction(){ ... }();とかやる方法が定着している。
これは無名関数を定義してからすぐ呼ぶことで、関数定義内の局所式(... の部分)を評価しているんだね。
確かに結果的には局所宣言式になるプログラミング技法だけど、言語要素としては実現されていないから
判断基準としてはNGになると思う。同じ事はRubyでも proc { ... }.call と書ける訳で、これをOKとは認めたくない。
0287283
2011/09/28(水) 11:37:42.50局所宣言式の基準(2)は限定付きでOKかも。
0288デフォルトの名無しさん
2011/09/28(水) 11:39:51.65ゴールが先にあって、そこから定義を逆算してるのか?
0289デフォルトの名無しさん
2011/09/28(水) 11:54:49.680290283
2011/09/28(水) 12:02:01.58そういうことになるね。
>>288の言語は(程度の差はあるけれど)どれも関数型プログラミングができる。
ここで関数型プログラミングというのは、副作用(破壊的代入や入出力)を極力抑えたプログラミング技法。
ただし、それはあくまで「関数型プログラミング技法」であって「関数型言語」ではない、という考え方。
では境界線をどこに引くべきか?と考えて残ったのが、>>283の「3項目をすべて満たす」という条件。
0291デフォルトの名無しさん
2011/09/28(水) 12:34:38.980292283
2011/09/28(水) 13:06:08.88・関数型言語(誰も文句無し)
・関数型プログラミングが可能な言語
・それ以外の手続き型言語
Haskell
---- 壁1. 純粋性(副作用)の壁 ----
SML/OCaml
---- 壁2. 型推論の壁 ----
Scheme
---- 壁3. 末尾再帰最適化/局所定義式の壁 ----
========<< 越えられない壁 >>========
Smalltalk/Ruby
---- 壁4. 条件判定式の壁 ----
Python/JavaScript
---- 壁5. クロージャ/ラムダ式の壁 ----
========<< 越えられない壁 >>========
C/C++/Java/Perl...etc
0293デフォルトの名無しさん
2011/09/28(水) 13:06:35.190294デフォルトの名無しさん
2011/09/28(水) 13:11:03.510295デフォルトの名無しさん
2011/09/28(水) 13:46:33.230296デフォルトの名無しさん
2011/09/28(水) 15:51:15.70「ファーストクラスの関数オブジェクトを持つ言語」ってのがある。
関数へのポインタしか使えないとかなら明確に違うとは言えそうだけど。
0297デフォルトの名無しさん
2011/09/28(水) 16:10:48.13しかも間違いだらけ…。
0298デフォルトの名無しさん
2011/09/28(水) 16:13:01.130299デフォルトの名無しさん
2011/09/28(水) 16:47:05.740300283
2011/09/28(水) 17:09:22.56確かにif式はあるけど、Pythonのif式ってすごく特異というか汚い構文ですよね。
value = then_value if predicate else else_value
たとえば条件判定がネストした処理をコード化した場合、SMLだと
val value =
if x == 0 then (
if y == 0 then
1
else
2
) else (
.... 省略 ....
)
同じ処理をRubyなら
value =
if x == 0 (
if y == 0
1
else
2
end
) else (
.... 省略 ....
)
と、ほぼ類似のコード構造で、しかも適切なインデントで記述できます(=可読性のある記述ができる)。
SchemeとSmalltalkは構文が異なりますけど、これらの言語でも適切なインデントでコード化できます。
でも、このPhytonの構文だと、(自分の知識では)可読性のあるコードが書けないと思います。いかがでしょうか?
0301283
2011/09/28(水) 17:25:40.87失礼、自分のPerl学習はPerl 4で止まっていました。(Perl 5のOOPがアレなのでRubyへ移行した為...)
Perlの無名関数はラムダ式です。>>283は誤りで、PerlはPython/JavaScriptと同じグループに入れるのが適切です。
>>299
いいかえると、Pythonはデコレータを(コーダが意識的に)使わなければ末尾再帰が最適化されない、ということです。
真の関数型言語であれば、言語処理系(インタプリタ)が自動的に判断して最適化処理が実行されるべきでしょう。
また、Rubyでも同様のプログラミング技法を用いれば末尾再帰の最適化が行えるようなので、Pythonと大差ありません。
・Rubyで末尾再帰最適化をする。 - athosの日記
http://d.hatena.ne.jp/athos/20110119/p1
0302デフォルトの名無しさん
2011/09/28(水) 17:58:41.36言語仕様として末尾再帰最適化を必要条件にしてるのはSchemeくらいだぞ
0303デフォルトの名無しさん
2011/09/28(水) 18:40:56.50そこらのプログラム変形によるものはぜんぜん proper じゃないし、
下手するとスレッドセーフ(再入可能)どころか再利用可能ですらなかったりする。
>>302
逆に、言語仕様で末尾再帰最適化をうたってるのは Scheme ぐらいだけど、
ML や Haskell の言語仕様であれば、末尾再帰最適化はそんなに困難じゃないので。
(Cとかは、特に相互再帰の場合は不可能)
0304283
2011/09/28(水) 18:44:52.73スマンけど、言語仕様(構文)と処理系(実装)とを一緒にして比較基準とさせてください。
手続き型言語のループ(反復)が、関数型言語ではすべて再帰として表現されるということは常識だと思います。
たとえば1万回のループは1万回の再帰呼び出しになる訳で、もしも1万回の再帰呼び出しくらいで
スタックオーバーフローが発生するようでは、真の関数型言語処理系として使い物にならないと断言します。
実際、普及しているHaskell/SML/OCamlの「実用的な言語処理系」は、すべて末尾再帰の最適化を実装しているハズ。
>>283の判断基準は(ソフトウェア開発の現場における)実用性という観点で選んでいます。
理論的/学術的には不正確なものだと思いますが、こういう基準もあると理解を願います。
もちろん全く別の切り口で判断基準を選んで提案してもらえれば、それはそれで大いに歓迎します。
0305デフォルトの名無しさん
2011/09/28(水) 19:00:55.36あと lambda がない関数型言語なんてありえないから。
そして lambda が、「(ソフトウェア開発の現場における)実用性」とつながるかどうかは
俺は全く知らんが。
あるいは ML はいざとなったら副作用でプログラミングできることが、
「(ソフトウェア開発の現場における)実用性」として結構高く評価されているように
感じるのだが、そうすると「(ソフトウェア開発の現場における)実用性」で評価するのは、
Haskell を落とす結果につながると思うのだがどうか?
0306デフォルトの名無しさん
2011/09/28(水) 19:05:57.44オレオレ基準なんてどうでもいいよ
0307デフォルトの名無しさん
2011/09/28(水) 19:18:56.39末尾再帰を、スタックを消費しない形へ自動的に変換してくれるが、
それが「最適化へと繋がるか」というと、必ずしもそうではない
他言語ならまず間違いなく処理速度もメモリ消費量も最適化へと導かれるが、
Haskell の場合は「それがどう遅延評価されるか」をちゃんと意識しないと、
末尾再帰の処理が最適化へと繋がるか自信を持って言えない
0308デフォルトの名無しさん
2011/09/28(水) 19:22:34.24そもそも、ある言語が関数型であるか否かを判断する「理由」はなに?
関数型であるか否かを判断する必要があるのってどういう場合?
0309デフォルトの名無しさん
2011/09/28(水) 19:29:07.88同じ末尾再帰なら、スタックを消費するより消費しない方が良いに決まってるだろ
0310283
2011/09/28(水) 19:29:30.30>あと lambda がない関数型言語なんてありえないから。
これは当然ですね。>>286で書いたように、ラムダ式/クロージャの概念は非関数型言語でも導入が進んでいるので、
ある言語が関数型か否かの判断基準(境界線)としては弱いと考えて除外したにすぎません。
>そうすると「(ソフトウェア開発の現場における)実用性」で評価するのは、
>Haskell を落とす結果につながると思うのだがどうか?
Yesです。いわゆる一般的なソフトウェア開発現場に(正規順評価を用いる)Haskellは普及しないであろうと予測していますし、
少なくとも自分であれば現場には(作用順評価を用いる)ML族の導入を選びます。
0311デフォルトの名無しさん
2011/09/28(水) 19:32:54.94Haskell
---- 壁1. 純粋性(副作用)の壁 ----
SML/OCaml/C++11
---- 壁2. 型推論の壁 ----
Scheme
---- 壁3. 末尾再帰最適化/局所定義式の壁 ----
========<< 越えられない壁 >>========
Smalltalk/Ruby
---- 壁4. 条件判定式の壁 ----
Python/JavaScript
---- 壁5. クロージャ/ラムダ式の壁 ----
========<< 越えられない壁 >>========
C/C++/Java/Perl...etc
0312デフォルトの名無しさん
2011/09/28(水) 19:46:26.26日本語版SICPで使ってるようなキモイ無理やり訳した日本語使わんと普通に正格/非正格って言えばいいじゃない
0313デフォルトの名無しさん
2011/09/28(水) 20:23:27.69最近、余再帰と言うのも厳密には違ってたという話があったかもしれないがそれはともかく。
末尾呼び出しになるように手でコードを変形すると、引数に蓄積するように
なるけど、そういうことすると Haskell じゃ効率悪いかもよ、って話でしょ。
それはそれで正しいけど、そのことは proper tail call がちゃんと tail call elimination されるか
どうかという話にはかかわってこない。
0314283
2011/09/28(水) 20:33:17.09正直言って、あまり考えていないです。
「「分ける」こと「わかる」こと」という分類学の本(講談社学術文庫)がありますけど、
関数型であるか否かを考えることで関数型言語とは何かを理解しようとしているだけです。
あえて言えば、局面に応じた言語の使い分けですね。
デフォはRuby、でもここはSMLでも書き直そう、ただここだけはHaskellのほうが直感的に書ける....というふうに。
0315デフォルトの名無しさん
2011/09/28(水) 21:23:56.47> あえて言えば、局面に応じた言語の使い分けですね。
実用的な観点で分類をしようとしているそうだが、
> デフォはRuby、でもここはSMLでも書き直そう、ただここだけはHaskellのほうが直感的に書ける....
そのような細かな粒度で使用言語を切り替えることが本当に実用的なのか、
もう一度よく考えてみた方がよくないか
そのようなことをしていて本当に生産性や保守性が高まるの?
(というか、今まで実際に高まった?)
そんなことよりも、言語はある程度柔軟性のあるひとつのものに決めておいて、
その上で、ここで関数型の考え方を応用すれば問題をエレガントに解決できないか、
関数型の方で解決した事例の方法論がここでも使えないか、
それともここはオブジェクト指向の**で考えた方が解決できそうか、
と考える方がよほど実用的だと思う
そう考えれば、何かの機能がデフォルトで使えるかどうかで分類するより、
関数型の方法論が流用し易いか、手続き型の方法論が流用し易いか、
という観点で分類した方がいいんじゃないのか
0316デフォルトの名無しさん
2011/09/28(水) 21:24:28.67C++にくっついてるテンプレートという言語は純粋性の壁の向こうに居るでしょ。
モナドすら無いんだぜ。
0317283
2011/09/28(水) 23:24:02.75関数型言語に対するアプローチは人それぞれ色々とあっていいと思います。
ただし、もしも最初に言語を決めて方法論を選ぶということであれば、自分の場合はRubyで決まりです。
SMLは片手間に半年ほど前から触り始めたにすぎず、
ようやく数Kstepほどのコードが書けるようになった程度の経験しかありませんから。
今はSMLの学習で得た関数型設計法/プログラミング技法をRubyソフトウェア開発へ反映させているところ。
現状の成果物(Rubyコードだけ、設計書は準備中)を以下の場所に置きました。
http://www.h6.dion.ne.jp/~machan/tmdoc/example/_tmdoc/html/tmdoc.div.sources.html
(正式リリースではないので、この文書はホームページからはリンクを張っていません)
簡単にコードを解説すると、コード中のtransformer/下のモジュール群は純粋な関数定義で、
model/下のクラス群が抽象データ型定義です。
またtmstd/lsm下のLSMクラス群は、直積/直和/集積(列/集合/写像)という関数型データ構造を表現しています。
0318デフォルトの名無しさん
2011/09/29(木) 00:39:55.69これをするプログラミング言語が関数型言語であり、これが本質です
それ以外の末尾再帰最適化や条件判定式、局所宣言式など諸々は全て、
個々のプログラミング言語が個々の目的の為に加えた飾りです
IOへのアクセス手段も、外部ライブラリへのアクセス手段も飾りです
それが実用かどうかは、関数型言語かどうかとは一切関わらない別問題です
100%この本質だけでプログラミング言語が作られている訳ではもちろんありません
ですが、基本理念としてこの本質を据え、その上でこの本質が活きるよう、
できるだけ壊さないよう、実用や教育(や遊び?)といった目的に応じて飾りが加わります
本質を忘れると、本質を活かすように加えられた飾りを上手く活用できません
本質を忘れると、馬鹿な考えに至ったり、関数型プログラミング言語で問題を解決することが
非常に困難になります
「関数型の特徴を取り入れた」と一般的に言っているのは本質を忘れた馬鹿な発言のいい例です
それは、ある複数の関数型プログラミング言語が共通して持つ「便利な飾り」を、
取り入れ先のプログラミング言語に合うように仕立て直したというだけのことです
本質を考えれば、関数型言語としての特徴を取り入れた訳では全くないことが分かります
0319デフォルトの名無しさん
2011/09/29(木) 03:41:23.360320デフォルトの名無しさん
2011/09/29(木) 08:25:05.48本質云々で便利な飾りを無視するのはちょっとアレだろ。
0321デフォルトの名無しさん
2011/09/29(木) 08:50:49.900322デフォルトの名無しさん
2011/09/29(木) 09:07:34.980323デフォルトの名無しさん
2011/09/29(木) 11:33:38.23一番上にFP加えてくれ。
0324デフォルトの名無しさん
2011/09/29(木) 11:37:01.25もともとACTORの研究から生まれた。
0325デフォルトの名無しさん
2011/09/29(木) 11:38:48.850326デフォルトの名無しさん
2011/09/29(木) 12:35:23.89> ですが、基本理念としてこの本質を据え、その上でこの本質が活きるよう、
> できるだけ壊さないよう、実用や教育(や遊び?)といった目的に応じて飾りが加わります
この文章を意図的に無視して意見する方達ばかりで残念です
0327デフォルトの名無しさん
2011/09/29(木) 12:46:14.020328デフォルトの名無しさん
2011/09/29(木) 12:58:29.170329デフォルトの名無しさん
2011/09/29(木) 13:18:10.38十分レス着いてると思うが。。。(>>320-321)
欲張りだなぁ。。。
0330デフォルトの名無しさん
2011/09/29(木) 15:26:54.48OCamlってforもwhileもあるんだけど
ttp://caml.inria.fr/pub/docs/manual-ocaml/expr.html
0331デフォルトの名無しさん
2011/09/29(木) 15:41:34.91駄文なんで読んでなかったよ。
0332デフォルトの名無しさん
2011/09/29(木) 17:15:41.79OCamlさんってそんな人だったんだ…
もう信じられるのはHaskellだけです
0333デフォルトの名無しさん
2011/09/29(木) 17:28:32.090334283
2011/09/29(木) 18:17:12.26FP
---- 壁0. 変数の壁 ----
Haskell
---- 壁1. 純粋性(副作用)の壁 ----
SML/OCaml/C++11
---- 壁2. 型推論の壁 ----
Scheme
---- 壁3. 末尾再帰最適化/局所定義式の壁 ----
========<< 越えられない壁 >>========
Smalltalk/Ruby
---- 壁4. 条件判定式の壁 ----
Perl/Python/JavaScript
---- 壁5. クロージャ/ラムダ式の壁 ----
========<< 越えられない壁 >>========
C/C++/Java...etc
0336デフォルトの名無しさん
2011/09/30(金) 20:14:01.410337デフォルトの名無しさん
2011/09/30(金) 20:37:39.92それが壁になるかどうかわからんが。
0338デフォルトの名無しさん
2011/09/30(金) 20:51:28.130339283
2011/09/30(金) 21:23:04.77条件判定が式として自然な形でコード化できるよう言語が設計されているか否か?という意味です。
誰もが関数型言語だと認める言語(>>334の最上段)であれば、当然これを満たしています。
Perl/Python/JavaScriptは条件判定(ifやcase)が(式ではなく)文として定義されているのでNGになります。
Pythonについては、if式はあるけれど「実用性に欠ける」設計であると判断しました。(>>300を参照)
もし value = if predicate ":" then_value else else_value という構文であればOKにしたかったのですが....。
# あくまで「俺様流判定基準」なので、納得いかないという意見が多々あることは承知してます
0340283
2011/09/30(金) 21:23:28.76条件判定が式として自然な形でコード化できるよう言語が設計されているか否か?という意味です。
誰もが関数型言語だと認める言語(>>334の最上段)であれば、当然これを満たしています。
Perl/Python/JavaScriptは条件判定(ifやcase)が(式ではなく)文として定義されているのでNGになります。
Pythonについては、if式はあるけれど「実用性に欠ける」設計であると判断しました。(>>300を参照)
もし value = if predicate ":" then_value else else_value という構文であればOKにしたかったのですが....。
# あくまで「俺様流判定基準」なので、納得いかないという意見が多々あることは承知してます
0341283
2011/09/30(金) 21:24:31.670342デフォルトの名無しさん
2011/09/30(金) 21:32:37.30俺様流判定基準をここで披露するのはなぜ?
ただのチラ裏とは違うの?
納得いかないという意見が多々あることは承知してますと言うけど、
別の基準や切り口を提案しても「アプローチは人それぞれ」で話を終わらせてるよね
0343デフォルトの名無しさん
2011/09/30(金) 21:33:47.820344デフォルトの名無しさん
2011/09/30(金) 21:42:03.04CTMCP
>関数型プログラミングとは, 完全値についての関数を定義することである. ここに出
>てくる関数は, 数学的な意味における本当の関数である.これが計算するための唯一の
>方法であるような言語を純粋関数型言語という
びっくりするぐらい単純だった
何が関数型言語かではなく、関数型プログラミングについて
簡潔に述べるのがポイントなのかなあ
0345283
2011/09/30(金) 22:11:15.25なぜ?と言われても、それは2chだから、としか答えようがない。
自分なりの関数型言語に関する知識でネタをカキコしてるだけですよ。
ただのチラ裏なんだから、気にくわなければスルーすればいいだけのこと。
できるならば>>342自らが別の話題を振ってくれると、スレが活性化するでしょう。
別の切り口、たとえば>>318については、理論的/学術的には真摯な意見だと思います。
意見そのものに否定する要素は無かったので、あえてレスはしなかっただけです。
たとえばR.バード共著「関数プログラミング」(近代科学社)という本は、
まさに>>318の観点で書かれた典型的な教科書です。
0346デフォルトの名無しさん
2011/09/30(金) 22:26:21.030347デフォルトの名無しさん
2011/09/30(金) 23:15:35.76>>342 も >>315 も >>318 も私です
>>315 については、
もしも最初に言語を決めて方法論を選ぶということであればどうするか、
とレスしてるだけだよね
> 何かの機能がデフォルトで使えるかどうかで分類するより、
> 関数型の方法論が流用し易いか、手続き型の方法論が流用し易いか、
> という観点で分類した方がいいんじゃないのか
という別の切り口の提案についてはどう思ってるの?
で、あなたの基準で**は関数型と見なせる、##は見なせないと分類できたとして、
その結果、どう関数型言語とは何かを理解すれば、
> デフォはRuby、でもここはSMLでも書き直そう、ただここだけはHaskellのほうが直感的に書ける....
これが実用的だという判断に繋がるわけ?
実用を考えて仕分けてるんだよね?
0348デフォルトの名無しさん
2011/09/30(金) 23:25:53.40Pythonはif式の構文が順番通りならおkなのに
PerlやJSの三項演算子でダメな理由が解らないんだよ。
例えば >>300 なら
var value = (
x == 0 ?
(y == 0 ?
1
:
2
)
:
...省略...
)
となる。Perlの場合もだいたい一緒になるはずだ。
変数宣言がmy、文末にセミコロン、変数名の頭に記号(この場合全部$だな)が付くだけ。
0349デフォルトの名無しさん
2011/10/01(土) 00:23:32.15GCCなら ({ 文 }) で書けるけど
0350デフォルトの名無しさん
2011/10/01(土) 00:35:44.860351283
2011/10/01(土) 01:25:14.63>という別の切り口の提案についてはどう思ってるの?
まず関数型言語に適したソフトウェア開発方法論というものが、
あれこれ分類を検討できるほど存在していない、という事柄があります。
もちろん>>345の教科書を含めて「数学的な活動としての関数型プログラミング」や、
形式的手法あるいは定理証明といった分野で活発な研究が行われているのは知っています。
ただし自分が求めているのは、現場に提案/適用できる実用的なソフトウェア設計論です。
たとえばOOPLであれば1992年に国内出版された「オブジェクト指向方法論OMT」があります。
当時はOOに対して悲観的な意見者が大半を占めていた時代でしたが、
この本の登場によって、国内でも一気にOOP/OODに関する注目が高まりました。
そして1995年の「デザインパターン」による設計手法のカタログ化(分類)によって一気に普及しました。
これに相当するような具体的な設計論が関数型言語に存在しますか?おそらく現状は No でしょう。
以上のように考えて、>>315で提案されたようなトップダウンな方法論は(今の自分には)無理だと判断しました。
0352283
2011/10/01(土) 01:26:45.17>これが実用的だという判断に繋がるわけ?
現場でも受け入れられている言語の一つがRubyであり、自分もRubyには慣れ親しんでいます。
だから(自分には)デフォがRubyであり、Rubyで関数型風の(関数型っぽい)プログラミングが
どこまで可能かを試行錯誤している段階です。
その一方で強いデータ型付けの無いRubyという言語の限界も感じています。
だから、できる限り現在Rubyで開発しているコンポーネントをSMLへ移行したいと考えています。
0353デフォルトの名無しさん
2011/10/01(土) 01:28:29.280354デフォルトの名無しさん
2011/10/02(日) 01:46:38.220355デフォルトの名無しさん
2011/10/02(日) 02:42:04.90みんな説明下手すぎ。
0356853
2011/10/02(日) 03:07:10.76一度動けば常に同じように動くとこ。
0357uy
2011/10/02(日) 04:58:19.53たいして「良い」ことはなく、
あれば使う。なくても別に困らない 程度のものだから
直感的にわからないなら
別に知ろうとしなくて良いよ ゴミには無理だ
0358デフォルトの名無しさん
2011/10/02(日) 05:01:39.820359デフォルトの名無しさん
2011/10/02(日) 08:51:01.200360デフォルトの名無しさん
2011/10/05(水) 23:23:26.74>「問題を解決する為に数学的な関数を構築する」
>
>これをするプログラミング言語が関数型言語であり、これが本質です
絶対主義/原理主義というか、ほとんど宗教勧誘の感覚に近いものがあるな
ア ナ タ ハ カ ミ ヲ シ ン ジ マ ス カ ?
0361デフォルトの名無しさん
2011/10/06(木) 00:33:33.17> 「問題を解決する為に数学的な関数を構築する」
>
> これをするプログラミング言語が関数型言語であり、これが本質です
というような恥ずかしい大袈裟な言葉を平気で書けるのは、
君が関数プログラミングについて何も分かっていない事の証拠だね。
そもそも「数学的な関数」という言葉が何を表すかを理解せずに使ってるんだろう。
普通に数学で言う「関数」と関数プログラミング言語での「関数」は全然違う。
せめて学部レベルでも数学を専攻してちゃんと勉強した人間ならば
関数プログラミング言語での「関数」が数学での関数とはかけ離れた概念だと気づく筈だ。
そんな基本中の基本すら理解していないから上の引用箇所のような事を平気で書けるんだろうが。
0362デフォルトの名無しさん
2011/10/06(木) 00:50:05.300363デフォルトの名無しさん
2011/10/06(木) 01:00:55.450364デフォルトの名無しさん
2011/10/06(木) 01:18:36.50> 普通に数学で言う「関数」と関数プログラミング言語での「関数」は全然違う。
> せめて学部レベルでも数学を専攻してちゃんと勉強した人間ならば
> 関数プログラミング言語での「関数」が数学での関数とはかけ離れた概念だと気づく筈だ。
そんなことはない。
ラムダ計算が何のために作られたのか知らないのか?
ラムダ計算のみに依拠するようなら純粋な関数型言語(Haskellは理念的にはほとんどそう)の関数は、数学上の計算可能な関数と同じもの。
0365デフォルトの名無しさん
2011/10/06(木) 01:26:10.11Haskellのモナドは数学の圏論を基礎にしているらしいけど、
Haskellでプログラミングする人は、すべて圏論をマスターしていなければならないってこと?
モナドの本質は圏論じゃないの?
その本質を理解しなければ関数型プログラミングではない、ってのが>>318の狂信的な主張
0366デフォルトの名無しさん
2011/10/06(木) 01:30:35.94今では見る影も無く寂れている
0367デフォルトの名無しさん
2011/10/06(木) 01:33:06.41だから検証などするときに形式化するときのモデルとして関数じゃなくて関係をよく使う
もはや関数型言語の関数なんてアナロジーとしての意味ぐらいしか成さないんだろうな
大目に見て決定的な2値の対応ぐらい?悲しいな
0368364
2011/10/06(木) 02:21:03.18オレは>>361の
> 普通に数学で言う「関数」と関数プログラミング言語での「関数」は全然違う
という主張に反対しているのであって、>>318を擁護しているわけでもなんでもない。
「狂信」者ならどんな強引な理屈で非難してもよい、というわけではあるまい。
> モナドの本質は圏論じゃないの?
まぁ、もし「素因数分解の本質は数論」といってよければ、「モナドの本質は圏論」とも言っても良いんじゃの? よく分からないけど。
ともあれ、数論をマスターしなければ素因数分解をアルゴリズムで使用できないわけではないのと同様、圏論をマスターしないとモナドが使えない、ということはない。
Haskellのモナドなんて、>>=とreturnを持ち、モナド則を満たし、do記法が使えるちょっと便利な型クラス、という認識でかまわない。
0369デフォルトの名無しさん
2011/10/06(木) 03:58:41.95つまり関数を実数とか関数とかに写像する「関数」。
普通の関数ならFortranでもあったわけで、わざわざ「関数の」と言うとも思えん。
たぶん当初は「汎関数」という含みがあったと思う。
Lispの影響が強くて、結局は意味のずれがあると思うけど。
0370デフォルトの名無しさん
2011/10/06(木) 07:30:06.49そのあるものを現実的に実用的に使えているかといことは、違います
本質を意識しなくても、理解していなくても、
みな関数型言語を普通に問題なく使いこなしています
コンピュータ(計算機)の本質を理解していなくても、
老若男女みなそれぞれ自分の関わる範囲で普通に問題なく使いこなしていることと同じです
だからといって、本質が別の物に変わるわけではありません
本質は本質として昔から今まで変わらずしっかりとあります
関数型言語におけるそれの私なりの考えを主張したのが >>318 です
>>283 などは実際に使う側に焦点を当てて、
関数型言語とは何かを >>283 なりに考えた結果でしょう
本質が何かということと、実際に使えるかということ
これを区別せずに混同し続けると >>365 のような考えに至ります
>>365 は関数型言語に限らず、何に対しても、本質は**だと主張されれば、
すべて**をマスターしていなければならないと思い込んで思考停止するのでしょう
本質と実質の違いを考える事も、本質に対する自分なりの考えを持つこともなく
0371デフォルトの名無しさん
2011/10/06(木) 09:10:13.55あなたのように教養があると、実際どれだけコードの質が上がるのか、
ちょっとうpしてみてよ
0372デフォルトの名無しさん
2011/10/06(木) 10:43:22.79あの板はようやく立ち上がった時も、
遅々としてスレが延びなかったから、今回も時間かかるだろうね。
0373デフォルトの名無しさん
2011/10/06(木) 10:51:24.04computable functionと比べるならpartial functionでしょ。
そもそも計算論では"function"が数学的に定義されているから、
その文脈で"computable function"を持ち出すのは不適切だけども。
0374デフォルトの名無しさん
2011/10/06(木) 11:19:59.99通常computable functionっていう時はpartial computable functionを指すんだと思ってた
ほら計算論の文脈ではほぼ常に停止性の議論が常につきまとうから
0375デフォルトの名無しさん
2011/10/06(木) 12:13:37.94スコココバシッスコバドドドンスコバンスコ _∧_∧_∧_∧_∧_∧_
从 `ヾ/゛/' "\' /". | |
?? ≡≪≡ゞシ彡 ∧_∧ 〃ミ≡从≡=< うpまだぁー?!! >
. '=巛≡从ミ.(・∀・# )彡/ノ≡》〉≡.|_ _ _ _ _ _ ___|
. ゛=!|l|》リnl⌒!I⌒I⌒I⌒Iツ从=≡|l≫,゙ ∨ ∨ ∨ ∨ ∨ ∨ ∨
《 l|!|!l!'~'⌒^⌒(⌒)⌒^~~~ヾ!|l!|l;"
. "l|l|(( (〇) ))(( (〇) ))|l|》;
`へヾ―-― ―-― .へヾ ドドドドドドドドドドドドドドドドドドド
0376デフォルトの名無しさん
2011/10/06(木) 12:46:31.210377デフォルトの名無しさん
2011/10/06(木) 13:25:46.71ネタを振って盛り上げようとすればいいよ。食らいついてくる人はいるから。
ネタの振り方を間違えるとダメだよ。煽らないと盛り上がらないと勘違い
してるようなコメントじゃ低俗なのがよくわかるし、低俗な連中しか
寄ってこなくなる。そんなのを寄せ付けないようにしつつ盛り上げる工夫を
考えてみればいいんじゃねえか。
0378デフォルトの名無しさん
2011/10/06(木) 13:27:37.23ネタを振って盛り上げようとすればいいよ。食らいついてくる人はいるから。
ネタの振り方を間違えるとダメだよ。煽らないと盛り上がらないと勘違い
してるようなコメントじゃ低俗なのがよくわかるし、低俗な連中しか
寄ってこなくなる。そんなのを寄せ付けないようにしつつ盛り上げる工夫を
考えてみればいいんじゃねえか。
0379デフォルトの名無しさん
2011/10/06(木) 13:29:43.02なんであれこれコメントが帰ってきてるかわかる?短くてもいいから
数学での関数と名乗れる 必要・十分・必要十分条件を説明してないからだよ。
フィーリングでわかるという事で納得する連中がいるスレではないのは
わかるだろ?聡明な頭脳を持ってるならば説明できるだろう?書いてみなよ
0380デフォルトの名無しさん
2011/10/06(木) 16:10:28.090381デフォルトの名無しさん
2011/10/06(木) 16:19:53.380382デフォルトの名無しさん
2011/10/06(木) 16:23:26.21明晰な頭脳、聡明な人。
0383デフォルトの名無しさん
2011/10/06(木) 18:40:10.430384デフォルトの名無しさん
2011/10/07(金) 00:02:40.48> そんなことはない。
> ラムダ計算が何のために作られたのか知らないのか?
そんな事は百も承知だ。
> ラムダ計算のみに依拠するようなら純粋な関数型言語(Haskellは理念的にはほとんどそう)の関数は、数学上の計算可能な関数と同じもの。
まず普通の数学、つまり数学の主流分野の代数学・幾何学・解析学で登場する関数つまり写像は計算可能である必要はないし
存在しか主張できない写像はいくらでも登場する。数学の主流分野では「計算可能」なんて条件はほとんど無意味。
君が言っている「数学上の」の「数学」は数学基礎論という普通の数学からは相手にされてない数学の辺境の中でも
辺境中の辺境の再帰関数論部落や証明論部落の住民が考えている「数学」だ。
数学基礎論でも普通の数学と多少は繋がりのあるモデル論部落や公理的集合論部落になればすぐに計算可能とは限らない写像が現れる。
最も簡単な例は選択公理が存在を主張する選択関数だ。
更にλ計算はindefiniteに対する関数値とある変数をパラメタとする関数そのものを厳密に区別する表記法としてのλ記法での「関数値の計算」が
どういう事なのかを分析する為に、λ記法を純粋に構文的な体系として形式化し対象化したものだから、
λ計算での計算はreductionという純粋に構文的な概念のみだ。
ところが関数プログラミング言語で実際に行われている計算は必ずしもそうではない。少なくとも純粋に構文的なものとして理解しようとすれば
気がおかしくなりそうな計算メカニズムを用いているケースは珍しくない。グラフ簡約とかな。
数学をせめて学部レベルほどもちゃんと学ばずに基礎論の解説か通俗書をチョイと齧ったぐらいで「数学上の」なんて言い切らない方がいいよ。
0385デフォルトの名無しさん
2011/10/07(金) 07:31:36.15だから「関数型言語では数学的な関数を構築する」と言うのは全然問題ないだろ
0386デフォルトの名無しさん
2011/10/07(金) 07:41:09.08ただの対応付けでしかないものを関数とか呼ぶのが普通な数学って何だよ、圏論かよ
0387デフォルトの名無しさん
2011/10/07(金) 07:51:36.62ただの対応とpartial functionの区別が付かないとか頭大丈夫?
0388デフォルトの名無しさん
2011/10/07(金) 07:58:57.23関係にまで弱化させないと駄目、でも集合論で関数と言って関係を指すとかありえない
じゃあ関係と関数が等価になるのはどんな分野?といいたい、その一つとして圏論を例に出した
0389デフォルトの名無しさん
2011/10/07(金) 08:14:07.900390デフォルトの名無しさん
2011/10/07(金) 08:55:40.92逆に、手続き型プログラミングは手順化することだと思う
0391デフォルトの名無しさん
2011/10/07(金) 09:47:34.55> まず普通の数学、つまり数学の主流分野の代数学・幾何学・解析学で登場する関数つまり写像は計算可能である必要はないし
・・・
> 最も簡単な例は選択公理が存在を主張する選択関数だ。
この部分は、数学でいう関数には計算可能でないどころか、存在することしか分からない関数もある、ってことだよね、要は。
それはそうだけど、それがなんで
> 普通に数学で言う「関数」と関数プログラミング言語での「関数」は全然違う
という言明を正当化するのか分からん。数学でいう「関数」の全部を扱えなくとも、その一部を扱えていれば十分じゃん。
加法と乗法しか習っていない小学生の使う自然数は、大学生の使う自然数とは別のものなのか?
もしそうだというなら、それこそ、過度に数学基礎論的な見方だと思う(嫌いではない)。
> ところが関数プログラミング言語で実際に行われている計算は必ずしもそうではない。少なくとも純粋に構文的なものとして理解しようとすれば
> 気がおかしくなりそうな計算メカニズムを用いているケースは珍しくない。グラフ簡約とかな。
グラフ簡約はいいだろ。
数学者が証明過程でいちいち論理学レベルの変形を事細かに書かないようなもんだろ。
数学基礎論を悪し様に言いつつも、オマエの言っていることには数学基礎論的な潔癖性を感じる。
0392デフォルトの名無しさん
2011/10/07(金) 23:19:24.10関数型は局所解
0393デフォルトの名無しさん
2011/10/08(土) 00:27:35.620394デフォルトの名無しさん
2011/10/08(土) 00:53:56.930395デフォルトの名無しさん
2011/10/08(土) 00:58:27.68Ocaml最強?
0396デフォルトの名無しさん
2011/10/08(土) 01:02:20.610397デフォルトの名無しさん
2011/10/08(土) 01:35:27.300398デフォルトの名無しさん
2011/10/08(土) 01:50:07.330399デフォルトの名無しさん
2011/10/08(土) 22:15:59.52一体何なのか?ということをまず示さないとわけがわからなくなると思う。
計算可能な関数にできることでも数学的意味の関数ではできないことも
あるだろうし、逆に数学的意味の関数にできることでも、計算可能な関数では
できないこともあるはずだ。
0400デフォルトの名無しさん
2011/10/08(土) 22:33:09.000401デフォルトの名無しさん
2011/10/09(日) 02:20:29.58関数なんて関係の一部に過ぎない
関係なんて直積集合の一部に過ぎない
0402デフォルトの名無しさん
2011/10/09(日) 04:42:48.320403デフォルトの名無しさん
2011/10/09(日) 09:33:10.350404デフォルトの名無しさん
2011/10/10(月) 19:02:16.93> > 普通に数学で言う「関数」と関数プログラミング言語での「関数」は全然違う
>
> という言明を正当化するのか分からん。数学でいう「関数」の全部を扱えなくとも、その一部を扱えていれば十分じゃん。
数学での関数概念は外延的。
プログラミングでの関数概念は内包的。
0405デフォルトの名無しさん
2011/10/10(月) 19:12:12.84> 数学での関数概念は外延的。
アホ?
0406デフォルトの名無しさん
2011/10/10(月) 19:46:36.15アホと言いがかりをつけた以上、それに続く反論文を書かないと
逆効果、アホは>>405じゃね?って思われるだけだよ。
0407デフォルトの名無しさん
2011/10/10(月) 19:58:33.16アホって思ってるならいちいち反応するなよ
0408デフォルトの名無しさん
2011/10/10(月) 19:59:55.06>>405のこと?
0409デフォルトの名無しさん
2011/10/10(月) 21:22:10.48へー。じゃあどっかに関数のリストが書いてあんのか?w
0410デフォルトの名無しさん
2011/10/10(月) 23:43:47.62数学をちゃんと勉強するんだな。まずは『集合と位相』って類のタイトルの教科書から始めろ。
数学での関数は外延的な概念だという言葉の意味すら理解していないらしいが。
0411デフォルトの名無しさん
2011/10/11(火) 00:07:48.58こんなアホ見たことねー
「まずは『集合と位相』って類のタイトルの教科書から始めろ」(キリッ
0412デフォルトの名無しさん
2011/10/11(火) 00:18:07.87変に数学にかぶれた馬鹿がいるみたいだな。
>>384とか>>404とか。
0413デフォルトの名無しさん
2011/10/11(火) 02:19:49.55分かります
0414デフォルトの名無しさん
2011/10/11(火) 07:36:14.35内包的という言葉と対になってるから、外延的説明という意味での「外延」と思ったんだけど
どうやら違うみたいだ
0415デフォルトの名無しさん
2011/10/11(火) 07:47:19.68外延性の公理が成り立たない公理系を対象としてるようだけど、
普通の数学も計算論も外延性の公理は前提として採用してると思うが
0416デフォルトの名無しさん
2011/10/11(火) 22:21:21.58C#のタプルとかヒドすぎw
0417405
2011/10/11(火) 22:27:00.69数学は無知でも、内包記法のアイデアがどこから生まれたかくらい知っていればねえ。
0418デフォルトの名無しさん
2011/10/11(火) 22:33:22.13薄っぺらなのがまるわかりwww
ま、具体的な事を書いたら>>388のように恥かくから、
頑張ってボカして書いてるんだよねw
0419デフォルトの名無しさん
2011/10/11(火) 22:34:18.710420デフォルトの名無しさん
2011/10/11(火) 22:40:16.190421デフォルトの名無しさん
2011/10/11(火) 22:45:55.380422デフォルトの名無しさん
2011/10/11(火) 23:00:18.110423デフォルトの名無しさん
2011/10/11(火) 23:05:11.910425デフォルトの名無しさん
2011/10/12(水) 07:50:51.540426デフォルトの名無しさん
2011/10/12(水) 08:35:09.04プログラミングとしての関数、関数型とは何ぞや、ってのが本来重要なことでしょ
数学的な話を突き詰めてもそこは出て来ないと思うの
0427デフォルトの名無しさん
2011/10/12(水) 09:06:33.22自分の主張を押し通したり相手を罵倒するための手段が「数学」だったりする
0428デフォルトの名無しさん
2011/10/12(水) 09:39:37.84自分の主張を押し通したり相手を罵倒するためのマジックワードが「現場」だったりする
0429デフォルトの名無しさん
2011/10/12(水) 09:51:46.030430デフォルトの名無しさん
2011/10/12(水) 10:03:33.24強度計算も信号システムもない飛行機や高速鉄道に乗ればいいと思うよ。
0431デフォルトの名無しさん
2011/10/12(水) 10:22:23.33鉄とある金属の組み合わせで熱膨張収縮が低くなる合金があるけれどその原理がわかったのはつい最近。
理論だけで作られてるものなんてほとんどないんじゃない?多くの物は理論と経験の組み合わせ。物によっては経験がほとんどとかもあるでしょ。
0432デフォルトの名無しさん
2011/10/12(水) 10:26:19.73モノが存在する前に計算論の基礎は出来上がってたしな
0433デフォルトの名無しさん
2011/10/12(水) 10:35:22.05じゃぁものが飛んできた時にニュートン力学から相対性理論まで物理法則を駆使して機敏に避けるがいいよ\(^o^)/
0434デフォルトの名無しさん
2011/10/12(水) 10:36:46.04いかに理論として優れていても、それがモノ作りに適用できなければ評価されない
0435デフォルトの名無しさん
2011/10/12(水) 10:46:07.56有害であるというのが、ずっと以前からの私の考え方である。
ソフトウェアの設計にしろハードウェアの設計にしろ、
コンピュータの分野でなされてきた実際的な仕事のほとんどは、あやしげで見苦しい。
なぜならそれを行った人間は、自分の仕事の基礎となっている基本的な原理について、
何ら理解していないからである。抽象数学や理論的な仕事の多くは役に立たない。
なぜならそれは現実のコンピュータの分野となんの接点も持たないからである。....(以下略)
0436デフォルトの名無しさん
2011/10/12(水) 10:51:21.85安全性のある暗号方式は生まれなかっただろうけどな
0437デフォルトの名無しさん
2011/10/12(水) 12:36:05.87略さずに最後まで話せよ
0438デフォルトの名無しさん
2011/10/12(水) 12:36:24.18おまえらってほんと馬鹿
0439デフォルトの名無しさん
2011/10/12(水) 14:08:11.13でもプログラミングとして重要なのは
その暗号方式が安全かどうなだけだ
過程なんてのは割とどうでもいい
0440デフォルトの名無しさん
2011/10/12(水) 14:10:31.99教育および研究のための集団である Programing Research Group の
中心的な目的は、このような隔離が怒り得ないような環境を
設定することなのである。 Christopher Strachy, 1974年
0441デフォルトの名無しさん
2011/10/12(水) 14:14:46.62次の世紀において計算と数学的論理が実りのある関係を
持つようになることを期待するのは当然のことである。
この関係を発展させるには、応用と数学的優雅さの
両方に対して関心を持つことが必要である。
John McCarthey, 1967年
0442デフォルトの名無しさん
2011/10/12(水) 14:34:51.800443デフォルトの名無しさん
2011/10/12(水) 14:40:27.490444デフォルトの名無しさん
2011/10/12(水) 15:14:14.110445デフォルトの名無しさん
2011/10/12(水) 15:32:58.440446デフォルトの名無しさん
2011/10/12(水) 17:29:57.92という事は、池沼じゃない凡人は天才なのか
0447デフォルトの名無しさん
2011/10/12(水) 22:56:02.80おまえは理論の言葉を真似してるだけ
0448デフォルトの名無しさん
2011/10/14(金) 21:42:03.470449デフォルトの名無しさん
2011/10/14(金) 22:23:04.17http://www.infoq.com/jp/articles/FunctionalProgramming_20111005
ここ数年、関数型プログラミングやそれをサポートする言語が静かなブームになっている。
昔から、Lispは自然言語処理やAIで使わ>れ、JVM上で動く Clojureなどは今も根強い人気を誇るが、
新しく登場した言語(といってもアカデミックな世界では10年以上の歴史があるものがほとんどだが)として、
ErlangやHaskell、OCamlそしてScalaといった言語の勉強会が各地で開かれ盛況である。
(....中略....)
午前中はまず、「関数型」、「関数プログラミング」とは何を指すのか、に関する
山本和彦さんによるチュートリアルである。世の中には「関数型」の共通定義はなく、あえて言うと、
必要に応じて関数を引数にどんどん適用していくことで計算するパラダイムである、という解説があった。
議論の前に、各人の言う「関数型」が何を指すのか擦り合わせが必要である。
また、関数プログラミング(Functional Programming)には機能的・実用的なプログラミングという意味が
本来あるということに気づかせてくれた。
関数プログラミングのコツは、「バグの入り込まない小さな関数を組み合わせてプログラミングする」ことである。
最終的には、コンビネータと呼ばれるDSL(これが小さな部品関数を組み合わせる仕組み)を使って
プログラムを作るのが関数型プログラミング手法の目標だと非常に明快に示された。
0450デフォルトの名無しさん
2011/10/14(金) 23:58:43.98関数型プログラミングをコンサルのネタに使いたいもんだから流行させようとしているんだろう。
0451デフォルトの名無しさん
2011/10/15(土) 00:22:55.19実際はこんなもんだからなぁ。
この中で関数型言語ってどれでしょうか?w
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
Position Oct 2011 Position Oct 2010 Delta in Position Programming Language Ratings Oct 2011 Delta Oct 2010 Status
1 1 Java 17.913% -0.25% A
2 2 C 17.707% +0.53% A
3 3 C++ 9.072% -0.73% A
4 4 PHP 6.818% -1.51% A
5 6 C# 6.723% +1.76% A
6 8 Objective-C 6.245% +2.54% A
7 5 (Visual) Basic 4.549% -1.10% A
8 7 Python 3.944% -0.92% A
9 9 Perl 2.432% +0.12% A
10 11 JavaScript 2.191% +0.53% A
11 10 Ruby 1.526% -0.41% A
12 12 Delphi/Object Pascal 1.104% -0.45% A
13 13 Lisp 1.031% -0.05% A
14 14 Transact-SQL 0.909% +0.09% A
15 23 PL/SQL 0.903% +0.30% A-
16 24 Lua 0.802% +0.25% A
17 16 RPG (OS/400) 0.757% +0.05% A--
18 15 Pascal 0.721% -0.05% A
19 - Assembly* 0.622% - B
20 17 Ada 0.609% -0.09% B
0452デフォルトの名無しさん
2011/10/15(土) 09:13:19.08言っていた奴等を思い出すなぁw
0453デフォルトの名無しさん
2011/10/15(土) 09:48:58.76既存の技術を置き換えるには余程のメリットを示さないというのを込みにしても
まだまだ関数型言語は実用に耐えうるだけの技術では無いんだなぁと
0454デフォルトの名無しさん
2011/10/15(土) 09:56:25.64勘定系ではまだ使われてないから実用に耐えない
そうやって必死に思い込んでるのは自由だから一人でやっててね
0455デフォルトの名無しさん
2011/10/15(土) 10:08:34.80カス言語であり、低脳プログラマホイホイであることについて衆目が一致しているJavaとPHPのランクの高さとか。
0456デフォルトの名無しさん
2011/10/15(土) 10:11:57.27宇宙開発でも実際に運用される機械のシステムはそれはもう枯れたものが使われてるし
勘定系といってもトレードシステムみたいなクォンツの方々が矢継ぎ早に生み出すモデルを
速くかつ正確に実装する簡単なお仕事みたいな特殊なものに限られてて
基幹システムなんてもう腐臭を放つようなものばっかり
そもそも現在普及している関数型言語では関数型言語の特徴である形式手法との相性がいいというのを生かしきれるものじゃないんだよ
型システムで作り出せる制約がまだまだ弱すぎるんで
0457デフォルトの名無しさん
2011/10/15(土) 10:30:18.28関数型言語の機能を取り入れてる言語は赤丸急上昇中だがな
c++/c#/python/ruby
0458デフォルトの名無しさん
2011/10/15(土) 10:31:17.900459デフォルトの名無しさん
2011/10/15(土) 10:35:30.170461デフォルトの名無しさん
2011/10/15(土) 14:02:33.290462デフォルトの名無しさん
2011/10/15(土) 14:10:30.41こんなのもあるから、関数型の仕事もなくはないし、
セミナーとかじゃなくまともな仕事を増やそうとしている人たちもいる
0463デフォルトの名無しさん
2011/10/15(土) 14:34:13.18速度も問題ないし自分的にもC#の時よりもバグがなく作るのも早かった。
色々コンポーズできるのとimmutableのところを多くしたせいだと思う。
0464デフォルトの名無しさん
2011/10/15(土) 15:03:05.990465デフォルトの名無しさん
2011/10/22(土) 00:56:02.480466デフォルトの名無しさん
2011/10/22(土) 09:40:18.88なぜrubyは利用され続けるのだろうか?
COBOLやJavaと同じように老害プロジェクトを生み出してはいないだろうか?
老害プログラマを生み出してはいないだろうか?
0467デフォルトの名無しさん
2011/10/22(土) 09:48:55.48rubyスレでまったく同じレスを見たって事は・・・
誤爆か?
0468デフォルトの名無しさん
2011/10/22(土) 11:56:01.78http://twitter.com/#!/j5ik2o/status/126325746984693761
0469デフォルトの名無しさん
2011/10/22(土) 12:56:10.990470デフォルトの名無しさん
2011/10/22(土) 13:01:44.490471デフォルトの名無しさん
2011/10/22(土) 16:39:27.04のは違和感ある。
0472デフォルトの名無しさん
2011/10/22(土) 16:46:42.55激しく同意
0473デフォルトの名無しさん
2011/10/22(土) 17:29:15.080474デフォルトの名無しさん
2011/10/22(土) 19:41:30.08図は必須だね。
0475デフォルトの名無しさん
2011/10/22(土) 19:58:24.09というかUMLってなんか役に立つ?
0476デフォルトの名無しさん
2011/10/22(土) 20:11:51.57CLOSとか使って商用アプリ書くとしたら、書くこともあるのかな?
0477デフォルトの名無しさん
2011/10/22(土) 20:29:07.91メジャーなのって何かある?
0478デフォルトの名無しさん
2011/10/22(土) 21:01:51.160479デフォルトの名無しさん
2011/10/22(土) 21:07:37.44どういう意味
0480デフォルトの名無しさん
2011/10/22(土) 21:15:19.570481デフォルトの名無しさん
2011/10/22(土) 21:19:55.50メジャーな設計手法って何かあるのかな?
メジャーじゃなくても、関数型であることを考慮した設計手法って
どんなのがあるんだろ
ACM の Digital Library で "Functional Design Approach" とか
"Functional Design Methodology" とか検索かけてみたけど、
PDF で読めるものでめぼしいものが見つけられなかった
(キーワードが悪いのかな)
0482デフォルトの名無しさん
2011/10/22(土) 21:45:11.08C言語で書くときと同じように設計すればいいと思う
0483405
2011/10/22(土) 23:44:42.55>>476はclass diagramしか知らないじゃないの?
Interaction daigram, State diagram, Activity diagramは、
関数型言語でも使えるでしょ。
class diagramにしても、simonpj先生がHaskellのtype definitionは、
UMLのようにhigh level designなので、programで扱いやすいと言った例が。
0484デフォルトの名無しさん
2011/10/22(土) 23:52:20.99状態をできるだけ持たないような設計を目指すのが関数型だと思ってたけど
0485デフォルトの名無しさん
2011/10/23(日) 00:41:49.11っていうのを繰り返すのをState diagramで管理する?
0486デフォルトの名無しさん
2011/10/23(日) 00:43:43.690487デフォルトの名無しさん
2011/10/23(日) 00:57:26.36で、UMLの中で最も知られている/大切な class diagram に相当する視覚的表現というのは
関数型設計パラダイムには存在するの? 自分は知らない.... 存在しないんじゃないのかな
0488デフォルトの名無しさん
2011/10/23(日) 00:59:55.87そういう用途なら、Groovyの適しているわ
0489デフォルトの名無しさん
2011/10/23(日) 01:16:13.92>状態をできるだけ持たないような設計を目指すのが関数型だと思ってたけど
基本的にはその通り。ただし、解決すべき問題が本質的に状態を含んでいる場合がある。
たとえば信号機は blue/red/yellow という点滅状態が必要で、それが実世界のプログラミング。
>>485
>状態を引数で渡して、遷移した状態を返値で受け取って、それをまた引数で渡して・・・
そのプロセスを再帰式で定義する方法で正しい。少なくとも Erlang では、そのもの。
というか、state diagram に関しては昔から形式的定義もあるし、関数型設計で活用するのに支障は無い。
0490デフォルトの名無しさん
2011/10/23(日) 01:35:14.62>class diagramにしても、simonpj先生がHaskellのtype definitionは、
>UMLのようにhigh level designなので、programで扱いやすいと言った例が。
Haskellの type definition は high level design かもしれないが、
それは text representation にすぎない。UMLの visual representation との比較は無意味。
質問の意味を取り違えているし、先生の話を鵜呑みにしては逝けませんという好例だ。
0491デフォルトの名無しさん
2011/10/23(日) 02:38:45.93OOP なら素直にクラスを作って、素直に状態遷移の処理が書ける
デザインパターンにもあるくらいだし
一方、これを関数型で実装しようとすると、状態遷移図の読み取ってから、
それをコードに落とすまでに、素直に作業が進むとは言いがたいと思う
(実際にそういう経験が多々ある)
図ではそれぞれの状態は分かれて書かれているのに、
関数型のコードにすると局所化されずに関係が全体に広がってしまう感じ
なんていうか、図とコードの一体感が薄い
OOP だって図とコードが一対一に対応しているわけでは決して無いんだけど、
OOP の場合は他人のコードを読んで、それを逆に状態遷移図に起こすことも、
そのコードが元々ちゃんとした状態遷移図からコード化してるのなら比較的素直にできる
それくらいには図とコードの一体感がある
関数型の場合、それが難しいと感じるケースが多い
状態遷移自体は必要なのだから何らかの図は必要なのだが、
今までの UML の状態遷移図が関数型にフィットしていないのか、
それともそれを関数型のコードに落とす手法に問題があるのか、
それとも単に私がまだまだ未熟なだけなのか
0492デフォルトの名無しさん
2011/10/23(日) 04:41:02.620493デフォルトの名無しさん
2011/10/23(日) 05:59:43.71そもそも状態遷移をガンガン使うって事は変数の値を次々に書き変える事で処理を進める手続き的パラダイムで考えてるって事だからね。
もちろん、そういうパラダイムの処理を関数型でシミュレートする(状態を表す引数を次々に渡す)事はできるが、
本来の関数型のパラダイムはそういう変数への破壊的な代入(バインディングとは等価でない代入)を避けるべきだという哲学に基づいているから
馴染まなくて当然だし、そういう状態遷移の処理を書くのならば関数型よりも手続き型の方が自然に書けて当然なんだよ。
0494デフォルトの名無しさん
2011/10/23(日) 08:26:39.32お前らにまとめて聞きたい
お前らはCのような手続き型言語であれば状態遷移機械を書けるのか?
実は書けない、あるいは今まで書いた事が一度も無いんじゃないのか?
情けない奴ら、お前らの将来はIT土方一直線で決定だ
反論があるなら、その前にまずWikipediaでトピック「有限オートマトン」にある
数学モデルの節を読め
ここではトランスデューサ型で決定性オートマトンだけを見ればいい
面倒であればトピック「ミーリ・マシン」を直に見てもいい
これだけ簡潔な数学的定義があるのに、まだ難しいとか馴染まないとか言うつもりか?!
0495デフォルトの名無しさん
2011/10/23(日) 08:33:19.050496デフォルトの名無しさん
2011/10/23(日) 08:37:33.40>本来の関数型のパラダイムはそういう変数への破壊的な代入を避けるべきだという
再帰的に状態値を次々に渡していくのなら、破壊的代入にならないのではないかと....小一時間
0497デフォルトの名無しさん
2011/10/23(日) 10:08:38.460498デフォルトの名無しさん
2011/10/23(日) 10:12:57.04状態機械を素直に書けない関数型言語があるってのはちょっと信じられない
>それともそれを関数型のコードに落とす手法に問題があるのか、
>それとも単に私がまだまだ未熟なだけなのか
このどちらかだと思う
具体的なコーディングは次のような感じ
1. 各状態に対応する関数を一つづつ作って、それらが
次状態に対応する関数を末尾呼び出しするようにする
コーディングは楽だけど、状態機械側から能動的に入力を取ってくる方法がある場合に限る
2. そうでない場合は、状態に対応する型を定義する
2-1. 一般には関数を使う。Haskellの記法で、
newtype State = State (Input -> IO (Output, State))
みたいな
2-2. 一目で全体を見渡せる小さい状態機械なら、具体的な列挙型のほうが楽なこともある
data State = State1 | State2 | State3...
みたいな
Haskellだと、スレッド+チャネルを使ったり継続モナドを使ったりすれば、あらゆる状態機械を1.の方法で書ける
(そのぶんコードが複雑になるので、本当にやるかどうかはケースバイケース)
0499デフォルトの名無しさん
2011/10/23(日) 10:13:50.54M$もRxでReactiveの方にも力入れてたのに結局Async選んだからな
0500デフォルトの名無しさん
2011/10/23(日) 10:14:30.34状態遷移を避けるべきなんて言ってる関数型言語は聞いたことがない
(教科書にはそう書いてあるかもしれないが、それは手続き型言語にどっぷり漬かった
学習者のための方便で、実際にコードを書くときに盲目的に従うものじゃない)
大抵、一つのプログラムには、関数的に書いた方が素直な部分と
手続き的に書いた方が素直な部分が共存してる
いわゆる実用的な「関数型言語」は、この両方を簡単に扱えるように作られてる
0501498
2011/10/23(日) 10:18:06.84動的な場合は、頭の中かコメントで定義すれば良いはず
0502デフォルトの名無しさん
2011/10/23(日) 10:34:59.09AsyncとFRP(Rx)は別物だよ。
Asyncは主にIOなどの実行に時間がかかるものに対しての継続の制御方法で、Rxは解釈にもよるだろうがデータフローの意味合いが強く、その中に継続のコントロールも入っていて両者を組み合わせて使うことも可能。
0503デフォルトの名無しさん
2011/10/23(日) 10:36:17.430504デフォルトの名無しさん
2011/10/23(日) 10:40:34.610505494
2011/10/23(日) 10:52:37.48ようやく、平常な水準で語ってくれる人が登場してくれて安心した
自動販売機/信号機/通信プロトコルといった実時間システム(Real Time System)は、
動いて当たり前、バグ0で数年間連続稼働するのがマジで求められる世界
病院の生命維持装置や宇宙船の航行制御装置などを想像すれば分かってもらえるハズ
だから、そういったソフトウェア品質/安全性を求む組み込み系の開発現場(の一部?)では
堅固な型体系を持つ関数型言語への強い期待があったりする
そんな訳で、関数型言語に状態機械は馴染まない/難しいみたいな発言は哀しいんだYo....
0506デフォルトの名無しさん
2011/10/23(日) 11:14:55.76依存型がもっと軽量に扱えるようにならんと話にならん
0507494
2011/10/23(日) 11:33:03.10そのStrong functional programming/Total Functional Programmingとは何?
少なくともHaskellはシミュレーションやモデル検証には適しているかもしれないが、
状態機械の「実装言語」としては全く認識していない。(今のC/C++実装を置き換えたい....)
軽量/簡潔な言語仕様のSML処理系を候補にしたいと思ってる。(OCamlは仕様/実装とも重すぎ)
0508デフォルトの名無しさん
2011/10/23(日) 11:36:26.030509デフォルトの名無しさん
2011/10/23(日) 11:50:54.55Total_functional_programmingって初めて知るけど、全域関数しか認めない帰結として無限ループが使えない、よってチューリング完全ではない、という理解でO.K.?
無限ループが使えない、って組み込み系としてはかなりダメダメのような…
無限ループが絶対に使えない「安全な領域」と無限ループがありえる「危険な領域」を、C#のunmanaged codeみたいに、あるいはHaskellのIOモナドみたいに隔離してあつかえる言語が望ましいのかも
0510デフォルトの名無しさん
2011/10/23(日) 12:10:59.72今状態Aであるときにイベントxが起きたら、
状態Aが保持してる内部の変数の値とxで計算して、
その結果yをまた状態Aの内部変数に格納する
yの値によって次に状態Bか状態Cへ遷移する
こういう場合、OOP なら素直に状態毎にクラスを作る
あるいは一つのクラスのインスタンスを状態毎に作る
で、状態Aを表現するインスタンスのメンバ変数は、
そのインスタンスの中で完結していて外に出ることはない
一方、関数型でこれを実現するとき、
「状態を引数に入れて、計算して、戻り値として状態を返す」
ということを(再帰的に)繰り返すという方法をとると、
状態Aの内部変数に相当する値も色んなところへ運ばれる事になる
そうしないと、また状態Aに戻った時に計算できない
また、Haskell の State モナドのような仕組みを使っても同じ
本来は内部に閉じ込めておくべき情報が外に出ることに変わりはない
たとえ何らかの方法で、状態Bや状態Cの計算をしてる時には
状態Aの内部変数に相当する値にはアクセスできない仕組みがあるとしても、
その仕組みを作っている時は、色んなところへ情報が漏れることを
ちゃんと意識してプログラミングする必要がある
(一般的な OOP ならその仕組みは改めて作る必要は無い)
また、状態Aの計算の最後に状態Bを末尾呼び出しする方法は、
状態間の繋がりがますます強くなる
情報の漏れと結合度の強さ、これらをもう少し改善する方法はないだろうか
0511494
2011/10/23(日) 12:11:59.06紹介ありがとう
ただ、ざっとリンク先を読んでみたけど明らかに違う
そういった数理的な完全性という狭い分野での品質向上を求めているわけじゃなくて、
開発工程全体に渡る効果を期待しているし、現状を一切切り捨てるという判断は到底無理
おそらくリンク先のトピックはCafeObjのような形式的手法やCoqのような定理証明系、または
このスレならHaskellベースの帰納的な(純粋関数型の?)設計手法が該当するんだろう
そういった手法は提供範囲を限定すれば効果はあるだろうけど、開発工程全体への波及は期待できない
たとえば仏生まれのCoqなら、もしOCaml処理系全体の定理証明が完成すれば認識を改めたい
0512デフォルトの名無しさん
2011/10/23(日) 12:14:18.96何かを出力し続ける、あるいは外界と相互作用する無限ループは(余再帰という形で)扱えるはず
特定の値を求めるべき関数が無限ループするのは禁止
0513デフォルトの名無しさん
2011/10/23(日) 12:17:44.03> 一方、関数型でこれを実現するとき、
> 「状態を引数に入れて、計算して、戻り値として状態を返す」
> ということを(再帰的に)繰り返すという方法をとると、
> 状態Aの内部変数に相当する値も色んなところへ運ばれる事になる
> そうしないと、また状態Aに戻った時に計算できない
ん??? ここが不可解
それって、あなたがいっているOOPでも、状態Aから状態Bに遷移しても「状態Aのインスタンス」を保持しておいて、状態Aに戻ったときにそれを復帰させるってこと?
それはもう状態マシンの設計として破綻してない?
なんか、状態マシンと別の何かをごっちゃにしているような・・・
0514509
2011/10/23(日) 12:20:59.83余再帰とか高度なことは分からないので十分に理解できないけど、考えてみると、
たしかにほとんどの「無限ループ」はプログラム全体(あるいはエントリポイント)をインプットからアウトプットへの関数として定義すれば、
いいような気はする。
0515デフォルトの名無しさん
2011/10/23(日) 12:22:15.05情報の漏れに関してはHaskellやOCamlならモジュールで隠す
隠蔽の単位がクラスからモジュールになっただけで、一般的なOO言語とそんなに違わない
結合度については、状態機械なら、自分が次にどの状態に
移行するかを知ってなきゃいけないのは仕方ないんじゃね
0516デフォルトの名無しさん
2011/10/23(日) 12:27:29.68let..inとかwhereで関数内関数(または変数)じゃ駄目なん?
モジュールだって在るし。
0517デフォルトの名無しさん
2011/10/23(日) 12:50:22.99GCのない関数型言語ってあるのかな?
0518デフォルトの名無しさん
2011/10/23(日) 12:55:01.75実験レベルのものなら
https://github.com/pikatchu/LinearML
0519デフォルトの名無しさん
2011/10/23(日) 13:00:15.82線形型か・・・
0520デフォルトの名無しさん
2011/10/23(日) 13:03:37.00遅延評価の関数適用順序がリアルタイム性も考慮して進化してったら、そう言う用途にも使える様にならんかな。。。
0521494
2011/10/23(日) 13:04:09.78[過去] Linuxでリアルタイム制御厳しいよね
組み込み系にJava VMって重すぎるよね
[現在進行形] 組み込み系にRubyって.......
勘弁しておくれ
0522デフォルトの名無しさん
2011/10/23(日) 13:08:08.48正直、何か別のものと混同してる感じは自分もする
状態マシンというものを勝手に拡張して解釈しているかも知れん
結合度の事はとりあえず置いておいて、>>510 の前半で言いたかったのは、
C# だとこんな感じなる状態遷移の実装(文法や初期化とかは気にするな)
実際に状態遷移させるのは別のクラスで状態遷移表なんかを使ってやってるとする
class State {
public int next (int e);
}
class StateA : State {
private int x;
public State next (int e) {
x = f(x, e); // 適当な関数 f によって計算
return x;
}
状態Aの次にどの状態に遷移するかは状態Aのメンバ関数 next の戻り値に依るんだけど、
その戻り値が状態Aが保持してるメンバ変数 x に依存してる
つまり、状態Aのメンバ変数 x はずっと保持しておかなければならない
他のクラスのインスタンスからもアクセスされてはいけない
こういうパターンって普通にあるよね(ゲームなんか作ってるとよくある)
これ、関数型(わたしは Haskell しか使えないけど)だと、
自分では未だになかなか綺麗に関数型らしく書けなくて毎回悩むところ
(IORef で妥協するのは何か気持ち悪い)
0523デフォルトの名無しさん
2011/10/23(日) 13:13:26.14まぁ IORef 使ったって、結局その IORef 型の変数の値を運ぶことになるんだけどね
0524デフォルトの名無しさん
2011/10/23(日) 13:20:17.85IORefを使って綺麗に書けるならそうしない理由はないと思う
0525デフォルトの名無しさん
2011/10/23(日) 13:21:45.28とりあえず上のコードで喩えるとxが消えて
見かけ上はStateAはeと別の信号fから違う信号を生成するってだけの関数ぐらいには楽に変えられる
0526デフォルトの名無しさん
2011/10/23(日) 13:29:53.83アプリ全体を関数型でかっこよく書くのは諦めた方が速い
0527デフォルトの名無しさん
2011/10/23(日) 13:30:09.360528デフォルトの名無しさん
2011/10/23(日) 13:33:46.08それ Haskellなら
module State (State, next) where
class State s where
next :: s -> e -> s
module StateA (StateA(), stateA) where
data StateA = StateA Integer
sateteA = StateS
instance State StateA where
next (StateA i) e = f i e
where
f = ...
みたいにすれば良いんじゃね?
0529494
2011/10/23(日) 13:35:04.52状態機械どころか、OOP(GoF)のState Patternですらない
クラス名 State や StateA は状態という概念である必然性が無い。
たとえば Room と RoomA や Level と LevelA でもかまわない。
単にあるオブジェクトが別のオブジェクトへ変化するだけ。
それは状態機械ではないし、State Pattern ですらない。
0530デフォルトの名無しさん
2011/10/23(日) 13:36:08.51証明支援系を利用した超強力な形式手法をサポートしたものぐらいじゃないと
手続き型でもどうにかなるものに対しては置き換える価値を示せないのだろうな
逆に言えばそういうのじゃないとどうしようもない複雑すぎる問題が増えてくれば自然にそっち方向にシフトしていくと思う
0531デフォルトの名無しさん
2011/10/23(日) 13:43:54.98秋月電気にpic様のbasicインタプリタ置いてる時点で、rubyの方がまだ可能性は在るんだろうな
0532デフォルトの名無しさん
2011/10/23(日) 13:49:49.54大抵のFRPがどれを指してるのか分かんないんだけど、
たとえば Yampa や reactive は確かに内部で IORef は使ってる
でもそれって、それらのライブラリ内で自身の構造を保つ為に使ってるのであって、
そのライブラリのユーザー側が定義した情報を遷移させても保つ為のものでは
ないような気がするんだが
もう一度 FRP ライブラリをよく見てみます
>>528
StateA --> StateB --> StateC --> StateA と回った時、
最初に StateA の next を計算した時の値は、
次の StateA の next を計算する時にまた使わなければならないけど、
それはどこかに保存しておくか、遷移時に運ぶデータとして連れて行かないといけない
>>529
やはり勘違いしていたか
申し訳ない、全然話が別だったね
じゃあ、状態機械とか State Pattern の話ではなくて、
純粋に単なる >>522 のようなパターンの時に、
関数型ではどうしてるのかなという話で
(わたしはこういうパターンでも、同じような図を描いて設計してた)
0533デフォルトの名無しさん
2011/10/23(日) 14:54:25.29f.reset(env, orig_state) -> f(env, state)
f(env, state) -> f(env, state')
ってな形のフィードバックループで実現するんだが,
state を変数にするか, 関数の名前のにするのか程度の違いじゃないのか?
f の内部レジスターが state になることがほとんどだから,
個人的には, 関数名が違ってる方が理解しやすいが...
# つか, わざわざ外部に状態用のレジスターを作るのはトランジスタの無駄
0534デフォルトの名無しさん
2011/10/23(日) 15:18:51.26組み込みとリアルタイム制御を混同しているような
人に待ってもらえるアプリならばrubyでも問題ない
車の制御系をlinux,java,ruby,haskellでできるのか
ブレーキかけた時にGCが始まってしまうと困るのだが
関数型言語がすばらしいというのはわかるが
じゃあ、C、アセンブラに代わりうるものなのかな
0535デフォルトの名無しさん
2011/10/23(日) 15:23:21.87リアルタイム制御の話は一瞬出て、一瞬で終わっただろ
誰もCやアセンブリに代わるとも言ってねぇし
0536デフォルトの名無しさん
2011/10/23(日) 16:12:54.580537デフォルトの名無しさん
2011/10/23(日) 19:28:33.75どうせドンピシャな研究してても説明下手くそなのと、よくわからん秘密主義で
余計コストかかるだけだよ。
0538デフォルトの名無しさん
2011/10/23(日) 20:13:16.50たった25ドルで一年間読み放題だ
0539デフォルトの名無しさん
2011/10/23(日) 22:11:17.49Erlangっていう実績がある
RubyのRiteもソフトリアルタイムまでをターゲットにしていたはず
問題はハードリアルタイムなシステムで、
NASAの国際宇宙ステーションだったかの、制御プログラムが仕様通り動作することを
定理証明支援系で検証した話を聞いたことが、あるような無いような
0540デフォルトの名無しさん
2011/10/24(月) 04:38:46.24> >>493
> >本来の関数型のパラダイムはそういう変数への破壊的な代入を避けるべきだという
>
> 再帰的に状態値を次々に渡していくのなら、破壊的代入にならないのではないかと....小一時間
だから変数への破壊的代入に比べて引数を引きずり回さねばならないってのは不自然あるいは煩雑な記述だろうが。
状態遷移の考え方から素直に生まれたのが内容を破壊的に書き換え可能なメモリとそれへの代入命令をベースとする
手続き型プログラミングのパラダイム。
関数型プログラミングのパラダイムでベースとなっている概念はメモリを用いずに値をどんどん変換という考え方。
0541デフォルトの名無しさん
2011/10/24(月) 09:36:18.43破壊的な代入を隠蔽したのがFRPだと思ふ(´・ω・`)
0542デフォルトの名無しさん
2011/10/24(月) 09:49:23.200543デフォルトの名無しさん
2011/10/24(月) 10:06:52.98>>496のつっこみはたしかに日本語に不自由している感じはあるが、一般論として
> だから変数への破壊的代入に比べて引数を引きずり回さねばならないってのは不自然あるいは煩雑な記述だろうが。
というのには反論したい。
例えば、ある種のステートマシンは、Haskellなら
state1 (Event1:es) = state2 es
state1 (Event2:es) = state3 es
state2 (Event1:es) = state1 es
state2 (Event2:es) = state3 es
state3 (Event1:es) = state1 es
state3 (Event2:es) = state2 es
みたいに書くことができる。
これは破壊的更新を避けて値を引きずり回しているけど、破壊的更新をするよりも、自然かつ簡明になっていると思う。
0544405
2011/10/24(月) 19:10:41.86昔オランダでマイナス標高地の水位制御のシステムが関数型言語で書かれたことあるよ。
後にConcurrent Cleanにつながる処理系だったと記憶するけど、言語名は忘れた。
0545405
2011/10/24(月) 19:21:09.070546デフォルトの名無しさん
2011/10/24(月) 22:54:52.70関数型的に扱える別にFRPが破壊的代入を必ずしもしてるという意味ではないけど。
0547デフォルトの名無しさん
2011/10/25(火) 08:23:40.940548デフォルトの名無しさん
2011/10/25(火) 13:31:30.59この手のグラフィックってやっぱり関数型が得意とするところかな。
0549デフォルトの名無しさん
2011/10/25(火) 13:58:37.19を見てて、下のデモを見てるとリアルタイムで動いてるようよ
0550デフォルトの名無しさん
2011/10/26(水) 00:35:42.34OOが新しかったころと同じw
0551デフォルトの名無しさん
2011/10/26(水) 00:40:50.31関数型もいずれ広まるという意味?
0552デフォルトの名無しさん
2011/10/26(水) 00:42:46.21といっても既存の言語に特徴が取り入れられたりってのも含めてだけど。
そういう意味ではすでに広まっているとも言えなくもない。
0553デフォルトの名無しさん
2011/10/26(水) 01:03:22.770554デフォルトの名無しさん
2011/10/26(水) 01:04:18.360555デフォルトの名無しさん
2011/10/26(水) 01:20:18.73OOのほうがインパクトが大きいというのはあるかなー
でもどちらかというのではなくOO+関数型となるというのが正解だと思う。
0556デフォルトの名無しさん
2011/10/26(水) 01:43:18.68OO慣れした人が大切だと思ってたあんなことこんなことがことごとく
関係がないという世界だしね。
マルチバラダイム言語になってきてるけどさ。common lispはシンプ
ルだけどカッコで敬遠されて、C++は泥沼のような状態なってったよね。
手続きが関数型の要素を入れてきてるけど、どれも複雑怪奇な
傾向は残ってるよね。更に複雑怪奇な方向に舵を取ってる印象
もあるよね。あのままじゃ超えられない壁があると思うよ。
ハードウェアの方向性とも関連してくるけど、ようやく関数型の
Meritが生かされる時代に変わってきたと思うよ。関数型はLisp
から始まったので、まだ50年くらいしかない。50年たってようやく
という感じだと思うよ。
0557デフォルトの名無しさん
2011/10/26(水) 01:47:25.320558デフォルトの名無しさん
2011/10/26(水) 02:00:16.54GUIとか、正直、どうでもいい。
0559デフォルトの名無しさん
2011/10/26(水) 02:09:42.94入出力まわりはことごとく状態だからね。そこを上手に扱う方法
は一応Haskellでも考えられてるよね。副作用のある場所と
ない場所をわけられる利点があることをお忘れなく。
もちろん、Haskellほど処女っぽさのない関数型も多数あるからね。
0560デフォルトの名無しさん
2011/10/26(水) 02:13:22.15FRPの概念取り入れればM、VMの部分は状態の概念をだいぶ無くせる。
0561デフォルトの名無しさん
2011/10/26(水) 02:25:36.77純情関数型言語Haskell
0562デフォルトの名無しさん
2011/10/26(水) 04:20:15.120563デフォルトの名無しさん
2011/10/26(水) 07:24:48.55gui関数型で書きやすいんだが、、、
0564デフォルトの名無しさん
2011/10/26(水) 08:50:23.16入出力以外にも沢山の状態を扱うことはあるから
手続き型自体は無くならんだろうけどな
0565デフォルトの名無しさん
2011/10/26(水) 09:15:14.900566デフォルトの名無しさん
2011/10/26(水) 09:30:59.38なくなることはないだろうし、関数型が今までより盛んになる環境が整った
というだけの話だよ。少なくとも手続きはブルーカラー言語として絶対に残るよ。
0567デフォルトの名無しさん
2011/10/26(水) 10:03:27.060568デフォルトの名無しさん
2011/10/26(水) 10:26:32.86ブルーカラーの設計がくそで、マジやめてほしい。
会社で100ms スリープポーリングとかバカなの?死ぬの?
0569デフォルトの名無しさん
2011/10/26(水) 10:27:52.07手続きゆとりマジ悪魔
0570デフォルトの名無しさん
2011/10/26(水) 10:50:17.52社会が右利き向けに作られてるから右利きに有利になってるし、
左利きは右利きに矯正されることも多かった。
左利きの人には両手利きになる場合もあるけど、右利きから
両手利きは生まれにくい。
同じように、手続き言語に合うハードウエアの世界に生きてるから
手続きが有利にはなってる。関数型をやったところで手続き型も
学ぶ必要が多くなってる。当然、関数型使いは手続き型も使える
人が多いけど、手続き型から関数を触れる人は少ない。
だから手続きは生き残っていくとは言えるだろう。
0571デフォルトの名無しさん
2011/10/26(水) 10:53:20.720572デフォルトの名無しさん
2011/10/26(水) 11:00:23.40今後もそういう関係が続いてくんじゃないかなあ
「今の関数型」が普及する頃には、今の関数型の要素は
手続き型言語にも常識となって入ってて
その頃には関数型言語ってのはもっと先を行ってるのでは
0573デフォルトの名無しさん
2011/10/26(水) 11:58:05.35> ハードウェアの方向性とも関連してくるけど、ようやく関数型の
> Meritが生かされる時代に変わってきたと思うよ。関数型はLisp
> から始まったので、まだ50年くらいしかない。50年たってようやく
> という感じだと思うよ。
Lispは手続き型言語の元祖とも言うべきFortranやCobolと同じぐらい古くからある言語だぞ
そもそも機械語によるプログラミングを脱して最初の高級言語たちが開発されてから50年余りしか歴史がない
0574デフォルトの名無しさん
2011/10/26(水) 17:42:42.650575デフォルトの名無しさん
2011/10/26(水) 18:36:42.95別にLISPが無くなるわけじゃねーからいいんだよ!(´Д⊂グスン
0576デフォルトの名無しさん
2011/10/26(水) 18:47:23.20>>556でさらにそれを意識させるようにしてきてたんだけど、無関心すぎて
残念に思ってたところなんだよ。>>574-575
0577デフォルトの名無しさん
2011/10/26(水) 18:54:44.630578デフォルトの名無しさん
2011/10/26(水) 18:55:31.400579デフォルトの名無しさん
2011/10/26(水) 18:55:37.53使えよ!
0580デフォルトの名無しさん
2011/10/26(水) 19:35:30.84略してオワ関
0581デフォルトの名無しさん
2011/10/27(木) 16:32:00.380582デフォルトの名無しさん
2011/10/27(木) 17:08:09.38haskellのところを見てみろよ。思いっきり荒らされてる。自演っぽい連続投稿でね。
0583デフォルトの名無しさん
2011/10/27(木) 19:18:47.560584デフォルトの名無しさん
2011/10/27(木) 19:35:39.18悪貨は良貨を駆逐する(グレシャムの法則)を地で行く展開になってしまうからね。
Haskellスレなんてもうそうなってる。
0585デフォルトの名無しさん
2011/10/27(木) 19:48:20.260586デフォルトの名無しさん
2011/10/27(木) 22:38:38.780587デフォルトの名無しさん
2011/11/10(木) 19:47:23.830588デフォルトの名無しさん
2011/11/10(木) 19:50:56.820589デフォルトの名無しさん
2011/11/10(木) 22:30:20.730590デフォルトの名無しさん
2011/11/11(金) 07:47:29.180591デフォルトの名無しさん
2011/11/11(金) 12:42:01.57> 若干は重くなるだろうなって。。。
若干というのがどの程度を想定してるのか知らんが、
体感できるほど遅くなるとは思えない
インタプリタが問題なくリアルタイムに処理している型推論の仕事を
IDE に実装して遅くなるなんて、まず考えられん
0592デフォルトの名無しさん
2011/11/19(土) 10:47:32.74tokuhirom、ma.la?っていう人の話だけ聞きたい
色々なスレで見かけるけどWEB業界で有名らしいね
動画ありませんか?
0594デフォルトの名無しさん
2011/11/28(月) 19:43:49.77lispはclojureとなって生まれ変わりました。
っていうかもう使ってるし。
scalaでもコード量1/4程度にしかならんかったけど、clojureだと1/10とか
になったりする。
ていうかマクロなにこれ最強すぎ。
0595デフォルトの名無しさん
2011/11/28(月) 20:07:53.87コード量というものの重要度が低くなっていく
それよりも、自分の昔のコードを見て
何をやってたのかすぐに思い出せるとか、
他人のコードを見て計算を追うのにイライラしない、
という意味でのコードの可読性の方が大事になってくる
コードの可読性を増すためなら、コード量が10倍になっても気にならん
それでも、たいてい計算量は10倍も増えんし
当然、可読性を高めて、かつコード量が減らせれば尚良いが
0596デフォルトの名無しさん
2011/11/28(月) 20:26:11.44そのへんClojureスレにNovigの作法の文章の和訳のURLを貼ったから
そっちを参考にしてくれ。あの考え方は関数型やってれば参考になることは
多いと思うんで。594とは別人ですがね。
英語が良ければ下記をどうぞ
http://webcache.googleusercontent.com/search?q=cache:P6VhrTuoxPUJ:norvig.com/luv-slides.ps
0597デフォルトの名無しさん
2011/11/28(月) 20:41:37.92いや、すまん
Clojure がどうとか lisp がどうとかという話じゃなくて、コード量に反応した
(Clojure は名前と、lisp をベースにした事くらいしか知らん)
例えばブロック崩し程度の小さなゲームを作ってる時でも、
あの言語ならこのコード量をもっと減らせるのになぁ、
と思うことなんて俺は無いなという話
あの言語(のあの構文)ならもっと分かりやすく書けるのになぁ、
と思うことはあるけど
その分かりやすさにはシンプルというのも入ってて、
結果的にコード量が減らせるかもしれんが、
あくまで羨望してるのは分かりやすさであってコード量じゃない
極論を言えば、コード量なんて言語のアドバンテージにならん、という持論の話
それはそれとして、Novigの作法とやらには興味あるので読んでみるよ
0598デフォルトの名無しさん
2011/11/28(月) 21:39:47.83コメントや型情報がなかったり,設計がひどくて変更箇所が不明瞭だと,
ぶん殴りたくなるよね,過去の自分を.
0600デフォルトの名無しさん
2011/11/28(月) 22:13:28.29了解
コメントって大事だよね。コメントのほうが多いことある。苦笑
あと関数名も。 関数名だけで難読化すること可能ですもんね。 苦笑
0601デフォルトの名無しさん
2011/11/28(月) 22:25:28.61自分も自分のためにコメントをたくさん書いてる(´・ω・`)
0602デフォルトの名無しさん
2011/11/28(月) 23:19:43.80静的な部分が手続き的じゃなくちゃんと宣言的に書かれているとか
そういった関数型言語としての「計算式の書き方」
に関しての分かりやすさを俺は言いたかったんだが・・・
まぁいいや
0603デフォルトの名無しさん
2011/11/29(火) 09:03:40.53コードの可読性ってコード量そのものじゃん。
他人の書いたコードをみるのも
100行みるより10行で済むんだぜ。
0604デフォルトの名無しさん
2011/11/29(火) 09:10:25.720605デフォルトの名無しさん
2011/11/29(火) 09:22:00.68あの系列はコード書いた人間がパーザみたいなもんだから
(それが括弧が多くなる理由でもあるんだがw)
どう足掻いても読みにくいが、それでも解りにくくは滅多にならないと思うが…
まあ「やってる処理内容は解るが、それで何がしたいのか解らない」
ってコードは多いんだけどさw
Perlはまあ、仕様の隙を突くような書き方すりゃ解りにくくはなるかな
0606デフォルトの名無しさん
2011/11/29(火) 09:23:23.74今後関数を使うな。
0607デフォルトの名無しさん
2011/11/29(火) 09:46:26.67コードの長さか,スタイルか,機能か,それとも他の何かか,って話?
それは言語ごと違うんじゃないかな……
0608デフォルトの名無しさん
2011/11/29(火) 09:49:57.600609デフォルトの名無しさん
2011/11/29(火) 11:35:28.14「コード量をいかに少なくできるかコンテスト」
で優勝するようなコードは論外だな。
一方で適切に関数を導入して重複コードを書かないのも意義がある。
こういうバランスのとれた概念
を一言で表すことが出来れば
いいんだけど。
0610デフォルトの名無しさん
2011/11/29(火) 12:32:06.99「分かりやすいコード」
0611デフォルトの名無しさん
2011/11/29(火) 12:56:05.88でも、関数を簡潔に書ける人は、多くの関数を
5行までで書いてしまう。分岐があってもせいぜい10行だ。
0612デフォルトの名無しさん
2011/11/29(火) 13:00:25.08たぶん604にはmap系/reduce/filterなどが入り組んだ5行は読めないんだろう。
あるいは、マクロで関数やマクロを作る系統の入り組んだマクロも5行クラス
でかけないことはないかな。
初級者ではこの2つは厳しいからな。
0613デフォルトの名無しさん
2011/11/29(火) 19:37:34.21自分の頭の中でスラスラと処理を再現できるものなのでしょうか?
0614デフォルトの名無しさん
2011/11/29(火) 20:19:17.90プログラムにしたときになるべく例外処理の少ない自然な仕様じゃないと
0615デフォルトの名無しさん
2011/11/29(火) 20:41:49.63つmacroexpand-1
マクロ展開コードはどれだけ効率後回しでわかりやすさを追求しても
バチは当たらないってばっちゃが言ってた
0616デフォルトの名無しさん
2011/11/29(火) 21:41:00.17プログラムが記述された文字列を
そのまま「読んで」「理解できるか」という意味で訊きました
やはり、他人のマクロは展開しないと読めないものなのでしょうか
0617デフォルトの名無しさん
2011/11/30(水) 00:16:13.10リスト処理が読めれば読める
0618デフォルトの名無しさん
2011/11/30(水) 00:40:02.56ただしdefmacroのようなレガシーマクロで透けて見えたような
単純なリスト処理による置き換えとは違って、マクロシステム
寄りの理解が必要になり、〜が判れば誰でもとは言えなくなる
0619デフォルトの名無しさん
2011/11/30(水) 00:59:21.28マクロでマクロや関数を作るようなことをする場合はひと工夫いる。
(多分、作者はこれをさせたくないんだと思う。読みにくさでは悪名高いので。)
0620デフォルトの名無しさん
2011/11/30(水) 02:04:03.02http://www.chino-js.com/ja/tech/srfi/srfi-26/srfi-26.html
こういう一見何が便利なのかさっぱり判らない構文が、
恐らく短くなるというだけで一時期もてはやされたような気がするが
個人的にはやめてもらいたい
素直にlambdaで書いた方がずっと判りやすい
0621デフォルトの名無しさん
2011/11/30(水) 07:26:58.38普段Scheme使ってないからかもしれんが
0622デフォルトの名無しさん
2011/11/30(水) 08:41:01.61clojureは #(+ %1 (* 2 %2) とかできる.ただしネストできない.いずれにせよ書き捨てには便利.
cutはしたいことがはっきりしている分いいマクロなんじゃないの(loopと同じで好みはあるけど).
0623デフォルトの名無しさん
2011/11/30(水) 10:20:53.21まぁ>>620での観点だと明らかにアウトなんだけど・・・
0624デフォルトの名無しさん
2011/11/30(水) 10:28:39.120625デフォルトの名無しさん
2011/11/30(水) 13:46:45.390626デフォルトの名無しさん
2011/11/30(水) 17:15:12.49OOPみたいなことになりそうにないが。
0627デフォルトの名無しさん
2011/11/30(水) 18:54:19.19設計レベルのスパゲッティはたまに
0628デフォルトの名無しさん
2011/11/30(水) 19:00:28.23その前者の方なら、俺もたまにあるな
でもそういうのってさ、手続き型に比べてけっこう早い段階から気づかない?
このままコーディングしていくとなんかヤバイなって
何となく兆しが見えるというか、そういうのに敏感になる
コードの形の綺麗さを意識するようになるからかな
関数型では、気づいたらスパゲッティだったというのは少なくとも無いな
0629デフォルトの名無しさん
2011/11/30(水) 20:11:35.180630デフォルトの名無しさん
2011/12/01(木) 09:28:29.85Reactive的に書けばすっきりしそうなんだけど。
0631デフォルトの名無しさん
2011/12/01(木) 10:44:03.23こっちはこっちでpoint freeとかあるし。
パラダイムよりコーディングスタイルのほうが重要でしょ。
銀など弾丸はないってそういうことでしょ?
0632デフォルトの名無しさん
2011/12/01(木) 14:26:57.770633デフォルトの名無しさん
2011/12/01(木) 14:56:06.820634デフォルトの名無しさん
2011/12/01(木) 16:34:27.89日本語が不自由なところを見ると、関数型言語よりも先に
勉強すべきことが多い小学生レベルのヤシであるのは確かだね
0635デフォルトの名無しさん
2011/12/01(木) 16:39:46.320636デフォルトの名無しさん
2011/12/01(木) 16:55:31.11有りそうだな。やっぱり、猫には銀のスプーンだよ。
0637デフォルトの名無しさん
2011/12/01(木) 17:16:29.000638デフォルトの名無しさん
2011/12/01(木) 19:23:11.230639デフォルトの名無しさん
2011/12/01(木) 21:03:35.370640デフォルトの名無しさん
2011/12/01(木) 21:10:14.540641デフォルトの名無しさん
2011/12/01(木) 22:39:44.49特にMLとHaskellでは関数は常に一つの引数のみを取り、複数の引数を取る関
数とは、単にネストされた複数の一引数関数の糖衣構文にすぎない。
--
だから 関数タマネギの扱い方の話だなって。
0642デフォルトの名無しさん
2011/12/01(木) 22:54:09.38ハウスザカリー
似すぎてこわい
0643デフォルトの名無しさん
2011/12/14(水) 14:12:31.00自分が使っているコードにもそういう場所があって、反省してみると、
データの再帰的な定義に逆らうかたちでアクセスする場合に起こりがちな気
がします。
例えば、リストのリストを行列見立てて、アクセスすることを考えます。
(例えば、条件を満たす要素をnを取り出すなど)
val xss =
[ [1.0 , 2.0, ~3.0, 4.0]
, [~10.0, 20.0, 30.0, 40.0, 50.0]
, [100.0, ~200.0, 300.0]
, [1000.0, ~2000.0, 3000.0, 4000.0, 5000.0, 6000.0]
]
このときに、列方向(内側のリストに沿って)アクセスする場合は、
要素への操作をfとして
app (app f) xss
と簡潔に書けますが、行方向にアクセスする場合にはかなり複雑に
なります。
0644デフォルトの名無しさん
2011/12/14(水) 14:19:16.27に直接書きたくなりますが、アクセスの複雑さにまぎれて何をしているのか
わかりにくくなります。つぎのようにストリームとして分離すれば多少まし
になるのかも知れません。
(* 横断的に読み取る手続きをつくる関数 *)
fun transReader (xss: real list list) = let
val buf2 = ref xss
val buf1 = ref (nil: real list)
fun hd' xs = case xs of nil => nil | x::xs => [x]
fun tl' xs = case xs of nil => nil | x::xs => xs
fun fetch () =
case !buf1
of nil => (buf1 := List.concat (map hd' (!buf2))
;buf2 := map tl' (!buf2))
| _ => ()
fun get () =
case !buf1
of nil => NONE
| x::xs => (buf1 := xs; SOME x)
in
fn () => (fetch(); get())
end
0645デフォルトの名無しさん
2011/12/14(水) 19:43:06.54行方向と列方向の認識が一般とは逆のような気がする
xss の例だと 1.0 -> 2.0 -> ~3.0 -> 4.0 という順でアクセスするのが行方向、
1.0 -> ~10.0 -> 100.0 -> 1000.0 という順でアクセスするのが列方向
それはそれとして、リストのリストに対してある方向へのアクセスが扱いにくいのなら、
転置してから扱いやすい方向でアクセスすれば良いだけですよね
貴方が使っている関数型言語では転置が難しいと言うのでしたら申し訳ないが
0647643
2011/12/14(水) 23:32:27.68あいまいな書き方をしてしまったかもしれない。
ひとつの行は横の並び、ひとつの列は縦の並びなのだが、「行方向」といったとき、
行を指定する添え字を変化させるのか、行をひとつ取ってその要素をなめる
方向(=列の添え字を変化させる)のか、の2種類の解釈ができる。
すこし考えてみましたが、おっしゃる通り転置で良いと思います。
あるいは、要素をもう追加しないことが分かっている場合には、
ほぼ同じコストで実現できる配列化もありですね。
ストリーマを構成したのは、行列を複製するのを惜しんだわけですが、
map hd' (!buf2)で列ベクトルを切り取る操作をしているので、
全要素にアクセスする場合、これは無意味はですね。
0648デフォルトの名無しさん
2011/12/15(木) 22:49:33.17ドキュメントやコミュニティーがしっかりしているFWがあればいいのですが
0649645
2011/12/15(木) 23:18:12.86言語 : Haskell
ライブラリ : snap (http://snapframework.com/)
まだバージョン 1.0 になっていないが、
本体もドキュメントもしっかりしてる
コミュニティーってのは、利用者やファンが群がってるところか?
snap 限定なら上記アドレスの本家サイトにも書かれているが IRC がそれかな
他では特に聞かないな
議論をしたいのなら普通に stackoverflow とかですればいいと思う
・・・自分でもちゃんと調べたのか?
0650デフォルトの名無しさん
2011/12/17(土) 15:32:01.10ありがとうございます
Haskellならyesodの話はよく聞くんですけどね
触ってみます
0651デフォルトの名無しさん
2012/01/27(金) 05:59:51.360652デフォルトの名無しさん
2012/02/09(木) 09:33:08.800653デフォルトの名無しさん
2012/02/19(日) 11:34:13.39・末尾再帰って普通のループより何がうれしいの。
・カリー化って何の役にたつの。
0654デフォルトの名無しさん
2012/02/19(日) 11:56:20.91プログラマの立場から見るとあまり変わらない
相互末尾再帰すれば単純なループ以外のものも書けるくらい
言語の立場から見ると、わざわざループ専用構文と破壊的代入を用意しなくても
ループが実現できてうれしい
>・カリー化って何の役にたつの。
いちいちラムダ式を書くよりも部分適用が楽
0655デフォルトの名無しさん
2012/02/19(日) 20:32:09.16私たちは
カンです、スーです、ミキです、
三人合わせて
0656デフォルトの名無しさん
2012/02/19(日) 21:39:46.940657デフォルトの名無しさん
2012/02/26(日) 00:24:54.42僕が持ってるCの入門書には、関数を作っていくプログラミング言語って書いてある。
0658デフォルトの名無しさん
2012/02/26(日) 00:27:27.24Cにおける関数は構造化やモジュール化の手段。
0659デフォルトの名無しさん
2012/02/26(日) 00:28:33.45とりあえず、Wikipediaで関数型言語を調べてから質問に来い
0660デフォルトの名無しさん
2012/02/26(日) 02:52:14.47再帰で書いたほうがスッキリとかけることが多い。
で、末尾再帰だとそれがコンパイル時に最適化してgotoに落とせてはやくできる。
カリー化はある一般的な関数を、ある条件のもとでの特殊な別の関数に無駄な記述なく書ける。
ある時のコンテキストで専用の関数に仕立て上げられる。その後の記述がスッキリ。
まぁ両方共メリットがわからなければ使わなくていいんじゃないかと。
0661デフォルトの名無しさん
2012/02/26(日) 08:50:59.77C言語は関数型言語というデマがひどく広がってる。
0662デフォルトの名無しさん
2012/02/26(日) 12:12:37.930663デフォルトの名無しさん
2012/02/26(日) 13:03:58.600664デフォルトの名無しさん
2012/02/26(日) 13:15:46.65obj.call(arg) とでもして呼べばいいだけじゃねぇか。
0665デフォルトの名無しさん
2012/02/26(日) 20:57:28.02僕の持ってたC言語の入門本にはC言語は関数を中心に組み立てる関数型言語と書いてあった。
捨てたからタイトルも忘れたけど。
0666デフォルトの名無しさん
2012/02/26(日) 21:41:00.60それは関数型言語の意味を履き違えてる
0667デフォルトの名無しさん
2012/02/26(日) 22:02:20.410668デフォルトの名無しさん
2012/02/26(日) 22:14:33.72参照透過性が保たれた関数のこと
そのような性質を持った関数をファーストクラスとして扱うことを
主な目的にして設計された言語を関数型言語という
(この性質を壊す処理は程度の差こそあれ例外的なこととして扱われる)
C言語の関数はそのような性質が保証されていないし、
ファーストクラスとしても設計されていない
0669デフォルトの名無しさん
2012/02/26(日) 22:21:39.14関数型言語における、いわゆる数学的な(参照透明性があるのが基本である)関数とは違うものだから。
> C言語の入門本にはC言語は関数を中心に組み立てる関数型言語と書いてあった
↓これと同様の、
ttp://c-faq.com/ansi/voidmainbooks.html
> Perhaps its author counts himself among the target audience.
という系の本だとみなすべき指標のひとつだな。
0670デフォルトの名無しさん
2012/02/26(日) 22:27:33.210671デフォルトの名無しさん
2012/02/27(月) 01:32:50.74だから関数型だって馬鹿はK&Rが翻訳される前からいた。
0672デフォルトの名無しさん
2012/02/27(月) 05:14:40.640673デフォルトの名無しさん
2012/02/27(月) 08:32:29.09なおかつそんなバカがいたのか?ちょっと信じられんが。
0674デフォルトの名無しさん
2012/02/27(月) 08:43:53.97C や Unix はあまり知られていなかったような。
K&R の翻訳以前に出てた日本語の C の本って 1冊しか知らないや。
0675デフォルトの名無しさん
2012/02/27(月) 08:43:57.08でFA
0676デフォルトの名無しさん
2012/02/27(月) 10:09:55.450677デフォルトの名無しさん
2012/02/27(月) 10:24:35.730678デフォルトの名無しさん
2012/02/27(月) 15:13:06.38昔は情報源が雑誌。
0679デフォルトの名無しさん
2012/02/27(月) 15:56:23.08『コンピュートピア』は技術系の内容はからっきしで、bitしかない時代。
bitにそんなアホが載ったとも思えん。
0680デフォルトの名無しさん
2012/02/27(月) 22:48:04.02思えん理由についてくやしく
主観はいらない
0681デフォルトの名無しさん
2012/02/28(火) 00:32:53.80C言語の関数と、関数型言語の関数は何が違うのですか(´・ω・`)
0682デフォルトの名無しさん
2012/02/28(火) 00:52:54.550683デフォルトの名無しさん
2012/02/28(火) 00:57:57.500684デフォルトの名無しさん
2012/02/28(火) 18:57:59.32例えば
int count (void)
{
static int i = 0;
return i++;
}
void main (void)
{
printf("%d\n",count());
printf("%d\n",count());
}
と言う関数を作れば、実行結果は
0
1
となるが、関数型言語の関数は文字を表示する関数などの特別な関数以外は基本的に同じ引数(引数なしなら、引数なしも)なら、同じ結果が返ってくる
そして、一番の特徴は、初期化のみ代入を許し、以後は代入が出来ない
一見不便に見えるが、そのおかげで参照透明性が保たれ、マルチスレッド化はしやすい
もう一つの特徴として、最近のLLを中心に取り入れられている特徴は、関数の引数に関数を渡せる
これは、関数ポインタで同等のことが出来るが、汎用性では圧倒的に関数型言語の方がうえ
本格的にコーディングされるとさすがに勝てないが、お手軽末尾最適化関数のfoldlを使えば、スタック消費しないし、素直に書いたCのコードと同じ程度の速さは出る
Cの素直なreverse関数:http://ideone.com/FLe0A
Haskellのreverse関数:http://ideone.com/O7h5F
0685デフォルトの名無しさん
2012/02/28(火) 20:47:03.540686681
2012/02/28(火) 21:08:14.14そういう風に書けばいんだろ。
ぼくはCのプロだし。
・同じ引数なら同じ結果
・代入は初期化のみ
0687681
2012/02/28(火) 21:09:54.24威張らないでほしいし(´・ω・`)そういうのはキモヲタって言われるよ?
0688デフォルトの名無しさん
2012/02/28(火) 22:08:18.74要は今まで皆さんの説明で知りたかったことが理解できたかどうかです
納得いかない部分があればポイントを絞って再度質問し、
納得いったのならお礼を言って終えればいいだけなのでは?
0689681
2012/02/28(火) 22:13:59.430690デフォルトの名無しさん
2012/03/01(木) 16:08:01.50Curryという名前で、例えば
func(1)(2)(3)
↓
func(1, 2, 3)
にするマクロがあり
>Perform argument currying.
というコメントがあったんだけど、
これカリー化じゃなくてその逆(非カリー化)だよね?
スレ違いな質問だけど、カリーに詳しそうなここで聞いてみた。
0691デフォルトの名無しさん
2012/03/01(木) 18:26:25.85カリー化は1引数化のことだから。
カリー化の逆は部分適用だっていうケースが多いけど、
その多引数化が真逆だね。
0692デフォルトの名無しさん
2012/03/01(木) 20:02:44.13とりあえず、Haskellでは、
curryは二つ組のタプル一つを受け取る関数を、二つの引数を取る関数にする
uncurryはその逆
定義
curryadd a b = a + b
tupleadd (a,b) = a + b
実行結果
*Main> curryadd 1 2
3
*Main> tupleadd (1,2)
3
*Main> uncurry curryadd (1,2)
3
*Main> curry tupleadd 1 2
3
0693デフォルトの名無しさん
2012/03/01(木) 23:58:30.33ふーむ・・・
考え方的には>>691で
Haskell実装では逆になるという事かな?
0694デフォルトの名無しさん
2012/03/02(金) 00:25:01.03何か実績はありますか。
0695デフォルトの名無しさん
2012/03/02(金) 09:05:45.02それともLisp系で?
単 に 煽 り た い だ け な ら 死 ね 。
0696デフォルトの名無しさん
2012/03/02(金) 10:10:49.140697デフォルトの名無しさん
2012/03/02(金) 10:24:33.47lispacheとかhunchentootとか
http://weitz.de/hunchentoot/
自分はchickenで動くspiffyとawfulが好きかな
0698デフォルトの名無しさん
2012/03/02(金) 10:50:57.160699デフォルトの名無しさん
2012/03/02(金) 12:34:26.11Webのシステムというのがどういうものを指しているのか分からないが、
Web フレームワークなら例えば Haskell で Yesod などいつくかある
クラウドシステムを構築するとかでも、どんな言語でもできるが、
こちらの方は実績は知らんな
0700デフォルトの名無しさん
2012/03/02(金) 13:06:50.56Yesodはもうすぐオライリーから本がでる程度にはメジャーです。
http://shop.oreilly.com/product/0636920023142.do
http://www.snoyman.com/img/book-cover.png
>>698
まともでないのはド素人の質問に死ねと返す方でしょう。
0702デフォルトの名無しさん
2012/03/03(土) 01:53:54.67http://ocsigen.org/
js_of_ocamlでクライアントも作れる。
0703デフォルトの名無しさん
2012/03/03(土) 13:57:15.95http://www.kahua.org/show
0704694
2012/03/03(土) 14:02:15.81色々あって書物まで出るのですね。
ついでに質問なんですけど、
>>695 みたいに色々あるみたいなんですけど、
前回のWebの話は別として、
これから関数型言語を勉強するには Haskell ML Lispのどれがおすすめですか。
ぼくはプログラミングはCとPHPを勉強しました(´・ω・`)
0705デフォルトの名無しさん
2012/03/03(土) 14:24:33.56関数型言語の考え方を学びたいならHaskellでいいんじゃない?
0706694
2012/03/03(土) 14:25:58.610707デフォルトの名無しさん
2012/03/03(土) 14:37:59.160708694
2012/03/03(土) 14:47:59.38あ、はい。
すすめてくれる人は、できれば理由も教えてくれるとありがたいです。
そろそろ出かけますので、夜までレス読めません。
0709デフォルトの名無しさん
2012/03/03(土) 15:03:39.13Haskell は普及が進んできている。遅延評価で純粋なので、関数的という点は上。
遅延評価(がデフォルト)という点が、コンピュータのプログラムとしてはちょっと非直感的なので
学習の壁になる可能性がある。
OCaml も同じくらい普及している。引数がデフォルトでは遅延評価じゃないというのが
Haskell との大きな違いのひとつ。
0710デフォルトの名無しさん
2012/03/03(土) 15:16:16.05関数型の「考え方」を知りたいなら、圧倒的にHaskell。
ただし、標準入出力の処理でみんなつまづくので、Hello Worldプログラムを書くのはちょっと高い壁がある。
だから、インタプリタ(GHCiがデファクトスタンダード)でスーパー電卓的に使ってみるのが良い。
0711デフォルトの名無しさん
2012/03/03(土) 15:26:25.72Haskellを勉強しても良いと思うぜ
0712デフォルトの名無しさん
2012/03/03(土) 15:59:16.170713デフォルトの名無しさん
2012/03/03(土) 16:20:37.82いまHakellを勉強する人は良くも悪くも「意識の高い」人だから、
「モナドは圏論から来た概念で〜」とか言われると、数学の勉強を始めてしまうから。
「doと<-はおまじないです」でかまわない人が増えたら、つまづかなくなるだろ
0714デフォルトの名無しさん
2012/03/03(土) 19:17:12.43それが躓く理由なら、OCamlでモナドを定義しても相変わらず躓くな
圏論から来た概念なことには違いないのだから、言われれば数学の勉強を始めるのだろう
0715デフォルトの名無しさん
2012/03/03(土) 19:20:28.52何も躓いていない
むしろスムーズにHaskellから数学に移行している
そこからのまたHaskellに滑らかにUターンしてこればいい
従って、躓く原因は他にあるな
0716デフォルトの名無しさん
2012/03/03(土) 19:55:28.28>なんで人はモナドで躓くんだろ?
そこにモナドがあるから
一般的な手続き型言語/オブジェクト指向言語は
正格評価(非遅延評価)を採用し、副作用(入出力や破壊的代入)を前提にしている
だからそういった言語に慣れた「ふつうの」プログラマにとって、
正格評価や副作用は潜在意識下に存在し、それが自然なものであると(無意識に)理解している
それがHaskellでは、わざわざモナドを使わなければまともなプログラミングできない
言い換えると、ふつうのプログラマにとって、モナドの存在そのものが「異質」に見える
0717デフォルトの名無しさん
2012/03/03(土) 20:04:46.41俺的にはモナド使うと誰得なんですか的なところがつかめんかった。
HaskellerじゃないのでIOモナドはあまり関係ないし。
今は書いてあるコードの後ろにゴニョゴニョした部分を後ろにおっつけられるようにフックしつつデータをたらい回せる機能という理解になってしまってる。
のでFunctor→Applicative→Monadの発展の流れってのをイマイチ理解してないよ・・・
0718716
2012/03/03(土) 20:58:15.37X: それがHaskellでは、わざわざモナドを使わなければまともなプログラミングできない
O: それがHaskellでは、わざわざモナドを使わなければ実用的なプログラミングができない
0719デフォルトの名無しさん
2012/03/03(土) 21:02:45.49抽象化してまとめたのがモナド。
意味論から出たデザインパターン。
ボトムアップ一辺倒の人は分からない概念。
うまくまとめたってだけで、なくてもなんとかなるから。
0720デフォルトの名無しさん
2012/03/03(土) 21:13:07.25> 俺的にはモナド使うと誰得なんですか的なところがつかめんかった。
モナドを「わざわざ」って思ってしまうのは、入門書に載っているような、
ターミナル相手の入出力の使い方しか知らないからだと思うんだ
たとえば Web フレームワークの Yesod で Web ページを定義する時、
ヘッダやフォームなどの部品は全てモナドなんだが、
わざわざなんて感じは無く、かなり自然に記述できる
そこでは、「順序を意識すること無く宣言的に記述する」
ためにモナドが利用されている
wx で GUI の見た目を定義する場合もモナドを使うが、
ほとんど宣言的に記述できるように工夫されてる
(本当は DnD なんかもっとモナドを活用して宣言的に書けるはずなんだが、
今は未だライブラリで提供されてはいないな)
こういうモナドの活用例とその仕組みを入門書で知る事ができれば、
躓く人も少しは減ると思うんだ
0721デフォルトの名無しさん
2012/03/03(土) 21:23:35.66・プログラム = アルゴリズム + データ構造
という有名な言葉がある
これをHaskell流に見立てると、以下のようになる
・プログラム = 数式 + 代数的構造
つまり、「Haskellプログラミングとは数学的活動である」と見なすことができる
更には、Haskellには無限リスト、リスト内包表記、ガード、インデントベースといった
数学固有の記述法に適した構文が巧妙に組み込まれているから、
こうした数学的素養のある人にとって、Haskellはこのうえもない関数型言語に感じるはず
また>>715はモナドに関するカキコだけど、より一般的に解釈すれば、
初心者がHaskellを触るによって「数学的活動としてのプログラミング」の第一歩を
自然と歩むことになることを意味する
これは「正しい」プログラミング設計作法を学ぶためには、とても好ましい道筋だと思う
0722デフォルトの名無しさん
2012/03/03(土) 23:41:08.94haskellが数学ならCだって数学でしょ
0723デフォルトの名無しさん
2012/03/04(日) 01:37:16.99関数を使うんだからCも数学だよね
0724デフォルトの名無しさん
2012/03/04(日) 01:46:17.12Haskellは数学を前提にするのは、分かってる人にしか分からない説明を
助長するだけだと思うんだが
「数学をわかってる」人って、そんなにいないと思う
0725デフォルトの名無しさん
2012/03/04(日) 02:10:26.82そんなの理系でも殆どの人が知らないよ
MLは型付きラムダだから、知っている人が少しは多そうだけど
それでも非常にマイナーな分野なのは間違いない
0726デフォルトの名無しさん
2012/03/04(日) 02:44:10.59> ・プログラム = 数式 + 代数的構造
いや、アルゴリズムはちゃんと記述するよ、Haskellでも。
0727デフォルトの名無しさん
2012/03/04(日) 02:45:21.71型理論は形式推論理解しない人には難しい。
0728デフォルトの名無しさん
2012/03/04(日) 09:25:34.34とか言ってるのと同じ。
0729デフォルトの名無しさん
2012/03/04(日) 10:35:03.22まぁ、実際、ある程度は計算機のアーキテクチャを理解しないとCは使いこなせないだろ。
「理論的には」Cの仕様はもっと抽象化されているのかもしれないけど、メモリがどうとか考えていたほうがむしろ簡単。
0730デフォルトの名無しさん
2012/03/04(日) 11:42:24.36と考えるのは?
0731デフォルトの名無しさん
2012/03/04(日) 12:09:20.35おおむね同意だが
Haskellにおいてもと言うか、命令型言語よりも、よりダイレクトに
「プログラミング=アルゴリズム+データ構造」だ
0732デフォルトの名無しさん
2012/03/04(日) 12:11:09.15最低限、メモリの仕組みは知らないとまともに使えないだろ
0733デフォルトの名無しさん
2012/03/04(日) 12:19:25.490734デフォルトの名無しさん
2012/03/04(日) 13:07:56.00x = 1
x = x + 10
print x
これで11と表示されるのを自然だと思わないといけない以上、メモリの知識からは逃れられないよね
Haskellは、そう言う意味じゃメモリの知識から開放されてるとも言えるけど、そのメリットは
PC以外の上でも実行可能と言うことになる
人間とか、未知のアーキテクチャな何かとか
0735デフォルトの名無しさん
2012/03/04(日) 13:10:14.000736デフォルトの名無しさん
2012/03/04(日) 13:20:01.18+ n で配列の要素 n 個ぶんずれる、と考えるほうが自然だと思うが。
0737デフォルトの名無しさん
2012/03/04(日) 13:21:13.92> x = x + 10
>
> print x
>
> これで11と表示されるのを自然だと思わないといけない以上、メモリの知識からは逃れられないよね
x = 1
y = x
x = x + 10
print y
これで10と表示されるのが自然だと思わないといけない以上、メモリだと強弁するのは無理があるよね
0738デフォルトの名無しさん
2012/03/04(日) 13:30:53.47自然というか、抽象度がより高いと言える
どちらを自然と思うかは文脈や環境による
0739デフォルトの名無しさん
2012/03/04(日) 13:36:36.70またそういう操作を前提にしたライブラリを作ったりするわけで、やっぱりメモリがどうとか、構造体のマップがどうとか、
考えないとCを使いこなしているといえないだろ
0740デフォルトの名無しさん
2012/03/04(日) 13:41:55.86>>734 の書き込みが意味不明なだけ。
x = 1
x = x + 10
print x
これが 11 になるのは変数と代入の概念がわかってりゃいいだけで
メモリ関係ねーよ
0741デフォルトの名無しさん
2012/03/04(日) 13:56:28.44そういうモナド使うとこんなのがこんなふうにかけてナイスなの的なものが探しやすく転がってるといいんだけどね。
自分はF#erなんだが、非同期処理を簡潔に書けるモナド使ったasync workflowってのがあって仕組みはよーわからんかったが、モナド便利と思った。
0742デフォルトの名無しさん
2012/03/04(日) 14:11:46.290743デフォルトの名無しさん
2012/03/04(日) 14:52:20.27少なくとも初学者にとっては
0744デフォルトの名無しさん
2012/03/04(日) 15:42:52.29チュートリアルの最後に出てくるような「高度な機能」が難しいならわかる。
Haskell が厳しいのは、他のどの言語でも簡単に書けるようなことが
Haskell ではモナドを使わなければ書けない。
某隔離スレ的に言えば、モナドを使わなければ Haskell はそれこそ玩具。
そして、そのモナドが Haskell で一番難しい。
Haskell は、このジレンマが難しいとこだな。
0745デフォルトの名無しさん
2012/03/04(日) 15:47:48.230746デフォルトの名無しさん
2012/03/04(日) 15:54:26.330747デフォルトの名無しさん
2012/03/04(日) 15:56:43.600748デフォルトの名無しさん
2012/03/04(日) 15:57:11.86なんで戻り値が String にならないの?
という初学者の素朴な質問にどう答えられるか。
0749デフォルトの名無しさん
2012/03/04(日) 16:14:09.93参照透過性が保証できないから
これくらいは初学者用の入門書に必ず書かれていると思うが
0750デフォルトの名無しさん
2012/03/04(日) 16:23:42.36そうすることで何が嬉しいかという所からな
0751デフォルトの名無しさん
2012/03/04(日) 16:25:13.92答えになってないような。
IO String 型だとどうして参照透過性が保証できるの?
0752デフォルトの名無しさん
2012/03/04(日) 16:54:53.88y = x
x = x + 10
print y
これって出力 1 だよね 11 って出る言語があるの?
0753デフォルトの名無しさん
2012/03/04(日) 17:01:27.05RealWorldを使ったIOのアナロジー
関数型の値の同値関係として外延的同値(∀ x. f x = g x)を考えれば
String -> IO StringはString -> RealWorld -> (String, RealWorld)になって
末尾の直積部分のString又はRealWorldが異なるとしても第二引数のRealWorldが違うことより関数性の前提が偽であるから
関数性が成り立つと仮定した場合にその否定の証拠たりえない
という言い逃れができる(笑
0754デフォルトの名無しさん
2012/03/04(日) 17:09:44.62逆だよ
readFile 関数が内部で行うことが参照透過性を保証できないから、
String 型ではなく IO String 型を使用させるを得ない
readFile 関数が参照透過性を保証できるのなら String 型を使ってる
なんで readFile 関数が内部で行うことが参照透過性を保証できないかと言えば、
引数である Srring 型のある値に対して、戻り値として返す String 型の値が
いつ如何なる時でも同じ値になるとは限らないからだ
それは、例えば読み込むファイルの内容が一時間前と変わっているかもしれないから
そうなれば同じ引数に readFile 関数を適用しても、戻り値が同じにならない
同じになる場合もあれば、ならない場合もあり、同じだという保証ができない
0755デフォルトの名無しさん
2012/03/04(日) 17:16:25.270756デフォルトの名無しさん
2012/03/04(日) 17:16:58.620757デフォルトの名無しさん
2012/03/04(日) 17:23:07.340758754
2012/03/04(日) 17:23:11.24初学者相手なら >>754 のような説明で十分だが、もう少し厳密に言っておく
本当は IO String 型を返す関数でも参照透過性は保証されていると考えられる
readFile 関数が返す IO String 型の値は文字列そのものではなく、
「引数で指定されたパスのファイルから文字列を得るという内容を含むアクション」という値だ
この値を解釈して意図通りに実行するのは実行系の役割だ
こう考えれば、引数である String 型のある値に対して、
戻り値の IO String 型のある値は、いつ如何なる時でも同じ対応関係にあると言える
が、初学者はここまで考える必要はなく、
IO モナドの中の型の値が参照透過性を保てないんだなと考えれ、
できるだけ参照透過性が保てる普通の関数を使うよう意識していればいい
0759754
2012/03/04(日) 17:28:31.61猛者達に突っ込まれる前に言っておく
> 「引数で指定されたパスのファイルから文字列を得るという内容を含むアクション」という値だ
これは readFile 関数を使う我々プログラマ側から推測できるアクションの内容だ
この関数の中では他にも目に見えない様々なアクションがモナドという皮で包まれているかも知れん
だが、引数の値が同じなら、同じ内容のアクションが返ってくる事は言える
ついでに、
> 保てないんだなと考えれ、
保てないんだなと考えて、
0760デフォルトの名無しさん
2012/03/04(日) 18:06:48.94「そんなややこしい仕組みを持ち込むメリットがどこにあるのか」
が、分からないんですよ。
IO モナドを使わなければ参照透明だといわれても
そもそも Main が IO () なわけで。
0761デフォルトの名無しさん
2012/03/04(日) 18:08:10.36OCamlは苦労してるらしい
0762デフォルトの名無しさん
2012/03/04(日) 18:23:30.24ではモナドの仕組みで必要十分、言い換えると、モナドがそのためにもっとも簡便な手段なんだろうか?
もしくはモナドのようにするしかない理由は何?
って疑問に答えようとすると、圏論がどうのとかって方向に行ってしまうのでしょう。
0763デフォルトの名無しさん
2012/03/04(日) 18:39:47.48参照透過性のために難しい理論を持ち込まなければいけないとなれば
「凡人」はメリットよりデメリットが大きいと思ってしまうのでしょう
Haskellの問題は、この点について「凡人」を納得させる言葉を未だに持っていないことでは
0764デフォルトの名無しさん
2012/03/04(日) 18:39:56.650765デフォルトの名無しさん
2012/03/04(日) 18:45:02.73bind も「ああ、継続を簡単にしたものね」としか思わなかった。
ただ、IOモナドでなくても、たとえば readFile が (world,s)
みたいなタプルを返すだけでもいいんじゃないのか、あとは普通に
パターンマッチで s を取りだせばいいんじゃないか、とは思った。
0766デフォルトの名無しさん
2012/03/04(日) 18:50:50.46まともにプログラミングしようと思ったらIOモナドは必須なので
複数のモナドを組み合わせて使うのにモナド変換子が必要になって
初心者はつまづく
0767デフォルトの名無しさん
2012/03/04(日) 19:18:54.44最適化のために参照透明性が重要だというなら
C より早くして実績で示すしかないだろう
0768デフォルトの名無しさん
2012/03/04(日) 19:23:18.53> Haskellの問題は、この点について「凡人」を納得させる言葉を未だに持っていないことでは
べつに問題だとは思えないな
「凡人」のままで止まらない人だけが Haskell を学び始めればいいと俺は思う
参照透過性のない言語で普通にプログラミングしている「凡人」が、
その気持ちや頭を切り換えないまま安易に Haskell を学ぼうとするからダメなんだよ
そういう人は他言語のパラダイムとか、
クラスなどの他言語の道具との比較や比喩で理解しようとする
自ら壁を作っておきながら、分からないと愚痴る
躓く最大の原因はこれだと思うよ
比較はけっこう熟練してきたなと感じてからでいいんだよ
その頃には自然と、他言語との繋がりも分かってくる
頭を切り換えれば、本当にスラスラと学習が進むんだがな
銀行員から和紙職人に転職するくらいの気持ちがなきゃ手を出すなと言いたい
0769デフォルトの名無しさん
2012/03/04(日) 19:24:07.42お前の中ではどの程度までが「初心者」に入るんだよ
0770デフォルトの名無しさん
2012/03/04(日) 19:38:35.60ですよね。普通の人向けの言語ではないですよね。
0771デフォルトの名無しさん
2012/03/04(日) 19:39:42.75最適化のために参照透明性が重要なんじゃない
純粋関数型の体裁を作る為に参照透明性が重要なんだよ
参照透明性があると、ある部分で最適化がしやすいが、
それは結果であって目的ではない(最適化しやすくなることは初めから分かっていたが)
それに参照透明性があると、ある部分で最適化がしやすいのは、
何も関数型に限らず C などの手続き型でも同じだ
例えば引数に const を付けてポインタが示す内容が変更されない事を保証すれば、
その部分に限って参照透明性が保たれ、最適化しやすくなると言える
ところで、なぜその実績を示すのに C より早くする必要がある?
最適化における参照透明性の重要性を示すのなら、
同一言語において参照透明性がある場合とない場合で比較すれば済む話だと思うが
0772デフォルトの名無しさん
2012/03/04(日) 19:40:13.09数学を学ぶための言語だと思う方がいい
0773デフォルトの名無しさん
2012/03/04(日) 19:42:48.33普通の人でも学べる言語だよ
私は普通だったし、私の周りの人間も普通だ
意識して頭を切り換えようとしない人には学べないんだよ
意思と目的があれば、普通の人は切り替えようとする
0774デフォルトの名無しさん
2012/03/04(日) 19:44:46.820775デフォルトの名無しさん
2012/03/04(日) 19:48:19.54そんなことはない
Haskell の設計の目的のひとつは実用的なプログラムが書けるようする事だ
http://research.microsoft.com/en-us/um/people/simonpj/papers/history-of-haskell/
その目的は忘れられることなく着実に進化している
Haskell を使って数学の何を学ぼうと言うんだ?
純粋に数学を学ぶよりも Haskell を使った方が近道なのか?
0776デフォルトの名無しさん
2012/03/04(日) 19:52:26.22最終学歴は?
0777デフォルトの名無しさん
2012/03/04(日) 19:53:19.890778デフォルトの名無しさん
2012/03/04(日) 19:53:22.630779デフォルトの名無しさん
2012/03/04(日) 19:54:02.620780デフォルトの名無しさん
2012/03/04(日) 19:56:45.35むしろ小学校すら言ってませんが?みたいなプランテーション労働者から成功したHaskellプログラマーとか出たら人気出るよ
0781デフォルトの名無しさん
2012/03/04(日) 19:57:57.71高卒だが?
0782デフォルトの名無しさん
2012/03/04(日) 19:58:17.87そうですね。なので「残念ながら」と書きました。
モナドを理解しなくとも Haskell プログラムを書けるかもしれません。
が、残念ながら Haskell プログラマの大半はモナドに興味を持ち
大半は圏論に興味を持ち
大半は理論的な勉強を始めます。
残念ながら Haskell はそういう人達の言語です。
0783デフォルトの名無しさん
2012/03/04(日) 20:00:19.55そんなもので人気が出ると逆に迷惑だな
意識して頭を切り換えようとしない馬鹿が大量に入門してきて、
C より遅いだの、メリット無いだの騒ぐんだろ
ほんと嫌になるな
0784デフォルトの名無しさん
2012/03/04(日) 20:01:09.140785デフォルトの名無しさん
2012/03/04(日) 20:02:10.48なんだ今と同じじゃないかw
人気出るデメリット無いな
0786デフォルトの名無しさん
2012/03/04(日) 20:05:10.19いや、俺が個人的に迷惑だと感じてるだけだ
馬鹿大量入門にメリットを見いだせる人もそりゃ大勢いるだろう
0787デフォルトの名無しさん
2012/03/04(日) 20:13:46.35> ただ、IOモナドでなくても、たとえば readFile が (world,s)
> みたいなタプルを返すだけでもいいんじゃないのか、
表示的意味論で継続を使った意味付けがまさにそんな感じです。
その辺の手法をひとまとめにしたのがmonadなんです。
0788デフォルトの名無しさん
2012/03/04(日) 23:55:50.58だとすると、計算機科学でPh.Dを取ろうというのでない限り、手を出さない
方がいいということにならない?
門外漢ながら型推論の仕組みが知りたいので、基礎の基礎であるλ計算から
ひまを見つけて勉強しているが、大変むつかしい。
0789デフォルトの名無しさん
2012/03/05(月) 00:22:27.92読書会もやってるから参加して詳しい人に聞け
0790デフォルトの名無しさん
2012/03/05(月) 00:44:51.87目次と宣伝文句を見てみたが、実用本位の書き方っぽいですね。
買ってみます。
0791デフォルトの名無しさん
2012/03/05(月) 06:02:42.14顕正新聞 平成24年2月5日号「原発全廃特集号」
原発は日本を滅ぼす、即時全廃せよ
人のDNAを破壊、国土を居住不能にする
代替は天然ガス・コンバインドサイクルで十分
惨禍もたらすを知って推進するは犯罪
ttp://d.hatena.ne.jp/kensho01/20120208/1328718592
0792デフォルトの名無しさん
2012/03/05(月) 20:28:15.01ハスケルはオキャムルかチョウベリバマヨウヨマー
やっぱ実用的なのはオキャムルかなー
0793デフォルトの名無しさん
2012/03/05(月) 20:32:26.23ふざけてんなら関数型は無理だ
止めた方が良い
0794デフォルトの名無しさん
2012/03/05(月) 20:42:15.730795デフォルトの名無しさん
2012/03/05(月) 21:08:54.45Haskell行っとけ。まだ灰汁が薄めのScalaもよいかも
0796デフォルトの名無しさん
2012/03/05(月) 21:13:15.10OCaml使うなら、python/rubyで良いじゃんって感じするな・・・
一応、Haskellも実用的なソフトの紹介とかあった(このサイトもpandocというHaskell製汎用ドキュメントコンバータで書いてるそうな)
http://tanakh.jp/pub/unisys-tech-2011-11-09.html#1
0797デフォルトの名無しさん
2012/03/05(月) 21:18:08.500798デフォルトの名無しさん
2012/03/05(月) 21:18:16.66http://www.haskell.org/haskellwiki/Haskell_in_industry
0799デフォルトの名無しさん
2012/03/05(月) 22:13:14.110800デフォルトの名無しさん
2012/03/06(火) 00:00:43.39lazy eval な処理系って realtime なシステムに適用可能なの?
0801デフォルトの名無しさん
2012/03/06(火) 00:44:06.770802デフォルトの名無しさん
2012/03/06(火) 00:46:48.02適用可能か、どの程度まで可能か、何が適用を妨げているか、
という事をちゃんと検証した実例が今は未だ見当たらない
個々の大学や、会社の研究部署では研究しているところもあるかも知れんが、
例えば ACM の論文なんかを漁っても、そういう報告は見当たらない
単に私の探し方が悪いのかも知れんが
0803デフォルトの名無しさん
2012/03/06(火) 01:10:20.57MonadiusがHaskellでシューティングゲームを作れる事を実証しましたが、
実行しているとだんだん重くなるという問題点も発見されました。
遅延評価がどの程度までレイテンシ保証可能なのかは知りませんが、
少なくとも今のHaskell実装はリアルタイムシステムに適用不可能ですね。
0804デフォルトの名無しさん
2012/03/06(火) 01:32:37.12遅延評価そのものは正格評価と簡約回数に差は無いので適用できると思う
が、LLが組み込みに向かないのと同じで、関数型言語もメモリを食う
Cはメモリを切り詰めようと思えば切り詰められる様な機械よりな言語仕様なのが強み
(プログラマの負担も増えるが、逆に言えば、細かい所までプログラマが触ることができる)
言語部分とライブラリ部分がOS開発を意識して分かれてるのも特徴
(Cの言語部分は、OSの機能が無い前提の仕様になってる。入出力はおろか、メモリ管理機能すら#includeで読み込むライブラリ関数)
Haskellも、デフォルトで読み込まれるモジュールを使わなくてもCと同じように入出力以外で困ることは無いんだけど、多分、言語自体がOSの機能を前提に作られてると思う(主にメモリ管理機能)
OSも所詮は便利ライブラリ群でしかないんだけど、それを実行ファイルのランタイムに含めるとなると、大きくなりすぎるので、やっぱり組み込みには不向き
(それ以前にGC搭載の時点で組み込みに不向きなんだが・・・)
Android(Java)の例もあるので、スマフォみたいにOSが乗ってる組込み分野なら、自分たちが思ってるほど不向きでは無いのかも知れない
少なくとも、遅延評価なC言語があっても、組込み言語として全然問題は無い
0805デフォルトの名無しさん
2012/03/06(火) 01:42:38.59オブジェクト指向なHaskell
最近、モナド=プラットフォームで、いわゆるモナド指向とでも言うべきもの?
IOモナド=命令型コンテクストで、理論的には論理型言語や、オブジェクト指向もモナドのコンテクストのひとつとして作れるっての読んでちょっと混乱中
http://tanakh.jp/pub/unisys-tech-2011-11-09.html#1
0806デフォルトの名無しさん
2012/03/06(火) 01:45:42.052行目以降は普通のHaskellについての感想ね
0807デフォルトの名無しさん
2012/03/06(火) 03:50:22.03>遅延評価そのものは正格評価と簡約回数に差は無いので適用できると思う
リアルタイムシステムで重要なのはスループットではなくレイテンシ保証です。
遅延評価がリアルタイムシステムで使えないとされているのは、
簡約回数が多いからではなく、簡約のタイミングを制御しにくいからです。
0808デフォルトの名無しさん
2012/03/06(火) 08:13:00.14「真のプログラマはHaskellを使う」で評価順序をすごい細かく制御する技法が紹介されていなかったっけ?
まあ、それは高度かつ煩雑な技術なので、そういうのを持ち出して比較することに意味があるのか、という疑問はあるが。
リアルタイム処理でCが好まれるのは、コンパイル結果を推測できない、実際の動作は処理系任せである、
というのを嫌う技術者のプライドが大きいと思う。
実際、医療系とかで「いやー、それはコンパイラのバグですかねー」とか言われたら、困るし。
0809デフォルトの名無しさん
2012/03/06(火) 10:41:44.08そこまで評価順序を気にするんならHaskell使うのは本末転倒だろw
向き不向きがあるんだから、評価順が予測通りに出来る言語使えばいいんじゃない?
0810デフォルトの名無しさん
2012/03/06(火) 10:53:45.310811デフォルトの名無しさん
2012/03/06(火) 10:56:23.60評価順の制御とレイテンシーは関係なくね?
> リアルタイム処理でCが好まれるのは
GC がある言語が嫌われるのは事実だが, 特に Cが好まれてるとは思えない.
手頃なアセンブラの大替え品って所だろ
0812デフォルトの名無しさん
2012/03/06(火) 11:29:00.600813デフォルトの名無しさん
2012/03/06(火) 19:20:21.83haskellもいろんな意味で楽しそう
0814デフォルトの名無しさん
2012/03/07(水) 01:04:31.080815デフォルトの名無しさん
2012/03/07(水) 01:06:01.420816デフォルトの名無しさん
2012/03/07(水) 01:20:35.980817デフォルトの名無しさん
2012/03/07(水) 03:05:01.08Common lisp
0818デフォルトの名無しさん
2012/03/07(水) 09:50:10.65文字列すらmutable前提だし
0819デフォルトの名無しさん
2012/03/07(水) 10:19:08.570820デフォルトの名無しさん
2012/03/07(水) 10:29:39.500821デフォルトの名無しさん
2012/03/07(水) 11:16:41.25数学をやる上でmutableとかimmutableとか普通考えないだろ
というかimmutableだって考えはごく一部の数学分野で必要とされるだけじゃないの
0822デフォルトの名無しさん
2012/03/07(水) 12:23:03.74mutableだと最も単純なやり方でもHoare論理を使った面倒なものになる
これはpascal風の擬似言語で書かれた逐次実行、ループ、分岐が使われたsumをHoare論理を使って検証することと
適当な関数型言語におけるsumを自然数に置ける帰納法を使って検証することを比べてみればよくわかる
関数型言語が一般的にこのような流儀の形式手法を重視しているなら関係はあると言ってもいいんじゃないかな?
0823デフォルトの名無しさん
2012/03/07(水) 12:36:46.88ただ教科書で説明する分には判りづらさが跳ね上がるだけ
やはり入門書を書く上での都合というのもあるのかな?
関数型言語を使って飯食ってる人達は大抵副作用バリバリのコード書いてるという事実を知るとよりそういう考えが強まる
0824デフォルトの名無しさん
2012/03/07(水) 12:46:12.81> 関数型言語を使って飯食ってる人達は大抵副作用バリバリのコード書いてるという事実
ちょっと違う
副作用バリバリのコードと、副作用の無いツルツルのコードとを明確に分ける
更に言えば、副作用バリバリのコードは可能な限りライブラリの中に隠す
バリバリとツルツルをまぜてたんじゃ飯食えるほどの仕事はできん
0825デフォルトの名無しさん
2012/03/07(水) 12:48:09.63関数型とオブジェクト指向が合体した言語というが、
それがどういう機能を持っている事、何ができる事を期待してるんだ?
0826デフォルトの名無しさん
2012/03/08(木) 00:17:04.04C言語は関数ができなくても、理解可能か?
http://toro.2ch.net/test/read.cgi/tech/1090089115/
0827デフォルトの名無しさん
2012/03/08(木) 01:38:19.90http://toro.2ch.net/test/read.cgi/tech/1331138122/
0828デフォルトの名無しさん
2012/03/09(金) 01:56:00.560829デフォルトの名無しさん
2012/03/16(金) 21:13:20.150830デフォルトの名無しさん
2012/03/17(土) 20:03:40.890831デフォルトの名無しさん
2012/03/18(日) 04:28:30.65http://toro.2ch.net/test/read.cgi/tech/1331902463/
0832デフォルトの名無しさん
2012/03/18(日) 07:00:54.23thanks!
さっそくお気に入り登録した
0833デフォルトの名無しさん
2012/03/19(月) 22:29:21.890834デフォルトの名無しさん
2012/03/19(月) 22:37:55.510835デフォルトの名無しさん
2012/03/19(月) 23:17:29.520836デフォルトの名無しさん
2012/03/19(月) 23:43:09.95値構築子を関数と見なせば、チャーチ数と似たような構造で自然数を表現できるし、
その上で閉じた演算ができるのだけれど、じゃあこれがチャーチ数かと訊かれれば、
ちょっと違うような気がする
http://ja.wikipedia.org/wiki/%E3%83%A9%E3%83%A0%E3%83%80%E8%A8%88%E7%AE%97#.E8.87.AA.E7.84.B6.E6.95.B0.E3.81.A8.E7.AE.97.E8.A1.93
0837デフォルトの名無しさん
2012/03/20(火) 00:15:14.64チャーチ数は >>836 のリンク先のように自然数の「構造」を関数で表現したものだ
例えば自然数の 2 は、何かに関数を2回適用するという構造として表現している
しかし、他の関数型言語のことは知らんが、
少なくとも Haskell では関数を使って何かの「構造」を表現する事はできない
Haskell の関数は、あくまで何かを計算する事しかできない
関数では不可能な構造を表現するために代数データ型が存在している
例えば何かに関数を2回適用したのか、それとも3回適用したのかを知るには、
その関数適用の構造ではなく、適用した結果に対して自然数の2や3を対応付けるしかない
もちろん、2回適用したものと3回適用したものとの和を計算するのも、
その関数適用の構造そのもので和を計算するのではなく、
関数を適用した結果が対応する「値」に対して和を計算するしかない
関数を適用した結果を代数データ型というある種の構造を表現する値に対応付けることはできる
その方法で構造を自然数に対応付けるのが >>836 の例なのだが、
これは関数で自然数の構造を表現しているのではなく、
あくまで代数データ型で自然数の構造を表現しているのだから、
もはやチャーチ数とは呼べない(構造の形自体は似たように作れるが)
よって、チャーチ数の表現およびその上での演算ができるのが最低限と言われると、
少なくとも Haskell は関数型ではなくなってしまうと私は思う
0838デフォルトの名無しさん
2012/03/20(火) 00:22:50.19template<class> struct Count;
template<class type> struct Count< F<type> >
{
enum{ value = Count< type >::value + 1 };
}
template<class type> struct Count< void >
{
enum{ value = 0 };
};
Count< F< F< F< F<void> > > >::value == 4;
C++のtemplateの方がまだ関数型なのか?
0839デフォルトの名無しさん
2012/03/20(火) 00:26:26.44× template<class type> struct Count< void >
○ template<> struct Count< void >
0840デフォルトの名無しさん
2012/03/20(火) 02:59:07.51まさか、昔書いたコードを引っ張り出すことになるとわw
-- 自然数を定義
data NaturalNum = Zero | PlusOne NaturalNum
deriving (Eq,Ord,Show,Read)
-- 加算を定義
Zero +^ n = n
m +^ Zero = m
m +^ n = inc m +^ dec n
-- 減算を定義
Zero -^ n = n
m -^ Zero = m
m -^ n | m == n = Zero
m -^ n = dec m -^ dec n
-- インクリメント(1+)を定義
inc n = PlusOne (n)
-- デクリメント(1−)を定義
dec (PlusOne (n)) = n
-- 自然数を独自自然数へ変換
int2NaturalNum 0 = Zero
int2NaturalNum n = PlusOne (int2NaturalNum (n-1))
-- 独自自然数を自然数へ変換
naturalNum2int Zero = 0
naturalNum2int n = 1 + naturalNum2int (dec n)
0841デフォルトの名無しさん
2012/03/20(火) 03:04:19.80うーん、時間が有るとき挑戦してみよう
0842デフォルトの名無しさん
2012/03/20(火) 03:17:44.71Prelude> let null = 0
Prelude> let f = (1+)
Prelude> f $ f $ f null
3
0843デフォルトの名無しさん
2012/03/20(火) 07:42:39.050844デフォルトの名無しさん
2012/03/20(火) 08:27:05.60静的型なので普通の関数とは区別されてますが
0845デフォルトの名無しさん
2012/03/20(火) 10:21:15.73そうやって表現した自然数3の「構造」と、
同じように表現した自然数4の「構造」とを足して、
自然数7という数値ではなく、自然数7という「構造」がラムダ式のみで得られるか
ということだよ
チャーチ数がラムダ式で表現する自然数7という「構造」は、
λf x. f (f (f (f (f (f (f x)))))) だ
0846デフォルトの名無しさん
2012/03/20(火) 10:42:53.44できないぞやーいやーい、と言っているお子様のいるスレはこちらですか?
0847デフォルトの名無しさん
2012/03/20(火) 11:32:41.98私は Haskell を揶揄しているつもりは毛頭ない
Haskell の他言語に対する利点欠点など、今回の話では何も関係ないからどうでいい
チャーチ数の定義が Wikipedia に載っているものであるならば
「1引数関数 f と任意の x を受け取り、f を x に n 回適用する『関数』を返す関数」
Haskell でその定義どおりにチャーチ数およびの上での演算は表現できないのではないか
したがって、関数型言語ならばそれができて当然とは言えないのではないか
と私は言っている
更に、そもそも Haskell では関数を使って構造を定義することはできないと私は考える
また >>846 に反論するが、
たとえ Haskell が今の形を保ったまま型無し言語に変わったとしても、
依然として Haskell の関数で構造を表現する事はできないのではないだろうか
Haskell だと関数の構造は隠されており、何回適用したかは外から見えない
値構築子も関数の一種だという意見も一方ではあり、
たとえば >>840 で表現できるというと言う人もいるだろうが、
それは上記の定義における「任意の x」を「ある特定の x」に限定したものではないだろうか
もちろんそれは、関数が何回適用されたかの数を保存する構造を持ったある x だ
0848デフォルトの名無しさん
2012/03/20(火) 12:17:06.20まぁ、ランクN多相使えばできるけどな。
ttp://d.hatena.ne.jp/maoe/20110402/1301677925
0849デフォルトの名無しさん
2012/03/20(火) 13:06:30.40申し訳ない
言語としてのHaskellを考える時は Haskell 2010 Language Report を参照している
http://www.haskell.org/definition/haskell2010.pdf
それはそれとして、言語拡張を使った >>848 の例は面白そうなので、
これでチャーチ数およびその上での計算ができるか検証してみる
それともどこかに落し穴がある?
newtype MyNum a r = MyNum { unNum :: ((MyNum a r -> r) -> r -> r) }
-- 続きはgistで
https://gist.github.com/2135612
少なくとも+ - * == factは関数とMyNumだけで書けてるっぽい。Intへの変換も可能。
0851デフォルトの名無しさん
2012/03/20(火) 23:35:48.23上手くいくというのを、チャーチ数の定義と同義だという意味で言ってるのなら、
○○的帰納法で試しかめてみれば良いんじゃないか
0 の時にチャーチ数の定義と同義か確かめる
x の時にチャーチ数の定義と同義だとして x+1 の時にチャーチ数の定義と同義か確かめる
0852営利利用に関するLR審議中@詳細は自治スレへ
2012/04/02(月) 17:34:49.72ドーバーだけに安いんだけどな。元は1989年の本。
0853営利利用に関するLR審議中@詳細は自治スレへ
2012/04/02(月) 17:36:16.250854営利利用に関するLR審議中@詳細は自治スレへ
2012/04/02(月) 18:10:39.12型なしのλ計算に、かなり素朴な方法で複合型を導入してる。
だから厳密さはないが、それなりに面白い。
ただのPostscript版があるからちょっと読んでみれば?
>>853
いや、最後の二章でMLとLiispを扱ってるだけ。
0855営利利用に関するLR審議中@詳細は自治スレへ
2012/04/02(月) 18:37:12.66look insideしたら簡単に書いてくれてる気がする
0856営利利用に関するLR審議中@詳細は自治スレへ
2012/04/05(木) 12:50:00.85情報さんくす。 読んでみます。
0857営利利用に関するLR審議中@詳細は自治スレへ
2012/04/05(木) 13:53:20.55それは 「Hindley and Seldin」とも呼ばれたりする定番本です。
簡単ってことはないけど、手元に一冊あれば今後も色々と参照すること間違いない本。
この本の内容が簡単という人は、この世界に進んだほうがいいと思われ
0858デフォルトの名無しさん
2012/08/19(日) 13:06:42.600859デフォルトの名無しさん
2012/08/19(日) 13:20:31.76こんなに話題がないという状態がおかしい。
まだ少数の個人レベルで楽しんでいる状態だろう。
0860デフォルトの名無しさん
2012/08/19(日) 18:41:56.78少なくとも欧米の方だと大分評価されてて主に金融向けとかで求人もたくさんある。
日本でも使ってる所いくつかあるみたい。
自分も金融向けだけどクライアントからクラウドまで使い倒してる。
もうC#は嫌ぽ(´・ω・`)
0861デフォルトの名無しさん
2012/08/19(日) 20:13:57.04アメリカも変わらないと思う
0862デフォルトの名無しさん
2012/08/19(日) 21:34:24.06逆はどうなんでしょう?
0863デフォルトの名無しさん
2012/08/19(日) 21:46:14.68そうしてできたのがC言語
当時において、記述力・実行効率・コンパイラの規模等のバランスのもっとも良かった言語
0864デフォルトの名無しさん
2012/08/19(日) 21:57:04.340865デフォルトの名無しさん
2012/08/19(日) 21:59:31.790866デフォルトの名無しさん
2012/08/19(日) 22:39:26.00そうそう、C言語は(手続きが無くて)関数だけでプログラミングするから関数型言語だよな
...... こうですか?よくわかりまへんw
0867デフォルトの名無しさん
2012/08/19(日) 22:51:24.870868デフォルトの名無しさん
2012/08/19(日) 23:05:53.59とかいうものも、特にないよな
0869デフォルトの名無しさん
2012/08/19(日) 23:15:07.57C#のラムダ式とか
0870デフォルトの名無しさん
2012/08/19(日) 23:43:23.33プールの時間にパンツを盗まれたクラス一の美少女宜しく
平然としてればいい
0871デフォルトの名無しさん
2012/08/20(月) 00:15:36.710872デフォルトの名無しさん
2012/08/20(月) 00:20:01.060873デフォルトの名無しさん
2012/08/20(月) 00:21:52.440874デフォルトの名無しさん
2012/08/20(月) 03:14:05.39流れの読めなさに爆笑した。
0875デフォルトの名無しさん
2012/08/20(月) 08:57:59.86手続き型が関数型の一部を取り込んだのは後から出てきたアイデアだからでしょう。
手続き型が先に広まったから手続き型のアイデアは最初から関数型に取り込まれています。
さらに後から出てきたアイデア(オブジェクト指向など)は
手続き型に取り込まれてから関数型に取り込まれても
関数型が手続き型の一部を取り込んだとはとはみなされません。
>>874
流れが読めてないのは真面目な質問に対してボケた>>866だと思います。
0876デフォルトの名無しさん
2012/08/20(月) 09:08:46.320877デフォルトの名無しさん
2012/08/20(月) 09:11:18.190878デフォルトの名無しさん
2012/08/20(月) 13:54:31.50>手続き型のアイデアは最初から関数型に取り込まれています。
例えば何が取り込める?
0879デフォルトの名無しさん
2012/08/20(月) 14:32:37.57引数を先行評価する言語での、
引数の左からの逐次実行とかどうですかね。
もともと証明論から生まれた帰納関数、チューリングマシン、ラムダ計算が
コンピュータより先行していて、ノイマン型コンピュータは後発なので、
関数型言語は一種の先祖帰りとみなすことも可能です。
0880デフォルトの名無しさん
2012/08/20(月) 15:10:36.130881デフォルトの名無しさん
2012/08/20(月) 22:51:19.22OpenGLのコールバックは関数型だと宣伝されてました
0882デフォルトの名無しさん
2012/08/20(月) 23:09:56.15したがってCは関数型言語である
...... こうですか?よくわかりまへんw
/*** 許してw >>875 ***/
0883デフォルトの名無しさん
2012/08/20(月) 23:12:43.90セルを破壊的に更新するLispのsetqとか
0884デフォルトの名無しさん
2012/11/03(土) 14:35:53.78全く意味が分からず、挫折して一年以上が経過していた。
最近、Haskellを真面目に勉強するところから始めようかなと思い、
Graham Hattonの『プログラミング Haskell』を読み始めた。
それで、第3章の「型とは〜集合である」という表現を見て光明が見えた気がした。
数式処理の数式はリストだったので、
今まで、命題もリストなのだという先入観があった。
しかし、型が集合ならば、証明が型推論であっても不思議ではない。
0885デフォルトの名無しさん
2012/11/08(木) 08:56:25.800886デフォルトの名無しさん
2012/11/13(火) 23:32:07.34命題は証明ではない
0887デフォルトの名無しさん
2012/11/25(日) 13:37:51.40今、習作として正則表現エンジンを作ろうと思ってるんだけど、
NFAを組み立てるとき循環グラフ?になるよね。
a(bc)*d
っていう正則表現だったら、
a->ε->(b->c)->εの所へもどる
. ->d
とかそんなグラフになると思うんだけど
(b->c)を作っているときはεの節が作られていなくて、
εの所へ戻る枝?が作れません。
Cなんかだと(b->c)とかのグラフ群オブジェクトを作る時、
最後の枝を外から書き換えられるようにしてεを完成させるときに
(b->c)のオブジェクトに対して自分のところに戻ってくるように
書き換えました。
immutableでやりたいので書き換えは無しでやろうとすると
どうすればいいのでしょうか?
一般的に循環グラフをimmutableで構築するにはどうすれば
いいのでしょうか ?
教えてください。
お願いします。
0888デフォルトの名無しさん
2012/11/25(日) 15:02:02.640889デフォルトの名無しさん
2012/11/25(日) 16:35:06.07多相型のある型付きラムダ計算からSKIコンビネータ計算への変換方法って何か知りませんか?
0890デフォルトの名無しさん
2012/11/28(水) 23:05:10.820891デフォルトの名無しさん
2013/01/05(土) 19:20:40.590892デフォルトの名無しさん
2013/01/05(土) 19:22:28.12関数型言語の話題はHaskell以外あまり出てこないし盛り上がらない。
大学の関連部門だけなのかな?それともどこかで密かに熱くやってるの?
0893デフォルトの名無しさん
2013/01/05(土) 22:00:51.170894デフォルトの名無しさん
2013/01/06(日) 12:09:13.96減ってるように見えるだけで、
関数型もいい意味で空気になったのかなあと
0895デフォルトの名無しさん
2013/01/06(日) 12:40:05.80HaskellもCleanもMirandaの方言だから競合しやすいしね
0896デフォルトの名無しさん
2013/01/06(日) 15:04:06.690897デフォルトの名無しさん
2013/01/06(日) 15:45:49.090898デフォルトの名無しさん
2013/01/06(日) 16:02:37.820899デフォルトの名無しさん
2013/01/06(日) 22:19:25.57Haskell 言語(副作用なし、つまり入出力もない) → IOが中間言語Xを生成 → 中間言語Xが副作用(入出力)を担当。
これは屁理屈だ、と思う。
0900デフォルトの名無しさん
2013/01/06(日) 22:22:13.22単に、副作用のある部分と無い部分を上手に切り分けられるようにしてるだけで
0901デフォルトの名無しさん
2013/01/06(日) 22:27:12.93純粋詐欺なの?って思ってぐぐったら↓
「純粋関数型言語では、参照透過性が常に保たれるという意味において、全ての式や関数は副作用を持たない。」
「参照透過性が常に保たれると言う意味」じゃない場合で副作用がありうる、と言うことか…でも意味が分からないw
だれか平易な解説お願いします
0902デフォルトの名無しさん
2013/01/06(日) 22:39:47.11main=putStrLn "hello"
で、このときputStrLn "hello"の戻り値は何だと思う?わかるか?
こんな調子で全部副作用の汚いところはmainが引き受けるわな。で、mainの値は変化してるか? してないだろ
これが「式の値が変化してない」=「参照透過性が保たれている」のカラクリだ
0903デフォルトの名無しさん
2013/01/06(日) 22:54:53.26入出力するプログラムは副作用を持っていて参照透過性も無い
Haskellは、入出力するプログラムを組めないが、入出力するプログラムを返すプログラムを組める
入出力するプログラムを返すプログラムは、副作用を持たず参照透過性を保持することが可能
0904デフォルトの名無しさん
2013/01/06(日) 23:19:13.37IOモナドは実行の度にランタイムシステムからRealWorldというパラメータ
を受け取っている
このパラメータが毎回変化するために、異なるインプット→異なるアウトプット
となることでHaskellプログラムの中では純粋なままであるという理屈
だからプログラムは純粋だけど、ランタイムシステムが純粋じゃないと言える
0905デフォルトの名無しさん
2013/01/06(日) 23:45:06.220906デフォルトの名無しさん
2013/01/07(月) 01:51:43.560907デフォルトの名無しさん
2013/01/07(月) 14:51:40.940908899
2013/01/07(月) 20:37:17.54手続き型、非純粋関数型 = 翻訳中のどこでも、参照透過な構造を作れない。い
という風に考えたいけれども。。
純粋関数型言語の処理系は、翻訳のどこかで、参照透過な論理構造を作り上げる。
参照透過だから、いろいろ美味しく料理できる…かもしれない。
でも、料理した結果(機械語)は参照透過性は失われ、副作用ばりばり。
そうではなければ、実用性まったくないし。
0909デフォルトの名無しさん
2013/01/07(月) 20:54:13.95少なくとも「変数」「式」の概念がないと参照透過という言葉は意味を持たない
0910デフォルトの名無しさん
2013/01/07(月) 21:11:43.41ただ表示的意味論でよく使われる手法をmonadとして整理したので、
monadでI/Oなどの副作用を扱ったコードの意味が扱いやすいものであるのは間違いない。
0911デフォルトの名無しさん
2013/01/07(月) 22:25:08.370912デフォルトの名無しさん
2013/01/07(月) 23:01:24.490913デフォルトの名無しさん
2013/01/11(金) 07:39:21.78表示的意味論が適用できたってそれだけじゃだめだろ
参照透過性の定義を「式を、その値に束縛した変数で置き換えても結果が同じ」だとするなら、
その言語で「式」「変数」というのが何を意味するのかを決めて初めて議論できる
要するに、プログラムの意味だけ見てもそれが参照透過かどうか判断することはできなくて、
構文まで参照する必要がある
0914デフォルトの名無しさん
2013/01/11(金) 22:05:05.320915デフォルトの名無しさん
2013/01/11(金) 23:03:37.08単に名前を自分で付けられないだけで
0916デフォルトの名無しさん
2013/01/11(金) 23:18:03.32変数ではなく、むしろHaskellでいうところのStateモナドに近い
0917デフォルトの名無しさん
2013/01/12(土) 00:10:26.44機械語を参照透過と言って良いのかい。
機械語でも制約が何かいるのんじゃないのか。
でもそれ以前に>>908の「料理した結果(機械語)は参照透過性は失われ、副作用ばりばり」と言うのはどういう事を言っているのかしら
0918デフォルトの名無しさん
2013/01/12(土) 12:20:23.31多分「参照透過なのはコードだけ」
「副作用が出るのは処理系(コンパイラ、インタプリタ)のせい」ってのが
イマイチ理解出来てないんだと思う
0919デフォルトの名無しさん
2013/01/12(土) 13:09:34.35IO inside - Haskell Wiki
http://www.haskell.org/haskellwiki/IO_inside
0920デフォルトの名無しさん
2013/01/12(土) 14:31:51.470921デフォルトの名無しさん
2013/01/12(土) 18:59:17.84Haskellに副作用はない
出力されるIO()は参照透過
IO()の実行結果が参照透過でないだけ
0922デフォルトの名無しさん
2013/01/12(土) 20:13:33.880923デフォルトの名無しさん
2013/01/13(日) 06:44:31.21参照透過であることは認めるのだけど、副作用がないというのは詭弁だと思う。
感情をこめて言えば
「言葉の定義を適当にいじって、Haskellすごい、純粋関数型は特別と言っている信者どもうざい」
「Cコード→実行ファイル」のコンパイルだって、副作用ないといえるだろ。
どの言語でも、コンパイルは1入力1出力で、副作用はないし。実行すると副作用が表面化する。
0924デフォルトの名無しさん
2013/01/13(日) 06:47:18.06実行速度最適化に扱いやすい構造だと思う。
世界の窓が2個以上になると、参照透過にできなくなるけれども。 Foreign Function Interfaceで
unsafe系が係るとか・。
0925デフォルトの名無しさん
2013/01/13(日) 07:13:53.36Haskellに副作用はある。そのためのIOモナドなんだから。
ただ単に副作用の出る部分とそうでない部分をうまく切り分けてるだけだよ。
0926デフォルトの名無しさん
2013/01/13(日) 07:50:43.37「副作用」を「参照透過性を破るもの」と定義する派(結構ポピュラー)に従えば、
Haskellに副作用はないし、たとえばHaskell->JavaScriptに変換した結果
副作用のあるプログラムが出てくるのは何も問題ない
(逆にJavaScript->Haskellに変換すれば、意味は同じで副作用のないプログラムが出てくる)
0927デフォルトの名無しさん
2013/01/13(日) 07:59:50.26「HaskellからunsafePerformIOやIOを返さないforeign importを除いたものに
副作用はない」という意味だと思ってくれ
0928デフォルトの名無しさん
2013/01/13(日) 09:07:11.79Haskell処理系に副作用があり、プログラムからは完全に分離されている
これはunsafePerformIO等も例外ではない
Haskellの副作用について議論する時はHaskellプログラムとHaskell処理系(ランタイムシステム)
を区別する必要がある
0929デフォルトの名無しさん
2013/01/13(日) 09:18:55.94>>921はその必要な区別をしなかったから詭弁と叩かれてる
0930デフォルトの名無しさん
2013/01/13(日) 09:21:07.97単に「Haskellのソースコードが参照透過」ってだけ。
まあ言いたいことは分かるけど、言葉は正しく使わんとな
0931デフォルトの名無しさん
2013/01/13(日) 10:51:33.09入出力の不要なプログラムなんてありえない
入力に対して出力が一意なら、参照透過だといえないだろうか
0932デフォルトの名無しさん
2013/01/13(日) 11:54:08.65参照透明性とは関数が関数であるということを言う!ハァ?
そうだとしてもIO a同士の同値ってどう定義するんだと
RealWorld -> (a, RealWorld)な値の同値を外延的な同値にしてもRealWorld同士の同値とは?という話に
0933デフォルトの名無しさん
2013/01/13(日) 12:21:12.15参照透明性の定義∀e1,e2. e1=e2 ⇒ e[e1/p]=e[e2/p]
http://msakai.jp/d/?date=20090705
>>932
IO aの同値の定義は、IO aをDialogueへ変換してDialogueの外延的同値で頑張れないか
http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.53.2504
0934デフォルトの名無しさん
2013/01/13(日) 15:34:42.90さまざまな手段(ライブラリや糖衣構文)で、手続き的プログラミングや再代入が再発明されているから。
ソースコードを読み込んで、軽度に解析した構文木が参照透過になっていると言ったほうが良いと思う。
実行ファイルになるときには、その参照透過性は再び失われる。
つまり、参照透過なのは中間段階だけ。
中間段階に限定しても参照透過になっている言語は珍しく、それを純粋関数型とか言っている・・とか。
(論理型言語は知らないけど、どうなんだろう・・)
0935デフォルトの名無しさん
2013/01/13(日) 17:44:16.94その上で参照透明であることの意味を考えた
・モナド使って間接的に副作用を表すと、副作用を型で認識できる
・パラメトリシティにより型を見るだけでその実装が解ることがある
・let多相の値制限が無くなる
・副作用が無いから行える最適化がある
0936デフォルトの名無しさん
2013/01/13(日) 19:27:11.00haskellの関数としての実行結果は、IO()の構築まで(C言語で言うなら、.cソースコードから実行ファイルを生成するまで)
ゆえに、IO()は参照透過であり、haskellに副作用はない
0937デフォルトの名無しさん
2013/01/13(日) 19:32:35.850938デフォルトの名無しさん
2013/01/13(日) 20:30:47.35>Haskellのソースコード上構造は参照透過とは思わないけどね。
>さまざまな手段(ライブラリや糖衣構文)で、手続き的プログラミングや再代入が再発明されているから。
ちょっと思い浮かばないので具体例くれ
0939デフォルトの名無しさん
2013/01/13(日) 21:00:49.11>IO() の実行結果はhaskellの実行結果ではない
>haskellに副作用はない
その言い方だとHaskellは標準入出力すらまともに扱えないクソ言語ってことになるだろ
きちんと「Haskellのコード」と「Haskellの処理系」を区別しろよ
0940デフォルトの名無しさん
2013/01/13(日) 21:21:38.11Haskellは標準入出力を扱うアクションを扱うだけだから、Haskellは標準入出力を扱わない
区別するのは「Haskellのコード」と「Haskellの処理系」じゃなくて、「Haskellのコード&Haskellの処理系」と「アクションの処理系」
Haskellはアクションまでは仕様にあるけど、アクションの向こう側は仕様にないのでHaskellではない
(仕様上は、アクションのコンストラクタはなく、アクションの向こう側はユーザからは見えない)
0941デフォルトの名無しさん
2013/01/13(日) 21:32:07.89"hello, world" と標準出力に表示するアクションを扱うコードは書けるが、
仕様の外なので、そのアクションが"good night"と表示しようとも誤りではなく
別にHaskellの規格には違反していないと?
0942デフォルトの名無しさん
2013/01/13(日) 21:39:38.91実用言語としてのHaskellや純粋関数型言語には期待していて、
特に「副作用が無いから行える最適化がある」という部分にかなり期待している。
でも、実行という現実面には触れない・・「黒板上の理論言語」のように扱っている人がいるね。。
参照透過になっているのは解析中の中間表現に限られるけれど、
最適化という側面から見ると、それで十分だと思う。
0943デフォルトの名無しさん
2013/01/13(日) 21:39:38.73というか、"hello, world" と標準出力に表示するアクションを扱うコード「しか」書けない
0944デフォルトの名無しさん
2013/01/13(日) 21:55:00.19結果的に実行できない黒板言語になってしまう・・ようだな。
高速で実行でき簡潔に書けるソースと処理系がほしいのであって、
抽象的で「象牙の塔」のような黒板言語はいらないし、
0945デフォルトの名無しさん
2013/01/13(日) 22:03:53.47つまり計算結果を 2 と表示するプログラムが、実際には F と表示するかもしれない
そんないい加減な仕様が、Haskell
0946デフォルトの名無しさん
2013/01/13(日) 22:06:59.50抽象的構造以外の部分で速さや簡潔さを改善されると逆に困ります
0947デフォルトの名無しさん
2013/01/13(日) 22:12:09.60黒板モデルが重要なら、プログラミング言語ではなく数学になってしまう。
0948デフォルトの名無しさん
2013/01/13(日) 22:13:16.15画面に2 と表示するつもりでコード作っても実際には紙に F と印字するかもしれないのが標準出力だから、それを「汚染」と表現してわざわざコードから分離しようとしたのがそもそもの話
0949デフォルトの名無しさん
2013/01/13(日) 22:23:02.53「実用」の意味によるが、保守のしやすさとアルゴリズムと実装の同値性の自動検証性を追及するなら、数学との間に敷居があると困る
抽象的構造に依存しない性能は、ハードの進歩でどうでもいい話になってしまった
ハードに制約がある携帯アプリとかなら話は別だが
0950デフォルトの名無しさん
2013/01/13(日) 22:38:58.74アルゴリズムだけが重要で、その処理についてはまったく考えない。
ただの表現用の言語・・・。ではないはずだよね。
純粋関数型言語は、実用言語、つまり(手の上だけではなく)
コンピュータ上で高速に実行して量的になんらかの成果を得るという
ツールになっているはずで。いろんな意味で、その効率の良さは注目されているはず。
でもなければ私はHaskellに足を踏み入れないよ。
0951デフォルトの名無しさん
2013/01/13(日) 22:44:22.98効率よりも正しさ
0952デフォルトの名無しさん
2013/01/13(日) 22:52:05.25自分の表現したいものを効率的に実現できるツールはなにか?
早く間違いなく・・・。どれがツールとして優れているか。なんだけどな・・。
0953デフォルトの名無しさん
2013/01/13(日) 22:52:38.960954デフォルトの名無しさん
2013/01/13(日) 22:53:46.23保守性が高ければ作成速度は高い・・・少なくとも低下しにくいわけで。
0955デフォルトの名無しさん
2013/01/13(日) 23:28:01.790956デフォルトの名無しさん
2013/01/13(日) 23:32:56.07もうすぐ自動コーディングが完成するから待ってて
0957デフォルトの名無しさん
2013/01/13(日) 23:46:15.80しかし、1人でプログラミングするのが目的なら、大きな欠点でないと思う。
そもそもプログラミングには膨大な時間がかかるし、その一部を学習にあてたって・・。
0958デフォルトの名無しさん
2013/01/19(土) 15:24:54.38S=λx・λy・λz (x z (y z))
K=λx・λy x
I =S K S(恒等変換)
と定義されてる時、λxSを上のS, K, Iを使った式に書き換えると (K S)になるらしいけど、どうやってやるの?
変換途中の式を教えて下さいな。多分、情報系学部レベルの話題だと思うんだが…。
せっかく自習してるんだからもうちょっと悩んだ方がいいのかなw
0959デフォルトの名無しさん
2013/01/19(土) 15:47:29.140960デフォルトの名無しさん
2013/01/19(土) 17:47:03.01SとKで不動点コンビネータを作れ
0961デフォルトの名無しさん
2013/01/19(土) 17:54:40.61本で自習してると、ふと引っかかって分からなくなってしまうことがあるのが、大学で講義受けるのと違って辛い。
あとでなんでも無い所だったと分かるのだけど、ともすると挫折のきっかけに。
優秀な諸兄はそんなことないですか?w
0962デフォルトの名無しさん
2013/01/27(日) 17:06:27.24任意の場所に値をセットする方法を教えてください。
Adj ma = {{ma.[i,j] \\ i <- rowindex} \\ j <- colindex}
where
rowindex = [0..maxindex ma]
colindex = [0..maxindex ma.[0]]
ではだめです。
よろしくお願いします。
0963デフォルトの名無しさん
2013/01/27(日) 20:28:31.810964デフォルトの名無しさん
2013/01/27(日) 20:29:04.290965デフォルトの名無しさん
2013/01/27(日) 20:48:20.950966デフォルトの名無しさん
2013/01/27(日) 22:39:19.81http://msdn.microsoft.com/ja-jp/library/vstudio/dd233154.aspx
0967デフォルトの名無しさん
2013/01/29(火) 22:59:32.33何とかできました。
ところで関数型言語は入出力が面倒ですね。
Delphiなんかだったら何も考えずにあっという間に書けるのに。
0968デフォルトの名無しさん
2013/01/29(火) 23:57:15.82どんな風に書いたの?
0969デフォルトの名無しさん
2013/01/30(水) 11:34:16.42勉強中で、何とかできたというだけですので、改善点があったらご教示ください。
4次元で示しますと、まず
MyArray4 :: {{{*{#Int}}}}
MyArray4 ={{{{0 \\ k<-[0..1]}\\ j<-[0..2]} \\ i<-[0..1]} \\ h<-[0..2]}
で構造を作ります。空の構造を作る方法はわかりませんでした。
あとは、
set={MyArray4 & [0,1,0,1]=10}
や
set ar h i j k v ={ar & [h,i,j,k] = v}
あるいは、まとめてセットするときは
setall={MyArray4 & [h,i,j,k] = h+i+j+k \\ h<-[0..2],i<-[0..1],j<-[0..2],k<-[0..1]}
のように書いてみました。一応意図どおりに動くようです。
0970デフォルトの名無しさん
2013/01/30(水) 11:39:58.40勘違いしていましたか?
delphiのほうでしたか?。
それでしたら、Formにコンポーネントを貼り付けて、
prepertyを設定して、eventを選んでチョコチョコと書き込むだけです。
具体例によって違いますし、ここには示しにくいです。
0971デフォルトの名無しさん
2013/03/07(木) 00:25:40.81ぐぐってもよく分からないし、辞書引いてもピンと来ない。用語?
それともただの英単語として使われてる?
0972デフォルトの名無しさん
2013/03/07(木) 18:55:14.01コロンブスの卵的な。
0973デフォルトの名無しさん
2013/03/07(木) 19:07:30.16eureka definitionって言うけれど、どういう系統の話で出てきたのかな?
0974デフォルトの名無しさん
2013/03/08(金) 10:02:03.360975971
2013/03/08(金) 13:07:17.46例として、リストを逆順にする関数を再帰で記述したい
→まずfoldを使って記述
→帰納法的な手順で、(n+1)個の要素がある場合をn個の場合+αの形に変形
→再帰的記述のできあがり、これがEureka definitionだ!
と言った文脈で使われてました。レントンとか月光号とかは関係ないです。
0976デフォルトの名無しさん
2013/03/08(金) 13:46:41.16じゃあ書いた人は>>973のようなことを念頭に置いていると思います。
技術用語として覚えたほうがいいです。
もちろん972の人が書いた意味からこういう名前が付けられてます。
例えばかなり古い文献ですが↓です。
http://www.diku.dk/OLD/undervisning/2005e/224/papers/Burstall-1977-TransSystem.pdf
A Transformation System for Developing Recursive Programs
RM BURSTALL, J DARLINGTON
こういう変換フェーズのことを"eureka step"と呼んでます。
この変換は一般的ルールからは自明でない発見的なものなのです。
上の文献ではっきりそう定義してます。
プログラム変換屋では完全に定着している用語です。
最近は論理プログラミングや制約プログラミングが多いですが。
0977971
2013/03/08(金) 15:54:02.490978デフォルトの名無しさん
2013/03/08(金) 19:23:11.510979デフォルトの名無しさん
2013/03/08(金) 19:45:05.41Birdさんはeurekaって用語使ってなかったと思うけど。
0980デフォルトの名無しさん
2013/03/27(水) 23:55:55.990981デフォルトの名無しさん
2013/03/28(木) 12:00:42.53ttp://www.ohmsha.co.jp/kaihatsu/archive/2013/01/17112000.html
発売キタ━━━━━━(゚∀゚)━━━━━━!!!!
0982デフォルトの名無しさん
2013/03/28(木) 12:03:33.97ttp://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=978-4-274-06911-6
0983デフォルトの名無しさん
2013/03/28(木) 17:20:07.080984デフォルトの名無しさん
2013/03/28(木) 18:33:28.10元の英語読んでみたけど、当然前から読んでいけば意味が通る。
小説みたいな意訳をする…わけには行かないのかも知れないけど、難しいですね。
自分は英語のが手許にあればいいかなと思いました。
0985デフォルトの名無しさん
2013/03/29(金) 00:03:04.340986デフォルトの名無しさん
2013/03/29(金) 02:18:53.07さらにいっぱい出てきたんだろうかw
レス数が950を超えています。1000を超えると書き込みができなくなります。