LLにおける関数型プログラミング
■ このスレッドは過去ログ倉庫に格納されています
339 返信:153[sage] 投稿日:2012/08/16(木) 22:16:29.83 >>314 >関数型言語でなければならないという観点は間違ってる気がする ああ、これについては同感だね 現状のどの関数型言語も文字列、パターン、ハッシュの操作に難があるから、 現行LLであるPerl/Python/Rubyを置き換えるには無理があると思う ただし、関数型言語にも良い特性がある訳で、実際に(LLを含む)多くの言語に影響を与えている だから自分は「LLにおける関数型プログラミング」に注目している MLなんてマイナー言語けなされて無視出来ずに反応しちゃうのは LLスレで暴れてたRuby&関数型マニアのキモイ奴だけだろ といふことは、MLをけなしているのはLLスレでプライドをズタズタにされたPythonマニア? LLスレでぼろくそに批判されて、ついにこんな糞スレに追放されておいて プライドがズタズタになっていない>>28 は本当に凄い MLをゴミだと思う人間がみんなPythonユーザだったら Pythonはシェア1位を取ってるよ 根本的に可読性が低くなるから、普通の開発で推奨してる環境なんてないし 関数型プログラミングがやりやすい言語を選ぶなんてこともない C++でもラムダが使える時代だから関数型プログラミング最高!という短絡思考はやめた方がいい むしろ、Ruby以外は常識的判断により関数型からは慎重に距離を置いてる 結果としてRubyだけが関数型言語と同様の馬鹿げた真似をしてドヤ顔してるって感じ 本当にLisper得意の見下しって時代から何も進歩してない まあML&Rubyの人は好きにやれば良いんじゃないかな >結果としてRubyだけが関数型言語と同様の馬鹿げた真似をしてドヤ顔してるって感じ 例えばどういうRubyコードのこと言ってる? ML を dis ってる人は、ML の派生も含めてダメだと言ってるの? OCaml使ってると、Haskellと比較して、基本設計が古くさいなぁ、と思うことはある ハスケルで組まれたプログラムがスパゲッティすぎてついていけない 基本Mutableな言語はゴミとまでは言わないが、ゴミだぞ。 こういう破壊的操作使いまくりのコードが Rubyにおける関数型プログラミングなの? def func n , aa , bb Enumerator.new do | e | a = aa.cycle b = bb.cycle [*[b]*n.-(1),a].cycle { |r| e << r.next } end end 質問ですチャーチ数の使い道を教えてください これって 数値ではないわけで チャーチ数のみでゲームをつくっても人間には何がおもしろいのかわからないものができあがりますよね だからチャーチ数をどこかで人間がみて理解できる数値に変換していいんだとおもいますけど それって途中までチャーチ数で演算した意味は?ってきかれるとまだ僕には答えられません つまり最終成果物は十進数の数値なんですが 途中演算をλ計算でやる利点はなんですか? なにがあるんですか? あれ、もしかして桁が膨大になった場合ってラムダ計算のほうが高速ですか? なんかそんな気がします 用途があるとすればそこでしょうか はやくおしえて これ凄いですね 演算速度がどれだけ桁増えても一定である気がします それであってますか? ねえ レスまだ? おそくない? ラムダ計算はこんなに高速だってのにおまえ等は、、 cpu内部にラムダ計算入れるべき もういいです 自分で理解した ラムダ計算は最速の演算方法だ 何カ所か盛大にミスってる nilの扱いと名前空間 けどjavaにくらべたら全然余裕 【関連サイト: JavaScript編】 -- Pyhton編: >>4 , Ruby編: >>55 ・JavaScript 第6版 - O'Reilly Japan http://www.oreilly.co.jp/books/9784873115733/ -- 第5版からの改訂として、節「8.8 関数型プログラミング」が追加された ・Javascriptで学ぶ Functional Programming http://www.slideshare.net/todorokit/javascript-functional-programming-10170360 ・JavaScriptで始める関数型プログラミング 1-1 - サイバーエージェント公式クリエイターズブログ http://ameblo.jp/ca-1pixel/entry-11144877522.html ・エレガントな JavaScript を作成するための関数型プログラミングの使用 - IBM dw http://www.ibm.com/developerworks/jp/web/library/wa-javascript.html ・A Modern Introduction to Programming with JavaScript and jQuery - Open Book Project http://www.openbookproject.net/books/mi2pwjs/index.html ・JavaScript as a Functional Language http://www.ajaxprojects.com/ajax/tutorialdetails.php?itemid=557 死ねwwwwwwwwwwwwwwwwwwカスwwwwwwwwwwww >>55 にある記事の一つを勝手に翻訳してみた Rubyによる関数型プログラミング -- Functional programming with Ruby ・http://www.h6.dion.ne.jp/ ~machan/misc/FPwithRuby.html ・http://www.h6.dion.ne.jp/ ~machan/misc/FPwithRuby.epub >>80 >>79 のいう「関数型言語と同様の馬鹿げた真似をしてドヤ顔してる」とは、 たとえばこんな記事(および、記事に含まれるコード群)を指しているのだと思われ..... add = lambda x, y : x + y curry = lambda x : lambda y : x + y curry (1)(2) add = lambda x, y, z : x + y + z curry1 = lambda x, y : lambda z : x + y + z curry2 = lambda x : lambda y : lambda z : x + y + z スレが停滞してるので、新たなネタを投入してみる そのネタとは「LLによる関数型プログラミングの実践」であり、 ここまでの関数型プログラミングに関する「理屈」を一歩進めてその「実践」に着手してみた まず、最近までRuby初心者スレPart52では「ブログアンテナのデータ管理」を題材にして 手続き型プログラミングスタイルでRubyコードを設計してきた(詳しくは初心者スレの#43等を参照) http://www.h6.dion.ne.jp/ ~machan/tmdoc/example/Blog.book/blog.png -- UMLクラス図 http://www.h6.dion.ne.jp/ ~machan/tmdoc/example/Blog.book/html-r1.30/ -- 自動生成ドキュメント http://play.island.ac/codepaste/code?id=1536 このコード、>>54 で書いた「末尾感嘆符ルール」に従い破壊的操作を伴うメソッドの末尾には 必ず ! (感嘆符)を付けるようにしていたけど、これを関数型プログラミングスタイルで書き直してみた http://www.h6.dion.ne.jp/ ~machan/tmdoc/example/Blog.book/blog-fp.png -- UMLクラス図 http://www.h6.dion.ne.jp/ ~machan/tmdoc/example/Blog.book/html-r1.33-fp/ -- 自動生成ドキュメント http://play.island.ac/codepaste/code?id=1537 見れば分かるように、両者間には全体的なモジュール構造/クラス階層の設計に変更は無く、メソッド定義だけが異なる また、>>59 で書いた(垂直方向にシステムを分割する)「階層化アーキテクチャ」に従い、 下位層のPStoreデータベースをアクセスするクラス Store では破壊的操作メソッド update_blog! を定義した一方で、 その上位層では破壊的操作を一切用いない「純粋関数型パラダイム」で設計している ただし純粋関数型と言いつつも一部では破壊的代入を(しかたなく)用いているけど、 操作対象をローカル変数に限定しているので、矛盾や問題には該当しないと思う なお、>>62 末尾で書いた施策の一つ「専用の動的型検査メソッド呼び出し」について、 実際に自作のアサーションライブラリ 'assertion.rb' を利用してコードを書いている(例: ASSERT.kind_of ....) 大規模規制で半減したつうし、前プロバイダで規制やればあっさり消滅すんでねぇの?w rubyでcurry化は簡単便利 f=->x,y{2*x + 3*y}.curry g=f[3] puts g[4] #=>18 そのくらいデフォでやれよ その程度で簡単便利とか超わらえるわ こんな本でた JavaScriptで学ぶ関数型プログラミング http://www.amazon.co.jp/dp/4873116600/ なんか面白そう Swift スレで関数型プログラミングについてレスしたけど、 こちらのスレとも関連するのでメモとしてカキコしとく http://peace.2ch.net/test/read.cgi/tech/1415860741/153 -- Swift や Ruby を含む多くの言語では常識であるけど Python では異なるものとして、 関数型言語に由来した(無名関数やラムダ式とも呼ばれる)クロージャがある たとえば "The Swift Programming Language" の "Closure" の章にある map メソッドを使った サンプルコードは、Ruby でも同じスタイルの良く似たコードで書き直せる: http://ideone.com/TsGD6B これは Ruby だけでなく、JavaScript でも同じ Swift や Ruby と比べて構文が簡潔な JavaScript ではいくらか冗長にはなるけれど、 何の苦もなく Swift と同じスタイルで書き直せる: http://ideone.com/74oNVU 同様に、「あるテーブルから特定の行だけを抽出し、加工して、集計する処理」は、 Swift だと table.filter { .... }.map { .... }.reduce { .... } とメソッドを連結(チェイン)させた式で書ける これは Ruby なら table.select { .... }.map { .... }.inject { .... } と書き直せる ここで、クロージャ内の ..... の部分には、上記のサンプルのように「任意の文(statements)が書ける」 もしかすると、いやこんなの高階関数のプログラミングを知っている人なら当たり前だろ、と感じるかもしれない ところが Python だけはクロージャの本体に(任意の文ではなく)「式(expression)しか書けない」: http://ideone.com/tDaDkL # --> Syntax Error になってしまう だから、他の言語のクロージャに相当するコードを(名前のある)関数としてわざわざ宣言しなければならない: http://ideone.com/R7twCQ 結果として、Python は手続き型プログラミングであれば簡潔で可読性に優れたコードが書けるスクリプト言語だけれど、 関数型プログラミングには適さず、こうした関数型プログラミングは推奨されていないらしい(これを "酸っぱい葡萄" と言ふ) http://peace.2ch.net/test/read.cgi/tech/1345123070/70-71 これが Swift や Ruby 等と比較すると、関数型プログラミングで Python が劣る典型的な一例になる そう思うなら脱アルゴリズムしたらいいんじゃない? まあ頑張れ。 無駄な努力だと思うがな。 無名関数とクロージャの区別すらつかない 馬鹿(>>110 )がいるスレはここですか? >>110 関数型言語全部敵に回して何が楽しいのか、さっぱり分からん。 関数をステートメントで書けるから関数プログラミングに適してると言いたいのかこの初心者は 馬鹿はクロージャスレでも散々に叩かれてたのに、頑なにオレオレ定義を振りかざしてたからな しまいにゃ「真のクロージャ」だのよく分からないことを言い出す始末 なにこれ、脱アルゴリズム君なの? 彼についてなら専用スレあるからそっちで。 関数型には car/cdr は必須ですかね?haskell をみていてもそんな感じだけど むしろcar・cdrのような部分関数(空リストに対して定まらない)はなんだかんだ面倒。 使いやすいパターンマッチを導入して、car・cdrみたいなのは廃止、ってのが良い、と いうのがほぼ確定した見解だと思う。 map/reduce 等で car/cdr を隠すってこと? ・関数型プログラミングにおけるクイックソート・アルゴリズムの実装 http://www.h6.dion.ne.jp/ ~machan/misc/qsort-in-fp.html Lonely Lovely 孤独を愛する、孤高のプログラマのことさ ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.4.7 2024/03/31 Walang Kapalit ★ | Donguri System Team 5ちゃんねる