2ch勢いランキングまとめ
メニュー

LLにおける関数型プログラミング

この話題の盛り上がりグラフ
2017-04-15 19:06:23 最終更新
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

関数型言語全部敵に回して何が楽しいのか、さっぱり分からん。

元スレ

LLにおける関数型プログラミング
http://echo.2ch.net/test/read.cgi/tech/1345123070

削除依頼

削除などのご連絡事項については「メニュー」の「本サイトについて/お問い合わせ」よりご連絡をお願いします。