セカイノカタチスマートフォン用の表示で見るセカイノカタチ世界のカタチを探求するブログ。関数型言語に興味があり、HaskellやScalaを勉強中。関数型mattn.kaoriya.netというわけで、通りすがりに見かけた記事ですが、Genericsの使い方について、ちょっと引っ掛かったのでコードを書いてみました。}}元のコードがこんな感じで、コンパイルエラーなんですけど、対処方法として、謎のインターフェースを定義して、型キャストとかも発生していたので、こんな感じにしたほうが良いよ?と言いたかっただけです。}}まあ、関数のシグネチャーが変わってしまっているのですが、「加算」を抽象化したインターフェースを定義して、そいつを渡してあげると型キャストも発生せずにコード量も増えすぎず、Genericsな感じで拡張できます。Doubleの加算をしたいときも、上記で匿名クラスを渡している部分を下記のようにするだけです。}}まあ、これってもろモノイドなんですけど・・・。本質的な話コンビニにおやつを買いに歩いてたら、ちょっと考えがまとまったので追記します。元記事のコードと僕の挙げたコードの違いは何でしょうか?元記事では、「Number」や「Int」といった「データ」を抽象化していました。それに対して、僕のコードでは、「加算」という「計算」を抽象化しています。「計算」を抽象化するという概念は、関数型言語ではオーソドックスなスタイルであり、そのために型クラスという概念が日常的に利用され、アドホック多相を実現しています。これに対して、オブジェクト指向では、「対象」を抽象化するというアプローチが一般的に採られ、「データ」を抽象化する傾向にあります。このアプローチは、処理をうまく抽象化できず、歪を生みます。考え方を学ぶ前は、オブ脳的な考えで、設計や実装を行っていました。その頃は、「なぜ処理が冗長になってしまっているのか?」理解できませんでした。「これが限界なんだ」と自分に言い聞かせるようにコードを書いていたのかもしれません。関数型プログラミング賛辞のような文章になってしまいましたが、「万能ですごい!」と言うつもりもないですし、僕自身関数型プログラミングに対してそんな感情を持ちません。両方のアプローチを理解することで、確実にコンピューティングが豊かになることは間違いないと思います。はてなブログProシステム開発の世界で15年の山の民による、世界のカタチを探求するブログ。(4)はてなブログをはじめよう!qtamakiさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。