関数型 vs staticおじさん

まとめました
3
Satofumi @satofumi_

@kmizu @MtCedar 会話に混ざりたいけど、会話できるほどの知識がないのに気づきました…。

2014-04-16 21:17:38
kmizu @kmizu

@MtCedar リスパーをLisp上級者、あるいはLispを好んで使うプログラマだとすると、たぶんそういったこと(ループを再帰呼び出しとして書くこと)は好きではないと思います。(続く)

2014-04-16 23:55:59
kmizu @kmizu

@MtCedar ループは常に再帰として書くことができる、というのは真なのですが、これは単に関数型プログラミングにおける基本的な道具がループでないというだけであって、生の再帰呼び出しをそのまま使うことが推奨されているわけではありません。(続)

2014-04-16 23:57:18
kmizu @kmizu

@MtCedar .@kmizu まずreduce(foldLeft)やmapなどの高階関数を使って書けないか考え、それらで書けない時に初めて(末尾)再帰で書くのが普通の考え方かと。

2014-04-16 23:59:26
kmizu @kmizu

@MtCedar .@kmizu ちなみに、リスパーと関数型言語プログラマーを同一視、あるいは近似するのは結構危険かと思います。リスパーはむしろS式とそれによって実現されるマクロにこだわるという面に特異なところがあります。

2014-04-17 00:02:37
杉山哲男 @MtCedar

@kmizu いやいや、だからなんで高階関数とか訳のわからないものを使おうとするのか。

2014-04-17 00:04:41
杉山哲男 @MtCedar

@kmizu フローチャートで書ける処理を、わざわざフローチャートで書きにくいような複雑な処理として記述するという発想がよくわかりません。

2014-04-17 00:12:11
kmizu @kmizu

@MtCedar 自分の答えとしては、簡潔に書けますし、考える労力をより割かなくて良いからということになります。

2014-04-17 00:35:37
kmizu @kmizu

@MtCedar それはすぎさん流ネタですよね? >フローチャートで書ける処理を、わざわざフローチャートで書きにくいような複雑な処理として記述するという発想

2014-04-17 00:36:13
杉山哲男 @MtCedar

@kmizu 理解できない、とは言い過ぎかもしれませんが、馴染めない考え方だと言うのが正直なところです。たぶん、思考の抽象化の方法が違うんだと思います。

2014-04-17 00:38:11
杉山哲男 @MtCedar

@kmizu 僕がプログラムを書く時は、メモリイメージに対する書き換えの手続きとして処理を考えるので、オブジェクト指向はまだ分かるけれど、関数型プログラミングは根本的に相容れない感じです。

2014-04-17 00:44:31
kmizu @kmizu

@MtCedar hmhm。とすると、ちょっと気になるのですが、たとえば、int x = ...; int y = ...; x + y; のx + yはどういうモデルで理解されますか?(結果の代入は考えない)

2014-04-17 00:46:52
杉山哲男 @MtCedar

@kmizu 言い方が悪いかな。要はCPUの加算器を駆動する指示と理解しています。

2014-04-17 00:50:51
kmizu @kmizu

@MtCedar なるほど。では、たとえばより複雑なデータ型、たとえば多倍長整数型(CPUの加算器が直接扱えない大きさ) BigIntがあったとして、BigInt x = ..., y = ...; x + y に相当する演算はどうとらえるべきでしょうか?

2014-04-17 01:06:45
杉山哲男 @MtCedar

@kmizu 言語の実装によるでしょうが、大抵は多倍長整数の領域を2つ指定すると加算してくれるサブルーチン呼び出しになると思います

2014-04-17 01:08:51
kmizu @kmizu

@MtCedar x + yを単に「二つの値を加算した結果の値を生成する」ととらえるのであれば、intだろうとBigIntだろうと同じように(人間は)扱えますが、CPUの加算器を駆動する指示というレベルまで抽象度を落とすのであれば、かなり面倒なのでは?という疑問です。

2014-04-17 01:10:07
kmizu @kmizu

@MtCedar あくまでメモリ領域ベースでとらえるなら、結果の値を格納する場所が問題になりますが、実行スタックに格納されるべきですか?

2014-04-17 01:12:17
杉山哲男 @MtCedar

@kmizu 脳内モデルに面倒も何もないと思うのですが。

2014-04-17 01:12:22
杉山哲男 @MtCedar

@kmizu それは呼び出し規約の問題なので、呼び出されるルーチンの実装に依存します

2014-04-17 01:13:22
kmizu @kmizu

@MtCedar なるほど。だとすると、その捉え方は日常のプログラミングを不必要に複雑にしているように思えます(もちろん、リソースに敏感にならなければいけない局面では抽象度を落として考える事も必要ですが)

2014-04-17 01:15:14
杉山哲男 @MtCedar

@kmizu 要は慣れの問題じゃないでしょうか。慣れたモデルのプログラミングの方が、頭を使わなくて済みます。

2014-04-17 01:18:57
kmizu @kmizu

@MtCedar 慣れとは別に抽象度の高低の問題があると思います(抽象度を高くし過ぎると逆に理解しにくくなる事はあると思いますが)

2014-04-17 01:21:50
杉山哲男 @MtCedar

@kmizu 誤解があるといけないので、明言しておきますが、僕は関数型プログラミングのモデルが誰にでも理解しにくいとは思っていません。プログラマは自分のメンタルモデルに即した言語を選ぶべきで、押し付けは良くないという話です。

2014-04-17 01:22:33