LLにおける関数型プログラミング
- 1 デフォルトの名無しさん
-
339 返信:153[sage] 投稿日:2012/08/16(木) 22:16:29.83
>>314
>関数型言語でなければならないという観点は間違ってる気がする
ああ、これについては同感だね
現状のどの関数型言語も文字列、パターン、ハッシュの操作に難があるから、
現行LLであるPerl/Python/Rubyを置き換えるには無理があると思う
ただし、関数型言語にも良い特性がある訳で、実際に(LLを含む)多くの言語に影響を与えている
だから自分は「LLにおける関数型プログラミング」に注目している
- 5 デフォルトの名無しさん
-
>>1
> 現状のどの関数型言語も文字列、パターン、ハッシュの操作に難があるから、
その難というのを、もっと明確に言ってほしい。
たとえば、**というプログラムをする上で必要な
文字列に関する$$という操作が、
どの関数型言語でもできない、あるいはやりにくい。
など
パターンとハッシュに関しても同様に。
- 37 28
-
>>36
>Rubyの関数型プログラミングスレで良かったんじゃねぇ〜?
んー自分はそれでも良かったけど、せっかく>>1がスレを立ててくれたんだから、
Rubyに限定せず、あらゆるLLで関数型プログラミングを語る場になれば....と思う
特に(>>6にあるように)Pythonは関数型プログラミングに関する情報が豊富みたいだから、
Python&関数型マニアの参加は大いに歓迎したいな
- 28 デフォルトの名無しさん
-
>>5
>その難というのを、もっと明確に言ってほしい。
現行のLLにはこれらデータを「簡潔に表現」できる専用の記法/構文がある
以下はRubyの例(これらはPerl(awk?)から影響を受けた(=パクッた)と思われる)
【文字列】 文字列リテラルには「式展開」や「ヒアドキュメント」がある
たとえば "my name is #{$ruby}" は、format "my name is %s", $ruby よりも
簡潔に書ける
【パターン】 「正規表現リテラル」がある。たとえば /^Ruby is OOPL/ は、
Regexp.new "^Ruby is OOPL" よりも簡潔だ
【ハッシュ】 「ハッシュ式」とハッシュ操作のための構文がある
たとえば {a: 1, b: 2} は Hash.new [:a, 1, :b, 2] よりも簡潔だし、
obj[:a] は obj.fetch :a よりも簡潔に書ける
これらの記法/構文はRuby全体からすればほんの一部であり、
LLの主用途(主戦場)である日常的なテキスト処理に特化した様々な工夫が施されている
これらの多くは関数型言語ではライブラリ関数として提供され、
同等な処理は書けてもLLの専用記法/構文と比較すれば冗長である(=めんどくさい)と考える
- 10 デフォルトの名無しさん
-
関数名がカリーだろよく見ろ
- 14 uy
-
hhttp://www.ruby-doc.org/core-1.9.3/Proc.html#method-i-curry
はいはいわろ
- 16 デフォルトの名無しさん
-
んじゃこれで
1.9では>>14なんてのもあるみたいだが
def add(a, b)
return a + b
end
def curry(f)
return lambda { |a| lambda { |b| method(f).call(a, b) } }
end
add1 = curry(:add).call(1)
p add1.call(10)
- 18 デフォルトの名無しさん
-
>>16
2引数の場合しか動かんようなクソコードなら貼らなくて良いよ
- 24 デフォルトの名無しさん
-
>>14 のレスはあぼーんされて見えないから無視する。
Ruby でカリー化が本当にできるのかどうかは知らない。
少なくとも、確実に >>7 はカリー化ではないと指摘しているだけだ。
>>16 もなんか怪しい気がする。
カリー化された関数とはどれのことか?
- 25 デフォルトの名無しさん
-
>>16はcurry(:add)でカリー化はできてる
ただ、2引数にしか使えない
1.9ではまんまcurryメソッドが用意されてるので変な事する必要ない
hhttp://www.ruby-doc.org/core-1.9.3/Proc.html#method-i-curry
- 17 デフォルトの名無しさん
-
f :: (a, b, c) -> d から
g :: a -> (b -> (c -> d)) を作るのがカリー化
- 105 デフォルトの名無しさん
-
rubyでcurry化は簡単便利
f=->x,y{2*x + 3*y}.curry
g=f[3]
puts g[4] #=>18
- 30 デフォルトの名無しさん
-
>>28
× 現行のLL
○ Ruby
- 39 デフォルトの名無しさん
-
>>28
camlp4使って構文拡張すれば足りるな
- 43 デフォルトの名無しさん
-
>>28
では、逆に関数型言語にはあって、Ruby などの LL には無い機能や仕組みで、
是非 LL にも取り入れてほしいと思ってるものは何?
こちらも詳細にお願いします。
- 76 デフォルトの名無しさん
-
LLスレでぼろくそに批判されて、ついにこんな糞スレに追放されておいて
プライドがズタズタになっていない>>28は本当に凄い
- 29 デフォルトの名無しさん
-
> {a: 1, b: 2}
この暗号みたいなの何?
- 32 デフォルトの名無しさん
-
>>29
Ruby 1.9で導入された新しいハッシュ式の記法
以前の記法 {:a => 1, :b => 2} と同じ
- 53 デフォルトの名無しさん
-
RubyはHL
- 101 28
-
スレが停滞してるので、新たなネタを投入してみる
そのネタとは「LLによる関数型プログラミングの実践」であり、
ここまでの関数型プログラミングに関する「理屈」を一歩進めてその「実践」に着手してみた
まず、最近までRuby初心者スレPart52では「ブログアンテナのデータ管理」を題材にして
手続き型プログラミングスタイルでRubyコードを設計してきた(詳しくは初心者スレの#43等を参照)
hhttp://www.h6.dion.ne.jp/~machan/tmdoc/example/Blog.book/blog.png -- UMLクラス図
hhttp://www.h6.dion.ne.jp/~machan/tmdoc/example/Blog.book/html-r1.30/ -- 自動生成ドキュメント
hhttp://play.island.ac/codepaste/code?id=1536
このコード、>>54で書いた「末尾感嘆符ルール」に従い破壊的操作を伴うメソッドの末尾には
必ず ! (感嘆符)を付けるようにしていたけど、これを関数型プログラミングスタイルで書き直してみた
hhttp://www.h6.dion.ne.jp/~machan/tmdoc/example/Blog.book/blog-fp.png -- UMLクラス図
hhttp://www.h6.dion.ne.jp/~machan/tmdoc/example/Blog.book/html-r1.33-fp/ -- 自動生成ドキュメント
hhttp://play.island.ac/codepaste/code?id=1537
見れば分かるように、両者間には全体的なモジュール構造/クラス階層の設計に変更は無く、メソッド定義だけが異なる
また、>>59で書いた(垂直方向にシステムを分割する)「階層化アーキテクチャ」に従い、
下位層のPStoreデータベースをアクセスするクラス Store では破壊的操作メソッド update_blog! を定義した一方で、
その上位層では破壊的操作を一切用いない「純粋関数型パラダイム」で設計している
ただし純粋関数型と言いつつも一部では破壊的代入を(しかたなく)用いているけど、
操作対象をローカル変数に限定しているので、矛盾や問題には該当しないと思う
なお、>>62末尾で書いた施策の一つ「専用の動的型検査メソッド呼び出し」について、
実際に自作のアサーションライブラリ 'assertion.rb' を利用してコードを書いている(例: ASSERT.kind_of ....)
- 69 デフォルトの名無しさん
-
MLは悪くない言語なんだけど、関数型言語としては二流っていうか
関数型モドキのニセモノに過ぎないから
関数型プログラミングで得られるメリットはLLと然程変わらないね
だからMLユーザがしょぼいライブラリしか無いML処理系じゃなく
LLで関数型プログラミングやりたい気持ちは分かるよ、うん
- 72 デフォルトの名無しさん
-
>>69
>MLは悪くない言語なんだけど、関数型言語としては二流っていうか
>関数型モドキのニセモノに過ぎないから
小学生の書いた読書感想文?
- 73 デフォルトの名無しさん
-
>>69
関数型言語としては二流である根拠をはっきり述べてくれ。
そして、関数型プログラミングで得られるメリットとは何かも述べてくれ。
もし気力が残っているのなら、そのメリットがMLでは得られないのは、
MLの何に原因があるのかも述べてくれると、大変よろしい。
- 85 デフォルトの名無しさん
-
こういう破壊的操作使いまくりのコードが
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
- 102 デフォルトの名無しさん
-
2ちゃんはもうすっかり人居なくなったな
- 103 デフォルトの名無しさん
-
>>102
みんなどこに行ったん?
- 107 デフォルトの名無しさん
-
それで自己参照できるん?
- 109 デフォルトの名無しさん
-
こんな本でた
JavaScriptで学ぶ関数型プログラミング
hhttp://www.amazon.co.jp/dp/4873116600/
なんか面白そう
- 110 デフォルトの名無しさん
-
そう思うなら脱アルゴリズムしたらいいんじゃない?
まあ頑張れ。
無駄な努力だと思うがな。
- 112 デフォルトの名無しさん
-
>>110
関数型言語全部敵に回して何が楽しいのか、さっぱり分からん。
元スレ
http://echo.2ch.net/test/read.cgi/tech/1345123070