関数型言語に必ずくっついてるこれ
いらんでしょ?匿名クラスで充分でしょ
探検
クロージャって何がいいの? [転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2014/11/08(土) 13:11:47.84ID:6V2MLUHb2014/11/08(土) 13:17:58.06ID:rszc5DFq
マジレスすると、クロージャーよりも
関数内関数の方がいい。
クロージャーは変数スコープが不必要に広い。
多くの場合、クロージャーの外は見える必要がない。
逆に見えてしまうと不用意に変数を書き換えてしまう。
関数内関数がない言語が多いから
仕方なくクロージャーを使うしかないが、
Java8のラムダの方がまだ安全なコードを書くことが出来る。
(ラムダも外のスコープが参照できる場合があるので完璧ではない)
つまり俺がいいたいのは、クロージャーを使うと苦労するのジャー。
関数内関数の方がいい。
クロージャーは変数スコープが不必要に広い。
多くの場合、クロージャーの外は見える必要がない。
逆に見えてしまうと不用意に変数を書き換えてしまう。
関数内関数がない言語が多いから
仕方なくクロージャーを使うしかないが、
Java8のラムダの方がまだ安全なコードを書くことが出来る。
(ラムダも外のスコープが参照できる場合があるので完璧ではない)
つまり俺がいいたいのは、クロージャーを使うと苦労するのジャー。
2014/11/08(土) 13:42:47.14ID:alIlcZLx
ディスクロージャ
2014/11/08(土) 14:33:50.79ID:Wb7Sa5AG
>>1
関数型言語の操作的意味論において、クロージャとは:
「ラムダ式と局所環境とを組合せた概念」
を指す
このクロージャを具象構文で表したものが一般的な「ラムダ式」であり、
クロージャを識別子に束縛したものが一般的な「関数宣言」である
Standard ML という関数型言語だと、
たとえばラムダ式は fn x => x + 1 であり、関数宣言は val succ = fn x => x + 1 である
ここで、関数宣言には fun succ x = x + 1 と簡潔に書ける構文糖を用いるのが一般的
だから、あらゆる関数型言語ないし関数型プログラミングが可能なあらゆる言語であれば、
クロージャ(という概念)は必要不可欠に存在である、と言える
また Java の「匿名クラス」もクロージャ(という概念)を応用した具象構文の一種である
で、Java 8 で導入された「ラムダ式」もクロージャの具象構文だけど、
匿名クラスよりも簡潔に書ける利点があるから、多くのケースで広く利用されるようになるだろう
両者の間には、局所環境と組み合わせる対象が「匿名クラス」ではクラスという単位であるのに対して、
「ラムダ式」では式という(クラスよりも粒の小さな)単位であるという違いがある
目的に応じて適切に両者を使い分けることが望ましい
関数型言語の操作的意味論において、クロージャとは:
「ラムダ式と局所環境とを組合せた概念」
を指す
このクロージャを具象構文で表したものが一般的な「ラムダ式」であり、
クロージャを識別子に束縛したものが一般的な「関数宣言」である
Standard ML という関数型言語だと、
たとえばラムダ式は fn x => x + 1 であり、関数宣言は val succ = fn x => x + 1 である
ここで、関数宣言には fun succ x = x + 1 と簡潔に書ける構文糖を用いるのが一般的
だから、あらゆる関数型言語ないし関数型プログラミングが可能なあらゆる言語であれば、
クロージャ(という概念)は必要不可欠に存在である、と言える
また Java の「匿名クラス」もクロージャ(という概念)を応用した具象構文の一種である
で、Java 8 で導入された「ラムダ式」もクロージャの具象構文だけど、
匿名クラスよりも簡潔に書ける利点があるから、多くのケースで広く利用されるようになるだろう
両者の間には、局所環境と組み合わせる対象が「匿名クラス」ではクラスという単位であるのに対して、
「ラムダ式」では式という(クラスよりも粒の小さな)単位であるという違いがある
目的に応じて適切に両者を使い分けることが望ましい
2014/11/08(土) 16:17:08.12ID:gNjtEENQ
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
∠ ノ
丶 |
ノ |
| / ̄ ̄ ̄ ̄\ |
| / ヽ |
| | | |
| | | |
| | | |
/ | | /
ヽ \_/| |\_/ ヽヘ
| / \ /
 ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄
パンとか止めるやつ
∠ ノ
丶 |
ノ |
| / ̄ ̄ ̄ ̄\ |
| / ヽ |
| | | |
| | | |
| | | |
/ | | /
ヽ \_/| |\_/ ヽヘ
| / \ /
 ̄ ̄ ̄ ̄ ̄ ̄  ̄ ̄ ̄ ̄ ̄ ̄
パンとか止めるやつ
6デフォルトの名無しさん
2014/11/08(土) 16:19:08.12ID:gwropNof >>5
それ、パンとか止めるやつだろ!
それ、パンとか止めるやつだろ!
2014/11/08(土) 16:28:06.78ID:Z0nNiFel
/ ̄ ̄\
/ _ノ ヽ、_ \
. | ( ●)(● ) |
,-,-,-,__ | (__人__) │rヽヽヽヽ__ 「クイックロック バッグ クロージャー!!」
r.l .' ' .'.r_l | `⌒ ´ . | ´l .|/
.ヽ| | | | | /_
._,,-ーヽ /-‐ ヽ /‐''",' /. `ヽ
/ /`''‐-',. ヽ ./ rj,.-‐''´`l ./
\ | 二ヽ ヽ三 |ー‐'´
`''‐ヽ ―`ヘ j `―r'´
`T ´ j. ./ j
ヽ .ヽ、 ___ / ,'
| ./(>)^ ヽ\ i
| ./ (_ (<) \ .i
/ .! ./ /rェヾ__)⌒::: ヾ.\
/ ∧i. `⌒´-'´ u; ノ ヽ
| .\ヽ 、 , / |
.ヽ ',. ー 一 ./ /
', .', ./ /
.', ', / /
/ヽ、 \ / /
/ | ヽ―‐/ ./ \
./ .l 丿 ゝ ( ヽ
/ / / \ ', ',
/ /-‐''´ `''‐| ',
./ __| . / .',
| `ヽ、 ./ ̄ .|
| ヽ / /
`"''-,,__ ,,,,丿 ゝ、__,,-''
/ _ノ ヽ、_ \
. | ( ●)(● ) |
,-,-,-,__ | (__人__) │rヽヽヽヽ__ 「クイックロック バッグ クロージャー!!」
r.l .' ' .'.r_l | `⌒ ´ . | ´l .|/
.ヽ| | | | | /_
._,,-ーヽ /-‐ ヽ /‐''",' /. `ヽ
/ /`''‐-',. ヽ ./ rj,.-‐''´`l ./
\ | 二ヽ ヽ三 |ー‐'´
`''‐ヽ ―`ヘ j `―r'´
`T ´ j. ./ j
ヽ .ヽ、 ___ / ,'
| ./(>)^ ヽ\ i
| ./ (_ (<) \ .i
/ .! ./ /rェヾ__)⌒::: ヾ.\
/ ∧i. `⌒´-'´ u; ノ ヽ
| .\ヽ 、 , / |
.ヽ ',. ー 一 ./ /
', .', ./ /
.', ', / /
/ヽ、 \ / /
/ | ヽ―‐/ ./ \
./ .l 丿 ゝ ( ヽ
/ / / \ ', ',
/ /-‐''´ `''‐| ',
./ __| . / .',
| `ヽ、 ./ ̄ .|
| ヽ / /
`"''-,,__ ,,,,丿 ゝ、__,,-''
8デフォルトの名無しさん
2014/11/08(土) 18:29:54.75ID:+pW0VlFs2014/11/08(土) 18:31:45.04ID:Z0nNiFel
>>8
最後の行に同意してくれてありがとう
最後の行に同意してくれてありがとう
2014/11/08(土) 21:41:30.87ID:1bx+kI6Q
おもてたんとちゃうこのスレ
2014/11/08(土) 22:16:16.20ID:BzSpEdoH
クロージャーってただのメソッド一つのクラスだろ
2014/11/09(日) 01:25:23.88ID:5LKfT6rZ
まじすか
2014/11/09(日) 02:04:06.76ID:8LiWtrih
という見方、扱い方もできるねって話だろ
2014/11/09(日) 05:57:17.96ID:n2NDOrh4
ActionListenerなんて、実装当時にクロージャがあったら存在してたかどうか怪しいクラスだよね
15デフォルトの名無しさん
2014/11/09(日) 07:54:16.27ID:6VpE/OBT lispの方言かとおもった
2014/11/09(日) 09:19:55.73ID:nlmXbEn2
2014/11/09(日) 10:23:47.55ID:gYZvrVR/
>>11
複数にできるよ
複数にできるよ
2014/11/09(日) 16:16:30.86ID:K4BO8Ja1
関数内で関数が定義できる事とクロージャと何の関係があるんだ?
比較できるものじゃないでしょ
比較できるものじゃないでしょ
2014/11/09(日) 16:48:40.28ID:EbU/SVlS
まあ、クロージャは関数内関数の用途をも内包することは多いんじゃね?
2014/11/09(日) 17:24:14.45ID:xhtawW2X
>>16
それはあまり使われていない関数型言語限定の話ですね。
それはあまり使われていない関数型言語限定の話ですね。
2014/11/09(日) 17:32:09.95ID:PiaxZAwM
2014/11/09(日) 17:38:41.70ID:50xVLBic
オレオレ言語仕様を考えてるんだけどさ今どの言語を見てもlambdaだらけじゃない
RAII出来る言語だとクロージャに環境掴まれるだけでリソースリークしそうなわけよ
ならイランでしょ?というわけでたてた
RAII出来る言語だとクロージャに環境掴まれるだけでリソースリークしそうなわけよ
ならイランでしょ?というわけでたてた
2014/11/09(日) 18:18:41.40ID:K4BO8Ja1
クロージャだからって外の環境全部掴む必要無いんじゃね
クロージャが使用してない変数については各スコープのタイミングで解放すれば十分じゃないの
クロージャが使用してない変数については各スコープのタイミングで解放すれば十分じゃないの
2014/11/09(日) 18:20:47.86ID:xhtawW2X
evalが使える言語では、使用していないかどうか
実行するまでわからないのでそれは無理。
実行するまでわからないのでそれは無理。
2014/11/09(日) 18:24:28.78ID:KOr7L+hP
>>20,21
関数型言語ではなく関数型プログラミングの話だと考えれば、
すでに多くの言語でクロージャという概念は幅広く普及していると言えるのではないかと
たとえば C#、Java8、C++11、JavaScript、Ruby 等々
もちろん Python のように、クロージャが存在しない手続き型言語も広く使われているけどね
また、C++ や Java でも古い規格だとクロージャは存在していなかった
関数型言語ではなく関数型プログラミングの話だと考えれば、
すでに多くの言語でクロージャという概念は幅広く普及していると言えるのではないかと
たとえば C#、Java8、C++11、JavaScript、Ruby 等々
もちろん Python のように、クロージャが存在しない手続き型言語も広く使われているけどね
また、C++ や Java でも古い規格だとクロージャは存在していなかった
2014/11/09(日) 18:40:07.36ID:lx9et4kr
Pythonの関数は外の環境掴んでるからクロージャ
嘘は良くない
嘘は良くない
2014/11/09(日) 18:40:57.06ID:nlmXbEn2
>>24
クロージャじゃなくてevalを禁止すれば良いんじゃね?
クロージャじゃなくてevalを禁止すれば良いんじゃね?
2014/11/09(日) 18:55:58.44ID:KOr7L+hP
2014/11/09(日) 18:59:22.34ID:KOr7L+hP
>>28 を訂正、ラムダ式(匿名関数)の話であるのを書き忘れていた
X:>25 で挙げたクロージャを備えた言語は、どれも外の環境を掴んで
O:>25 で挙げたクロージャを備えた言語は、どれもラムダ式の中で外の環境を掴んで
X:>25 で挙げたクロージャを備えた言語は、どれも外の環境を掴んで
O:>25 で挙げたクロージャを備えた言語は、どれもラムダ式の中で外の環境を掴んで
2014/11/09(日) 19:03:23.62ID:lx9et4kr
2014/11/09(日) 19:08:15.30ID:nlmXbEn2
不毛だからケンカする前に用語を定義しろよ
オレオレ定義じゃないんだったら引用も必要
http://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%83%BC%E3%82%B8%E3%83%A3
> クロージャ(クロージャー、英: closure)、関数閉包はプログラミング言語における関数オブジェクトの一種。
> いくつかの言語ではラムダ式や無名関数で実現している。引数以外の変数を実行時の環境ではなく、
> 自身が定義された環境(静的スコープ)において解決することを特徴とする。
オレオレ定義じゃないんだったら引用も必要
http://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%83%BC%E3%82%B8%E3%83%A3
> クロージャ(クロージャー、英: closure)、関数閉包はプログラミング言語における関数オブジェクトの一種。
> いくつかの言語ではラムダ式や無名関数で実現している。引数以外の変数を実行時の環境ではなく、
> 自身が定義された環境(静的スコープ)において解決することを特徴とする。
2014/11/09(日) 19:13:25.68ID:nlmXbEn2
> (ラムダ式ではなく)関数で外の環境を掴めるのは当たり前の話であり、嘘は良くない
とりあえずelispにケンカ売ってるのだけは分かった
とりあえずelispにケンカ売ってるのだけは分かった
2014/11/09(日) 19:19:20.49ID:5LKfT6rZ
pythonのlambdaって外の環境見えないの?
2014/11/09(日) 19:22:02.17ID:lx9et4kr
見えるよ
2014/11/09(日) 19:25:16.21ID:5LKfT6rZ
そうだよね...
2014/11/09(日) 19:39:55.45ID:KOr7L+hP
>>30
C#、Java8、C++11、JavaScript、Ruby 等々の関数型プログラミングが可能な言語では、
どれも「ラムダ式の中であっても外の環境を参照し、それを局所環境に保存」できる
それに対して、Python だと「ラムダ式の中では外の環境を参照する」ことしかできない
つまり、手続き型言語の Python は関数型プログラミングには不向きである、と言える
>>31
>> 引数以外の変数を実行時の環境ではなく、
>> 自身が定義された環境(静的スコープ)において解決することを特徴とする。
クロージャを備えた言語ではクロージャ自身が局所環境を持つということだね(>>4 も参照)
だから、関数内でもラムダ式内であっても局所環境で変数を解決できる
それに対して(クロージャを備えず、代わりに)関数という実行環境しか持たない Python では、
関数内では変数を解決できてもラムダ式内で変数を解決できない
つまり、Python はクロージャを持たない手続き型言語
C#、Java8、C++11、JavaScript、Ruby 等々の関数型プログラミングが可能な言語では、
どれも「ラムダ式の中であっても外の環境を参照し、それを局所環境に保存」できる
それに対して、Python だと「ラムダ式の中では外の環境を参照する」ことしかできない
つまり、手続き型言語の Python は関数型プログラミングには不向きである、と言える
>>31
>> 引数以外の変数を実行時の環境ではなく、
>> 自身が定義された環境(静的スコープ)において解決することを特徴とする。
クロージャを備えた言語ではクロージャ自身が局所環境を持つということだね(>>4 も参照)
だから、関数内でもラムダ式内であっても局所環境で変数を解決できる
それに対して(クロージャを備えず、代わりに)関数という実行環境しか持たない Python では、
関数内では変数を解決できてもラムダ式内で変数を解決できない
つまり、Python はクロージャを持たない手続き型言語
2014/11/09(日) 19:44:13.19ID:5LKfT6rZ
pythonのlambdaって単に単純な関数定義のシンタックスシュガーなんじゃないの?
lambdaなんて名前が付いてるからアレだけど。
lambdaなんて名前が付いてるからアレだけど。
2014/11/09(日) 19:44:17.88ID:KOr7L+hP
2014/11/09(日) 19:47:57.23ID:nlmXbEn2
2014/11/09(日) 19:48:24.99ID:5LKfT6rZ
>>38
ラムダ式を評価した結果も関数定義を評価した結果も同じfunctionだよ。
ラムダ式を評価した結果も関数定義を評価した結果も同じfunctionだよ。
2014/11/09(日) 20:00:59.51ID:lx9et4kr
>>40 たしかに
import inspect
def func(x):
return lambda n: x * n
func(5)(4) #=> 20 (Clojure)
inspect.isfunction(func) #=> True
inspect.isfunction(func(1)) #=> True
import inspect
def func(x):
return lambda n: x * n
func(5)(4) #=> 20 (Clojure)
inspect.isfunction(func) #=> True
inspect.isfunction(func(1)) #=> True
2014/11/09(日) 20:10:51.52ID:KOr7L+hP
>>39
>・「変数を解決する」という用語が未定義
失礼、言語処理系や言語意味論を知らない人には難しい表現だった
「変数を解決する」とは、変数に束縛された値を求めることを意味する
単純な実装では、変数と値の対(ペア)の集合である環境から、変数をキーに値を探索することで実現できる
>・「ラムダ式のみクロージャと認める」というのは>>31とは異なる定義だが、そのような定義をしている文献が引用されてない
「ラムダ式のみクロージャと認める」とは言っていないよ
C#、Java8、C++11、JavaScript、Ruby 等々の一般的な言語では関数でもラムダ式でも局所環境を持てる
これは「クロージャ自身が局所環境を持つ(>>4)」というクロージャ定義からすれば、自然な結果である
それに対して、ラムダ式では局所環境を持てない Python にはクロージャの概念が欠落しているんじゃないのか?
と指摘しているだけ
あるいは処理系への実装を失敗した?、あるいは言語設計上の欠陥を見落とした?という指摘と言い換えてもいい
Python の言語設計者達はクロージャの概念を知っているつもりだったのかもしれないけどね......
>・「変数を解決する」という用語が未定義
失礼、言語処理系や言語意味論を知らない人には難しい表現だった
「変数を解決する」とは、変数に束縛された値を求めることを意味する
単純な実装では、変数と値の対(ペア)の集合である環境から、変数をキーに値を探索することで実現できる
>・「ラムダ式のみクロージャと認める」というのは>>31とは異なる定義だが、そのような定義をしている文献が引用されてない
「ラムダ式のみクロージャと認める」とは言っていないよ
C#、Java8、C++11、JavaScript、Ruby 等々の一般的な言語では関数でもラムダ式でも局所環境を持てる
これは「クロージャ自身が局所環境を持つ(>>4)」というクロージャ定義からすれば、自然な結果である
それに対して、ラムダ式では局所環境を持てない Python にはクロージャの概念が欠落しているんじゃないのか?
と指摘しているだけ
あるいは処理系への実装を失敗した?、あるいは言語設計上の欠陥を見落とした?という指摘と言い換えてもいい
Python の言語設計者達はクロージャの概念を知っているつもりだったのかもしれないけどね......
2014/11/09(日) 20:14:38.63ID:nlmXbEn2
2014/11/09(日) 20:19:48.73ID:5LKfT6rZ
pythonでは関数=クロージャなんじゃないの?
ラムダ式は関数定義の略記方だよ。
ラムダ式は関数定義の略記方だよ。
2014/11/09(日) 20:27:21.21ID:5LKfT6rZ
変数に束縛された値を求めることは評価するっていうんだと思う。
再束縛は別の値を束縛すること。
再束縛は別の値を束縛すること。
2014/11/09(日) 20:32:25.05ID:lx9et4kr
Lispっぽくクロージャ書けるよ
f = (lambda x:
(lambda y=2*x:
(lambda z=x*y:
(lambda w: w * (y + z))))()())
g = f(2)
g(3) #=> 36
f = (lambda x:
(lambda y=2*x:
(lambda z=x*y:
(lambda w: w * (y + z))))()())
g = f(2)
g(3) #=> 36
2014/11/09(日) 20:34:00.52ID:KOr7L+hP
>>43
言葉を「変数の再束縛」へ言い換えただけでは、結論は同じだよ
C#、Java8、C++11、JavaScript、Ruby 等々の一般的な言語では関数やラムダ式はクロージャを元に
設計されているから、外の環境を参照した値を「局所変数に再束縛」できる
それが当たり前で、自然な関数型プログラミングができる
それに対して(クロージャを元にしていない)手続き型言語の Python では、
ラムダ式の中だと「局所変数に再束縛」できない
従って、手続き型言語の Python は関数型プログラミングには不向きである
言葉を「変数の再束縛」へ言い換えただけでは、結論は同じだよ
C#、Java8、C++11、JavaScript、Ruby 等々の一般的な言語では関数やラムダ式はクロージャを元に
設計されているから、外の環境を参照した値を「局所変数に再束縛」できる
それが当たり前で、自然な関数型プログラミングができる
それに対して(クロージャを元にしていない)手続き型言語の Python では、
ラムダ式の中だと「局所変数に再束縛」できない
従って、手続き型言語の Python は関数型プログラミングには不向きである
2014/11/09(日) 20:34:54.87ID:nlmXbEn2
>>45
評価はPythonのラムダの中でも出来るよな?
評価はPythonのラムダの中でも出来るよな?
2014/11/09(日) 20:37:14.94ID:nlmXbEn2
2014/11/09(日) 20:40:33.21ID:lx9et4kr
2014/11/09(日) 20:49:43.56ID:lx9et4kr
>>44
そうだよ
そうだよ
2014/11/09(日) 21:05:06.25ID:KOr7L+hP
>>47
クロージャを備えた言語であれば、ラムダ式を入れ子にした複雑なコードを書かなくても、
単純明瞭で可読性の高いコードが書ける
f = function(x) {
y = 2 * x;
z = x * y;
return function(w) { return w * (y + z) }
}
g = f(2);
print(g(3));
これがクロージャを備えた C#、Java8、C++11、JavaScript、Ruby 等々の普通の言語と
関数型プログラミングに不向きな手続き型言語 Python との違い
クロージャを備えた言語であれば、ラムダ式を入れ子にした複雑なコードを書かなくても、
単純明瞭で可読性の高いコードが書ける
f = function(x) {
y = 2 * x;
z = x * y;
return function(w) { return w * (y + z) }
}
g = f(2);
print(g(3));
これがクロージャを備えた C#、Java8、C++11、JavaScript、Ruby 等々の普通の言語と
関数型プログラミングに不向きな手続き型言語 Python との違い
2014/11/09(日) 21:08:04.55ID:lx9et4kr
ラムダ式の入れ子は分かりにくいから
関数型プログラミングに向いてない
関数型とは一体…
関数型プログラミングに向いてない
関数型とは一体…
2014/11/09(日) 21:09:53.89ID:5LKfT6rZ
そもそも関数型プログラミングって堂々と代入してるようじゃダメなのでは
2014/11/09(日) 21:12:20.49ID:lx9et4kr
どれだけ間違いを指摘しても
Pythonにクロージャが無いって意見を上書きできない
これが参照透過性です
Pythonにクロージャが無いって意見を上書きできない
これが参照透過性です
2014/11/09(日) 21:14:02.40ID:KOr7L+hP
2014/11/09(日) 21:18:46.76ID:KOr7L+hP
>>53
>ラムダ式の入れ子は分かりにくいから
>関数型プログラミングに向いてない
添削しよう:
ラムダ式の入れ子は分かりにくいから、
ラムダ式の入れ子や関数内関数を多用しなければならない手続き型言語の Python は
関数型プログラミングに向いてない
それに対して、クロージャを備えた C#、Java8、C++11、JavaScript、Ruby 等々の普通の言語では、
クロージャ自身が持つ局所環境内の変数に代入(=束縛)できるから、
関数型プログラミングに向いている
>ラムダ式の入れ子は分かりにくいから
>関数型プログラミングに向いてない
添削しよう:
ラムダ式の入れ子は分かりにくいから、
ラムダ式の入れ子や関数内関数を多用しなければならない手続き型言語の Python は
関数型プログラミングに向いてない
それに対して、クロージャを備えた C#、Java8、C++11、JavaScript、Ruby 等々の普通の言語では、
クロージャ自身が持つ局所環境内の変数に代入(=束縛)できるから、
関数型プログラミングに向いている
2014/11/09(日) 21:25:01.25ID:KOr7L+hP
2014/11/09(日) 21:31:21.14ID:lx9et4kr
変数に再束縛できないから、変数に代入できないに意見が変わったね
やっと>>30に追いついたね
やっと>>30に追いついたね
2014/11/09(日) 21:36:16.07ID:lx9et4kr
>>46の変数は外から見えないという意味で
紛れもなく局所変数
紛れもなく局所変数
2014/11/09(日) 21:41:46.54ID:LUEi6lWE
Java 8にクロージャなんかあったっけ?
ただのラムダだったような
ただのラムダだったような
2014/11/09(日) 21:44:14.34ID:KOr7L+hP
2014/11/09(日) 21:45:18.38ID:lx9et4kr
普通は関数定義するよ
当たり前じゃん
当たり前じゃん
2014/11/09(日) 21:49:19.33ID:lx9et4kr
ところで関数はクロージャじゃないって
どこの文化なの?
聞いたことない
どこの文化なの?
聞いたことない
2014/11/09(日) 21:50:58.85ID:KOr7L+hP
2014/11/09(日) 21:55:24.38ID:lx9et4kr
言語的にはJavaのラムダは
ただのメソッド一つのクラスだよ
ただのメソッド一つのクラスだよ
2014/11/09(日) 21:58:19.30ID:KOr7L+hP
2014/11/09(日) 22:04:34.10ID:lx9et4kr
2014/11/09(日) 22:05:03.57ID:TZMLlS/6
Java 8のクロージャは「effectively finalに限りキャプチャ可能」
というなんちゃってな局所環境だけどな
effectively finalの導入でかろうじて使い物になるかも知れないレベル
というなんちゃってな局所環境だけどな
effectively finalの導入でかろうじて使い物になるかも知れないレベル
2014/11/09(日) 22:10:31.90ID:KOr7L+hP
2014/11/09(日) 22:13:13.99ID:n2NDOrh4
>>38
…Haskellにはクロージャが無いと?
…Haskellにはクロージャが無いと?
2014/11/09(日) 22:21:17.10ID:KOr7L+hP
2014/11/09(日) 22:21:52.15ID:lx9et4kr
>>70
だから普通はこう書くよ
あれ?一番簡潔になった?
def f(x):
y = 2 * x
z = x * y
return lambda w: w * (y + z)
g = f(2)
g(3)
だから普通はこう書くよ
あれ?一番簡潔になった?
def f(x):
y = 2 * x
z = x * y
return lambda w: w * (y + z)
g = f(2)
g(3)
2014/11/09(日) 22:25:17.72ID:lx9et4kr
2014/11/09(日) 22:28:55.78ID:GwhuA7Og
>クロージャを識別子に束縛したものが関数だから
C#やECMAScriptの匿名関数は関数ではないと。
珍妙な新説ですなふむふむ
C#やECMAScriptの匿名関数は関数ではないと。
珍妙な新説ですなふむふむ
2014/11/09(日) 22:31:31.78ID:KOr7L+hP
2014/11/09(日) 22:45:45.31ID:KOr7L+hP
>>73
たとえば JavaScript なら、ラムダ式だけ(>>52)と関数定義との併用、
それらのどちらでも簡潔なコードが書けるよ
function f(x) {
y = 2 * x
z = x * y
return function(w) { return w * (y + z) }
}
g = f(2)
g(3)
結局、Python では「ラムダ式を放棄して」関数定義しなければ簡潔なコードを書けない、
ということが実証されてしまったようだね
つまり、真のクロージャを備えた C#、Java8、C++11、JavaScript、Ruby 等々のふつうの言語では、
ラムダ式だけでも関数定義との併用でも、ケースバイケースで選択して簡潔で可読性のあるコードを「書ける」けど、
手続き型言語の Python だとラムダ式だけでは「入れ子になったカッコだらけ」の汚いコード(>>47)しか書けないから、
常に関数定義で「書かなければならない」という違いがある
たとえば JavaScript なら、ラムダ式だけ(>>52)と関数定義との併用、
それらのどちらでも簡潔なコードが書けるよ
function f(x) {
y = 2 * x
z = x * y
return function(w) { return w * (y + z) }
}
g = f(2)
g(3)
結局、Python では「ラムダ式を放棄して」関数定義しなければ簡潔なコードを書けない、
ということが実証されてしまったようだね
つまり、真のクロージャを備えた C#、Java8、C++11、JavaScript、Ruby 等々のふつうの言語では、
ラムダ式だけでも関数定義との併用でも、ケースバイケースで選択して簡潔で可読性のあるコードを「書ける」けど、
手続き型言語の Python だとラムダ式だけでは「入れ子になったカッコだらけ」の汚いコード(>>47)しか書けないから、
常に関数定義で「書かなければならない」という違いがある
2014/11/09(日) 22:46:49.16ID:nlmXbEn2
2014/11/09(日) 22:49:23.73ID:5LKfT6rZ
2014/11/09(日) 22:51:44.34ID:lx9et4kr
2014/11/09(日) 22:54:09.40ID:nlmXbEn2
2014/11/09(日) 22:56:01.93ID:5LKfT6rZ
でもまあ、pythonの文法が変態なのは間違いない。
2014/11/09(日) 22:56:21.23ID:KOr7L+hP
2014/11/09(日) 22:59:47.88ID:QKkGL4h0
2014/11/09(日) 23:01:05.93ID:lx9et4kr
2014/11/09(日) 23:08:28.24ID:KOr7L+hP
>>80
>で、なぜ関数定義でクロージャが作れる
>Pythonにクロージャがない事になるの?
>>72 で書いたように、真のクロージャを備えた C#、Java8、C++11、JavaScript、Ruby 等々の
ふつうの言語では(関数定義だけではなく)ラムダ式でもクロージャが作られるという違いがあるからだ
対して、Python のラムダ式ではクロージャが作られない(だから、局所変数へ値を代入できない)
もし「Pythonにクロージャがない」という主張が不適切であるのならば、
>>42 の最後で書いたように、
「Python の言語設計者達は、処理系への実装を失敗した、あるいは言語設計上の欠陥を見落とした」
と言い換えてもいいよ
こんな使い物にならないラムダ式で満足しなければならないとは、最大の被害者は Python プログラマだよね
だって、他のふつうの言語であれば「ふつうに書ける」ことが、Python じゃ「書けない」のだから....(>>83)
>で、なぜ関数定義でクロージャが作れる
>Pythonにクロージャがない事になるの?
>>72 で書いたように、真のクロージャを備えた C#、Java8、C++11、JavaScript、Ruby 等々の
ふつうの言語では(関数定義だけではなく)ラムダ式でもクロージャが作られるという違いがあるからだ
対して、Python のラムダ式ではクロージャが作られない(だから、局所変数へ値を代入できない)
もし「Pythonにクロージャがない」という主張が不適切であるのならば、
>>42 の最後で書いたように、
「Python の言語設計者達は、処理系への実装を失敗した、あるいは言語設計上の欠陥を見落とした」
と言い換えてもいいよ
こんな使い物にならないラムダ式で満足しなければならないとは、最大の被害者は Python プログラマだよね
だって、他のふつうの言語であれば「ふつうに書ける」ことが、Python じゃ「書けない」のだから....(>>83)
2014/11/09(日) 23:13:26.40ID:5LKfT6rZ
ラムダ式の構文が残念だと言いたいなら、最初からそう言えばいいじゃん。
2014/11/09(日) 23:16:00.89ID:KOr7L+hP
>>84
ラムダ式が引数に値を束縛できるのは、関数型言語を知っていれば常識だよ
そんなことも知らないの?
で、引数以外の局所変数に値を束縛するには、純粋なラムダ式に加えてクロージャが必要になるって話だよ
ラムダ式が引数に値を束縛できるのは、関数型言語を知っていれば常識だよ
そんなことも知らないの?
で、引数以外の局所変数に値を束縛するには、純粋なラムダ式に加えてクロージャが必要になるって話だよ
2014/11/09(日) 23:18:21.66ID:G8K4RNhm
>ラムダ式が引数に値を束縛できるのは
それ束縛じゃねーだろ
キミはアホなのか?
それ束縛じゃねーだろ
キミはアホなのか?
2014/11/09(日) 23:18:59.88ID:nlmXbEn2
2014/11/09(日) 23:23:03.86ID:lx9et4kr
2014/11/09(日) 23:26:01.65ID:lx9et4kr
2014/11/09(日) 23:27:54.79ID:KOr7L+hP
2014/11/09(日) 23:30:45.91ID:nlmXbEn2
2014/11/09(日) 23:33:02.09ID:KOr7L+hP
2014/11/09(日) 23:33:22.37ID:5KptUVSU
使い勝手で一番使い物にならないのはJavaだろ?
void m() {
int y = f();
y = y + 1;
new Thread(
() -> {ここでyを使えないKUSO言語}
);
}
void m() {
int y = f();
y = y + 1;
new Thread(
() -> {ここでyを使えないKUSO言語}
);
}
2014/11/09(日) 23:33:25.09ID:5LKfT6rZ
ID:KOr7L+hP が言ってるのは、
関数の引数にもう少し複雑な処理をインラインで書きたいのに、
defは値返さねえし、lambdaは1行しか書けねえし、
まったく融通がきかねえな!
みたいな字面上の不満であって、関数型プログラミングだのクロージャだの全然関係ない。
関数の引数にもう少し複雑な処理をインラインで書きたいのに、
defは値返さねえし、lambdaは1行しか書けねえし、
まったく融通がきかねえな!
みたいな字面上の不満であって、関数型プログラミングだのクロージャだの全然関係ない。
2014/11/09(日) 23:36:58.94ID:lx9et4kr
2014/11/09(日) 23:39:26.26ID:nlmXbEn2
真のクロージャとかいうオレオレ用語
もちろん引用もなければ定義もない
もちろん引用もなければ定義もない
100デフォルトの名無しさん
2014/11/09(日) 23:40:53.08ID:KOr7L+hP >>94
クロージャという概念を正しく理解していないと、
Python みたいなラムダ式に欠陥のある言語が設計されてしまうというお話だよ
言い換えると、クロージャという概念を用いると、
なぜ Python のラムダ式が欠陥品なのかを明解に説明できる
このクロージャの利点は、このスレの主旨からは逸脱していないと思うよ
クロージャという概念を正しく理解していないと、
Python みたいなラムダ式に欠陥のある言語が設計されてしまうというお話だよ
言い換えると、クロージャという概念を用いると、
なぜ Python のラムダ式が欠陥品なのかを明解に説明できる
このクロージャの利点は、このスレの主旨からは逸脱していないと思うよ
101デフォルトの名無しさん
2014/11/09(日) 23:42:02.22ID:nlmXbEn2■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 日本行き空路49万件キャンセル 中国自粛呼びかけ 日本行きチケット予約の約32%に相当 [ぐれ★]
- 【中国外務省】日中関係悪化は高市氏に責任と名指しで非難… ★2 [BFU★]
- 【中国外務省】日中関係悪化は高市氏に責任と名指しで非難… ★3 [BFU★]
- 外務省局長は無言で厳しい表情…日中の高官協議終了か 高市首相“台湾”発言で中国が強硬対応 発言撤回求めたか…★2 [BFU★]
- 小野田紀美・経済安保担当相「何か気に入らないことがあればすぐに経済的威圧をする国への依存はリスク」 [Hitzeschleier★]
- 政府、株式の配当など金融所得を高齢者の医療保険料や窓口負担に反映する方針を固めた [バイト歴50年★]
- 中国高官と話す外務省局長の表情、やばい ★2 [175344491]
- 偏差値35大臣「すぐに経済的威圧するところへの依存はリスク」 [834922174]
- 【朗報】高市、中国からの日本行き空路49万件キャンセルを達成🤩オーバーツーリズム対策の手腕が光る [359965264]
- 中国外務省「日中関係の悪化は高市早苗首相が原因」と名指しで強く非難。キタ━(゚∀゚)━! [153490809]
- 【スパイト行動】俺のコ,ードを入れれば1500円貰えるのに、俺に1500円をやりたくないからやらない ⇐これが日本人ってやつか… [201193242]
- 小野田経済安保相「すぐに経済的威圧するところへの依存はリスク」😲 [861717324]
