僕のみた関数型言語

Preview:

Citation preview

僕の見た関数型言語Yoshiori SHOJIfunction club

こんにちは!!ヨシオリです!!

æææææææææææææææææææææ%%%99%9%99%%999*,*ææææザッザッザ・・・æææææææææææææææææææææææ%%%99%9%%9%9%%%99%%999*,*æææザッザッザ・・・ææææææææææææææææææææææææ99%%%99%9%%9%9%999%%99%%999ææææææææææææææææææææææææ99%%9%9%99%%99%9%%9%9%999%%99%%999ææææææææææææææææææææææætwkwtuwkwtwkwtwøææææææææææææææææææææææKTttKtwtKTttKtwtKTttøæh_t_+h_からきますたæææææææææææææææææææΛœ´Õ−ÕΛœ´Õ−ÕΛœ´ÕΛœ´æææh_t_+h_からきますたæææ´œœΛæ´œœΛæ´œœΛæ´œœΛææææææææææææ朜*,ヘæ-–œæ-–œœ*,ヘæ-–œœ*,ヘæœ*,ヘææh_t_+h_からきますたææææ-›œœ]‹–æææ-›œœœ-›œœ]‹–æ]‹–æ-›œœ]‹–ææ‹%%%%%%æææ%%%%%%8888888›‹%%%%%%æææ%%%‹%%%%%%æææ%%%%%%8888888›ææ‹%%%%%%æææ%%%%%%8888888›æ,zÁ●Ë*æææÇÁ●ËÇ,8zÁ●Ë*æææzÁ●Ë*æææÇÁ●ËÇ,8zÇÁzÁ●Ë*æææÇÁ●ËÇ,8zææzææ**ß&Ç]*'–Ç**æ,8888zææ**ß&Ç]*'zææ**ß&Ç]*'–Ç**æ,8888z]*'zææ**ß&Ç]*'–Ç**æ,8888z,æzææÀ+;§;+%æ,8888888zææÀ+;§;zææÀ+;§;+%æ,8888888z§;zææÀ+;§;+%æ,8888888zææ›ææÀ§§´æ,88888‹›ææÀ§§æ›ææÀ§§´æ,88888‹§´›ææÀ§§´æ,88888‹æææ‹ÀŸ¤++¤¤⁄´›‹ÀŸ¤+æ‹ÀŸ¤++¤¤⁄´›+¤¤‹ÀŸ¤++¤¤⁄´›

関数型言語って何

関数型言語は、広い意味では

ファーストクラスの関数オブジェクトを持つ

言語である。wikipedia より

知ってる!!

これでしょ?>>> def foo(data):... print data... >>> foo<function foo at 0x6fa30>>>> _('hoge')hoge

Python

さすが Python!! Rubyに出来ない事を

(ry

紛争の原因になる記述の為削除しました。

ソレスタルビーイング

さらに!!

λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ λ

lambda もある!!

森田さんも Python で上司を説得すれば楽だったろうに……

でも!!

「文」な困ったちゃん•Python では代入が文

•ちょw (再)代入出来ないwwまぁ、関数型っぽくて良いか

• print が文

•ちょw デバッグ出来ねぇwwww

というか

•処理が続けて書けないw

• foo(); bar(); って文じゃんwwww

比較式• if 文とかで使うアレif( A && B ) とか if A and B

• A and B (&&)A を評価して真だったら B を評価

• A or B ( || )A を評価して偽だったら B を評価

irb(main):014:0> p 1 && 2 2=> nilirb(main):015:0> p 1 || 2 1=> nil

比較式

>>> print 1 and 22>>> print 1 or 21

これじゃね?

Python の真偽値Python では None、 False、

ゼロ(数値)、 空配列、空辞書、及びユーザ定義クラスで

__nonzero__() や __len__() が数値 zero または False を返す場合は

偽として扱われます。それ以外は真として扱われます。

foo() and bar()左辺が"真"だと右辺が実行される

式になった!!でも

左辺の評価結果が常に"真"にならないと困る

[ foo() ] and bar()[ ] で囲む事によって要素数 1 のリストになり

常に"真"になる

複数の処理を式に

[ foo() ] and [ bar() ] if A else True2.5から三項演算子が出来たのでそれを使う

if 文を式にif A : foo() bar()

[A and [ foo() ] and [ bar() ]]

2.5以前は三項演算子が無かったので

if 文を式に(2)[[ foo() ] and [ bar() ] if A else True ]

これ自体も[ ] で囲む事によって常に"真"になる

Python にはリスト内包表記が有る!!

for文を式に

for x in range(10) : foo( x )

[ foo( x ) for x in range(10) ]

def hoge( data ): return [foo()] and bar( data )最初に return 書けば最後に評価した値が返る

関数の返り値

lambda 化hoge = lambda data :([foo()] and bar( data ) )

tipsimport sys;[sys.stdout.write(data)]print 文は

代入はリストの append や辞書の__setitem__を使用する。グローバルな名前空間globals()、ローカルの名前空間locals()、そしてオブジェクトxの名前空間x.__dict__

globals().__setitem__("setitem", globals().__setitem__)

実際にやってみた(pit編)

しかも!!

式だからPythonなのに

フリーレイアウト!!

oneliner も出来ます!!(というか oneliner の

知識です><) Pythonでワンライナーを作成する際のノウハウ集http://www.nishiohirokazu.org/blog/2006/08/python_12.html

関数型言語の話しをしていたはずなのに

気がついたらonelinerの話しになってた。

何を言っているのか(ry

おわりJava Expert #03 にJython の記事書きました><11/15くらいに発売なのでよろしくおねがいします><

Recommended