はてなキーワード: fstとは
【PRAY FOR JAPAN】 被災地のあなたへ / 狐火
http://www.youtube.com/watch?v=DDgqBjmaZrc
【PRAY FOR JAPAN pt.2】 何度でも / 狐火
http://www.youtube.com/watch?v=HrDjoC_h0b4&feature=related
【PRAY FOR JAPAN pt.3】 SOS / 狐火
http://www.youtube.com/watch?v=OO1xfcPYQrM&feature=related
311/空(kuu) 東日本大震災に対するヒップホップ曲 kalm feat. MC Ousia
http://www.youtube.com/watch?v=jpaEXOvtCzk
http://www.youtube.com/watch?v=vVDVl_HXllM
I Pray For Japan/WILDER Track by Dirty Dice
http://www.youtube.com/watch?v=qgbtdyUD7C0
http://www.youtube.com/watch?v=rD9LEXkZPiE
http://www.youtube.com/watch?v=SaQS2NLNnN8
http://www.youtube.com/watch?v=gBwotVHUQJ8
日の丸に祈り-pray for japan-/Nakaji(近江レコード)
http://www.youtube.com/watch?v=zzsV0RY1wOo
出来ることから-pray for japan-/うたたね(近江レコード)
http://www.youtube.com/watch?v=hiJbXKpkEPg
PRAY FOR JAPAN / HAIIRO DE ROSSI Track by EeMu ~ ONE / Aporia
http://www.youtube.com/watch?v=4EDoGS_3vQc
続々と増えてくるヒップホップ曲。他のジャンルでも色んな曲があるのだと思いますが、ヒップホップの曲だけでもこんなにもう既に出てきているみたいですよ。もし、新たに作った方がいれば、どんどん追記しますので、コメントください。
あくまで自分でこう答えるという話。
(問1)
(define fold-left (lambda (func obj lst) (cond ((null? lst) obj) (else (fold-left func (func obj (car lst)) (cdr lst)))))) (define my-sum (lambda (lst) (fold-left + (car lst) (cdr lst))))
・例
(my-sum '(1 2 3 4 5 6 7 8 9 10))
(問2)
(define fold-left (lambda (func obj lst) (cond ((null? lst) obj) (else (fold-left func (func obj (car lst)) (cdr lst)))))) (define large (lambda (x y) (cond ((>= x y) x) (else y)))) (define my-max (lambda (lst) (fold-left large (car lst) (cdr lst))))
・例
(my-max '(58 90 1 2 4 3 100))
(問3)
(define fold-right (lambda (func lst obj) (cond ((null? lst) obj) (else (func (car lst) (fold-right func (cdr lst) obj)))))) (define my-apply (lambda (func obj) (func obj))) (define plus5 (lambda (num) (+ num 5))) (define times10 (lambda (num) (* num 10))) (define divide2 (lambda (num) (/ num 2))) (define plus5-times10-divide2 (lambda (num) (let ((lst (list plus5 times10 divide2))) (fold-right my-apply (reverse lst) num))))
・例
(plus5-times10-divide2 5)
全部畳み込み関数を使っているのは、はじめ使い道がないと思ってたのにかなり使い道があることがわかったので、それを示したかったから。あとmap関数あたりはほかの言語でもあるから、すぐに思いつくだろうし。
というか最後のやつは手続きを抽象化することでリストの形で扱えるようにしているから、関数プログラミングでは重要だと思う。関数プログラミングの肝は計算によって手続きを含めたすべて表すことができることだと思っている。その例だと思うんだけどね。例えばSchemeなら上記の答えを応用して、似たような「手続き」を生み出す関数を作ることができる。
(define make-proceduce (lambda (fst . rest) (let ((lst (cons fst rest))) (lambda (num) (fold-right my-apply (reverse lst) num)))))
これを使うと次のようにできる。
(define divide2-plus5-times10 (make-proceduce divide2 plus5 times10)) (divide2-plus5-times10 2) (define divide2-times10-plus5 (make-proceduce divide2 times10 plus5)) (divide2-times10-plus5 2)
関数合成がつかえるならそっちのほうが楽だけど、リストという形で「手続き」をつくり出していることがわかるだろうか?手続きをリストで操作できるのだ。こういうのが関数プログラミングの肝だと勝手に思っている。
こうやってくると型推論や多相型の重要性もわかると思うんだよ。上記のようなことはPythonでもできる。でも高階関数はつかいすぎるとわかりにくい。どっかにバグが入ってくるかもしれない。それを機械的に防ぐのが型推論。型という観点から型推論でおかしいところを探し出してくれる。それならC言語でもいいのではないかという人もいるかもしれない。だがC言語は融通が利かない。例えばapply関数にしても引数の型が数値なら数値、文字なら文字と決まっている必要がある。だから数値に向けにapply関数を作っても文字には使えない。こうした型のデメリットをなくす一方、そのメリットを享受するためにあるのが多相型。これによってapply関数やmap関数を一般的に作ることができ、型のメリットを享受しながらデメリットをなくすことができる。このように関数で手続きなんかを抽象化するときに型推論や多相型があると便利なのだ。