339 返信:153[sage] 投稿日:2012/08/16(木) 22:16:29.83
>>314
>関数型言語でなければならないという観点は間違ってる気がする
ああ、これについては同感だね
現状のどの関数型言語も文字列、パターン、ハッシュの操作に難があるから、
現行LLであるPerl/Python/Rubyを置き換えるには無理があると思う
ただし、関数型言語にも良い特性がある訳で、実際に(LLを含む)多くの言語に影響を与えている
だから自分は「LLにおける関数型プログラミング」に注目している
探検
LLにおける関数型プログラミング
■ このスレッドは過去ログ倉庫に格納されています
2012/08/16(木) 22:17:50.32
2012/08/16(木) 22:20:44.31
そうか
3うゆ
2012/08/16(木) 22:24:22.07 rubyが最強っていってんじゃん
2012/08/16(木) 22:29:24.64
いい加減関数型とかうるさい
2012/08/16(木) 22:42:07.04
>>1
> 現状のどの関数型言語も文字列、パターン、ハッシュの操作に難があるから、
その難というのを、もっと明確に言ってほしい。
たとえば、**というプログラムをする上で必要な
文字列に関する$$という操作が、
どの関数型言語でもできない、あるいはやりにくい。
など
パターンとハッシュに関しても同様に。
> 現状のどの関数型言語も文字列、パターン、ハッシュの操作に難があるから、
その難というのを、もっと明確に言ってほしい。
たとえば、**というプログラムをする上で必要な
文字列に関する$$という操作が、
どの関数型言語でもできない、あるいはやりにくい。
など
パターンとハッシュに関しても同様に。
2012/08/16(木) 22:46:25.19
【関連サイト: Python編】
・関数型プログラミング HOWTO ― Python 2.7ja1 documentation
http://www.python.jp/doc/nightly/howto/functional.html
・魅力的なPython: Pythonでの関数プログラミング: 第1回 - IBM dw
http://www.ibm.com/developerworks/jp/linux/library/l-prog/
・Pythonの技法:関数型言語スタイル「関数の部分適用」 - ZDNet Japan
http://builder.japan.zdnet.com/script/20364411/
・Pythonの"関数型"の機能の起源 - The History of Python.jp
http://python-history-jp.blogspot.jp/2009/05/python.html
・関数型プログラミング HOWTO ― Python 2.7ja1 documentation
http://www.python.jp/doc/nightly/howto/functional.html
・魅力的なPython: Pythonでの関数プログラミング: 第1回 - IBM dw
http://www.ibm.com/developerworks/jp/linux/library/l-prog/
・Pythonの技法:関数型言語スタイル「関数の部分適用」 - ZDNet Japan
http://builder.japan.zdnet.com/script/20364411/
・Pythonの"関数型"の機能の起源 - The History of Python.jp
http://python-history-jp.blogspot.jp/2009/05/python.html
2012/08/16(木) 22:54:29.59
カリー化なんかもRubyで簡単にできる時代
def add(a, b)
return a + b
end
def curry(f, a)
return lambda { |b| method(f).call(a, b) }
end
add1 = curry(:add, 1)
p add1.call(2)
Rubyは関数オブジェクトを扱えるので、
置き換えるも何も、既にRubyは関数型言語
当然純粋関数型言語ではないし、関数型言語らしく書かない事もできるけど、
関数型言語としての特性を備えている事に変わりはない
そもそもどの言語でも最近関数オブジェクトの取り入れが盛んで、
関数型言語かどうかという分類が既に成り立たなくなってる
C++11ですらカリー化できる時代、
可能なのはせいぜい純粋関数型言語か否かという区別程度だな
http://ideone.com/H82Pn
def add(a, b)
return a + b
end
def curry(f, a)
return lambda { |b| method(f).call(a, b) }
end
add1 = curry(:add, 1)
p add1.call(2)
Rubyは関数オブジェクトを扱えるので、
置き換えるも何も、既にRubyは関数型言語
当然純粋関数型言語ではないし、関数型言語らしく書かない事もできるけど、
関数型言語としての特性を備えている事に変わりはない
そもそもどの言語でも最近関数オブジェクトの取り入れが盛んで、
関数型言語かどうかという分類が既に成り立たなくなってる
C++11ですらカリー化できる時代、
可能なのはせいぜい純粋関数型言語か否かという区別程度だな
http://ideone.com/H82Pn
8uy
2012/08/16(木) 22:57:19.48 同意ですよ
2012/08/16(木) 23:08:53.70
>>7
それのどこがカリー化だアホめ
それのどこがカリー化だアホめ
2012/08/16(木) 23:09:47.31
関数名がカリーだろよく見ろ
2012/08/16(木) 23:10:41.08
以降おいしいカレーとチャーハンの作り方のスレ
2012/08/16(木) 23:13:14.87
間を取ってドライカレーで
2012/08/16(木) 23:13:58.81
>>7
それはカリー化ではなく、部分適用です。
それはカリー化ではなく、部分適用です。
14uy
2012/08/16(木) 23:18:13.642012/08/16(木) 23:31:18.63
例えば f (a, b, c) という3引数の関数に対して、これをカリー化した関数というのは、
y (b, c) という2引数の関数を戻り値として返す1引数の関数 g (a) のことだ。
関数 f から関数 g を作ることをカリー化という。
では >>7 の中でカリー化された関数とはどれか、明確に示してみよ。
y (b, c) という2引数の関数を戻り値として返す1引数の関数 g (a) のことだ。
関数 f から関数 g を作ることをカリー化という。
では >>7 の中でカリー化された関数とはどれか、明確に示してみよ。
2012/08/16(木) 23:34:41.03
んじゃこれで
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)
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)
2012/08/16(木) 23:34:48.19
f :: (a, b, c) -> d から
g :: a -> (b -> (c -> d)) を作るのがカリー化
g :: a -> (b -> (c -> d)) を作るのがカリー化
2012/08/16(木) 23:40:44.49
>>16
2引数の場合しか動かんようなクソコードなら貼らなくて良いよ
2引数の場合しか動かんようなクソコードなら貼らなくて良いよ
19デフォルトの名無しさん
2012/08/16(木) 23:49:07.32 ソースコードに全角スペース入れる奴なんなの?
2012/08/16(木) 23:53:57.05
お前は黙ってろ
2012/08/17(金) 00:02:31.38
>>17
違う
f :: (a, b, c) -> d から
g :: a -> ((b, c) -> d) を作るのがカリー化だ。
-- Wikipedia : カリー化(http://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%AA%E3%83%BC%E5%8C%96)
> 複数の引数をとる関数を、引数が「もとの関数の最初の引数」で戻り値が「もとの関数の残りの引数を取り結果を返す関数」であるような関数にすること。
カリー化された関数の戻り値は「もとの関数の残りの引数を取り結果を返す関数」だ。
(b, c) を勝手に b -> c -> と形を変えることまではカリー化には含まれない。
違う
f :: (a, b, c) -> d から
g :: a -> ((b, c) -> d) を作るのがカリー化だ。
-- Wikipedia : カリー化(http://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%AA%E3%83%BC%E5%8C%96)
> 複数の引数をとる関数を、引数が「もとの関数の最初の引数」で戻り値が「もとの関数の残りの引数を取り結果を返す関数」であるような関数にすること。
カリー化された関数の戻り値は「もとの関数の残りの引数を取り結果を返す関数」だ。
(b, c) を勝手に b -> c -> と形を変えることまではカリー化には含まれない。
2012/08/17(金) 00:08:24.78
>>21
ごめんねーwikipediaは英語見てたわーww
http://en.wikipedia.org/wiki/Currying
> In mathematics and computer science, currying is the technique of transforming a function
> that takes multiple arguments (or an n-tuple of arguments) in such a way that
> it can be called as a chain of functions each with a single argument (partial application).
ごめんねーwikipediaは英語見てたわーww
http://en.wikipedia.org/wiki/Currying
> In mathematics and computer science, currying is the technique of transforming a function
> that takes multiple arguments (or an n-tuple of arguments) in such a way that
> it can be called as a chain of functions each with a single argument (partial application).
2012/08/17(金) 00:12:29.05
>>14がそれを満たしてんじゃないの?
2012/08/17(金) 00:24:16.48
2012/08/17(金) 00:29:51.41
>>16はcurry(:add)でカリー化はできてる
ただ、2引数にしか使えない
1.9ではまんまcurryメソッドが用意されてるので変な事する必要ない
http://www.ruby-doc.org/core-1.9.3/Proc.html#method-i-curry
ただ、2引数にしか使えない
1.9ではまんまcurryメソッドが用意されてるので変な事する必要ない
http://www.ruby-doc.org/core-1.9.3/Proc.html#method-i-curry
2012/08/17(金) 00:47:30.59
Pythonのfunctionalモジュールにcurryがあるけど
自前で定義するとこんな感じか
def curry(f):
n = f.__code__.co_argcount
def _(args=[]):
return f(*args) if n == len(args) else lambda x: _(args + [x])
return f if n == 0 else _()
@curry
def foo(a,b,c):
return a + b + c
print(foo(1)(2)(3))
自前で定義するとこんな感じか
def curry(f):
n = f.__code__.co_argcount
def _(args=[]):
return f(*args) if n == len(args) else lambda x: _(args + [x])
return f if n == 0 else _()
@curry
def foo(a,b,c):
return a + b + c
print(foo(1)(2)(3))
27デフォルトの名無しさん
2012/08/17(金) 09:01:48.91 そもそもrubyはHLですしおすし
2012/08/17(金) 13:16:16.85
>>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の専用記法/構文と比較すれば冗長である(=めんどくさい)と考える
>その難というのを、もっと明確に言ってほしい。
現行の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の専用記法/構文と比較すれば冗長である(=めんどくさい)と考える
2012/08/17(金) 13:34:56.55
> {a: 1, b: 2}
この暗号みたいなの何?
この暗号みたいなの何?
2012/08/17(金) 13:45:54.65
2012/08/17(金) 13:47:00.73
RubyってPerlが糞だと言われたことと同じ轍を踏んでるよな
2012/08/17(金) 14:20:06.15
2012/08/17(金) 14:24:36.76
糞分かりにくいな
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 高市首相、トランプ米大統領に「早期に会いたい」 日中関係悪化受け… ★3 [BFU★]
- 【コメ】卸売業者「簡単に安売りできない」「大暴落起きれば大赤字に」 JA「新米の販売進度が近年になく遅い。コメの回転が悪い」 ★5 [Hitzeschleier★]
- 「これいいじゃん!!!」 セブン-イレブンの1620円で買える“1人用クリスマスケーキ”🎂に注目殺到「天才すぎる」 [パンナ・コッタ★]
- 【コメ】卸売業者「簡単に安売りできない」「大暴落起きれば大赤字に」 JA「新米の販売進度が近年になく遅い。コメの回転が悪い」 ★4 [Hitzeschleier★]
- 小島瑠璃子さん、代表取締役を務める会社を破産申請 [牛丼★]
- 高市早苗首相が天理教系企業に“巨額発注” 総額5000万円 本人は「政治団体の活動に必要な支出」と回答 [Hitzeschleier★]
- なんかさっきからフェイロンのステージ曲が頭から離れないんだが
- 【実況】博衣こよりのえちえちスーパーダンガンロンパ3🧪
- 【安倍晋三】中国船4隻が領海侵入 [828897501]
- えちえち女だけど
- 【画像】小泉防衛大臣、とんでもない写真が発掘される [834922174]
- お
