トップページ⇒tech
1001コメント388KB

【激突】関数型言語 VS オブジェクト指向言語2

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 21:26:47.61
一般的には、オブジェクト指向型言語が優勢でが
一部には関数型言語を崇拝している人もいます

どちらが上なのか、この際はっきりさせましょう

前スレ http://toro.2ch.net/test/read.cgi/tech/1331328955/
0866デフォルトの名無しさん2012/05/20(日) 15:55:15.81
でも、C言語なんかと比べたら全然なんでしょ?
その時点でどうでも良くない?
豆粒みたいな普及率をどうのこうの言ったって仕方ないし、
どうせ、数字の見方の問題に話がそれるだけでしょう。

それより、関数型言語のスレらしく、、
関数型言語の優れている点でも語り合ったら?
手続き型言語には副作用を簡単に表現できる利点があるから、
それを上回るメリットが関数型言語に無いことにはねぇ。
手続き型言語でも、副作用を禁止して書いていくことは出来るし、
その場合は副作用が無いからとても安全に記述できるわけだけど、
それと比べて関数型言語に一体どれだけのメリットがあるのか。
特に最近は遅延評価をサポートしている手続き型言語もあるし。
0867デフォルトの名無しさん2012/05/20(日) 15:55:37.97
>>864
えるしってるか どるふぃんはまっくでもうごくw

http://www.youtube.com/watch?v=Te4Cx0Mz1Gw
0868デフォルトの名無しさん2012/05/20(日) 15:58:39.62
>>866
普及率自体はどうでも良くて社会基盤の一部として実働してることが重要。
そもそも玩具だの言い出したから始まった話だし。
0869デフォルトの名無しさん2012/05/20(日) 16:02:56.95
F-22や米国兵器ぐらいにしか使われておらず
普及しているとは全然言えないからAdaは
おもちゃだと言ってるのに似てるね
0870デフォルトの名無しさん2012/05/20(日) 17:16:45.10
Haskellは案外ドカタ向きなのかもしれんな。w

https://twitter.com/#!/hajimehoshi/status/204083496610832385
0871デフォルトの名無しさん2012/05/20(日) 19:22:30.25
>>860
> 個人じゃなく販売数とか、ダウンロード数とか
> 確実な値で調べろと言ってるんだが

公表されてないから調べようがない。
0872デフォルトの名無しさん2012/05/20(日) 19:27:28.72
ランキング厨って、「世の中の仕事の99%は事務処理だから、プログラミング含め、創造的と言われてる仕事は重要でない」と宣う奴みたいだな。
そんなのが何でブログラムスレに居るのかは謎だが。
0873デフォルトの名無しさん2012/05/20(日) 19:30:44.25
重要かどうかはどうでもいいよ。

実際、使われてないんだろ?
0874デフォルトの名無しさん2012/05/20(日) 19:40:27.89
利用者数なんて使いやすさ/間口の広さの指標ぐらいにしかならないでしょ
価値と直結してるとか考えてる人はちょっとやばい
0875デフォルトの名無しさん2012/05/20(日) 19:42:58.25
>>873 池沼か?
0876デフォルトの名無しさん2012/05/20(日) 19:54:04.24
え、言語においては、たくさんの人が使っているものは、
それだけ価値があるんじゃないの?
0877デフォルトの名無しさん2012/05/20(日) 20:04:00.42
>>876
違う。

違うっていうことはどういうことか分かるか?

反対ってことだ。

つまりあまり使われてない言語のほうが価値がある。
0878デフォルトの名無しさん2012/05/20(日) 20:04:02.84
やっぱ池沼か。うざいからどっか行ってくんないかな。
0879デフォルトの名無しさん2012/05/20(日) 20:04:52.04
日本語プログラミング言語のひまわりとか?
0880デフォルトの名無しさん2012/05/20(日) 20:07:24.83
おいおい。使われないクソ言語はいくらでもあるだろう。
そこは、言語の価値はシェアや人気とは無関係って方向にもってけよ。w
0881デフォルトの名無しさん2012/05/20(日) 20:08:41.00
柳刃包丁の包丁市場に占めるシェアみたいなものか

自分で書いてて例えが微妙な気がした
0882デフォルトの名無しさん2012/05/20(日) 20:22:03.52
Smalltalkみたいなマイナー言語を長年使ってると
こんな>>877書き込みするようになっちゃうの?
ガチなら狂ってるとしか思えないんだけど
0883デフォルトの名無しさん2012/05/20(日) 20:30:01.51
>>880
> そこは、言語の価値はシェアや人気とは無関係って方向にもってけよ。w

無関係ではない。
統計とはそういうもの。
データを集めれば、
概ね正しい結果が出てくる。
0884デフォルトの名無しさん2012/05/20(日) 20:37:40.84
ほら下らない展開。
だから、>>866で止めようって書いたのに。
0885デフォルトの名無しさん2012/05/20(日) 21:04:24.94
人海戦術は統計学に入りますか?
0886デフォルトの名無しさん2012/05/20(日) 21:14:05.78
入りません
0887デフォルトの名無しさん2012/05/20(日) 21:15:43.37
>>883
えー、ホントに?
じゃあこの結果も概ね正しいんだね

http://attractivechaos.github.com/HN-prog-lang-poll.png
0888デフォルトの名無しさん2012/05/20(日) 21:19:32.06
正しい統計結果を出すための前提が>>883の中で欠落してる件について。
0889デフォルトの名無しさん2012/05/20(日) 21:20:26.39
>>873
導入事例が存在するんだから使われてるに決まってんだろ
0890デフォルトの名無しさん2012/05/20(日) 21:21:45.47
>>883
じゃADAは国家レベルの事業でしか使われてないから価値がないのか
0891デフォルトの名無しさん2012/05/20(日) 21:23:48.90
>>871
電話かけて聞けよ
0892デフォルトの名無しさん2012/05/20(日) 21:27:29.64
あれだよな、スパコンじゃ9割7分Fortranが使われてて
科学技術の基礎や応用を作り上げてるが
ランキングに乗っていない以上無価値なんだよな
0893デフォルトの名無しさん2012/05/20(日) 21:27:38.81
電話かけて聞けよ
電話かけて聞けよ
電話かけて聞けよ
0894デフォルトの名無しさん2012/05/20(日) 21:28:33.26
>>893
恥ずかしいならメールでもいいぞ
0895デフォルトの名無しさん2012/05/20(日) 21:41:51.60
>>868
> そもそも玩具だの言い出したから始まった話だし。

そんなレス在ったっけ?って検索しても無いから
遡って探したら前スレで見つけた。


> 382 : 営利利用に関するLR審議中@詳細は自治スレへ : 2012/03/31(土) 14:28:58.16
> かつてのSmalltalkファンが 
> 今ではRubyやPythonを使ってるってのは良く在る話 
> 
> Smalltalkは構文がダサくて読み難いし 
> Squeak/Pharoは玩具過ぎるし 
> Visual Worksはまるで古いVBみたいだし


こんな前の話をまだ根に持ってたのかよw
執念深過ぎwww
0896デフォルトの名無しさん2012/05/20(日) 21:53:12.69
そんな前のレス引っ張り出してきてドヤ顔のお前もそーとーあれだぞ。
0897デフォルトの名無しさん2012/05/20(日) 22:02:41.55
>>809 の事だろ
>トイプログラムの御題でくらいは存在感を出さないとね。
0898デフォルトの名無しさん2012/05/20(日) 22:21:34.69
なんだよ>>895のマッチポンプかよ。いよいよヤバイ奴っぽいな。
0899デフォルトの名無しさん2012/05/21(月) 07:31:14.84
マイナー言語使いって少し煽るだけで
顔真っ赤にして反論するからスレが荒れてうっとうしい
HaskellしかりSmalltalkしかり
少しはスルーしろよ、どんだけ余裕が無いんだよ
つーか日曜日の昼から2chかよ家族はどうした
0900デフォルトの名無しさん2012/05/21(月) 09:12:40.56
志村っ! 日食! 日食!
0901デフォルトの名無しさん2012/05/21(月) 19:50:14.05
>>847
1.6GHz Core i5 で12秒


{-# LANGUAGE BangPatterns #-}
import Control.Applicative
import Control.Monad
import Data.Maybe
import Data.Ord
import Data.List
import Data.MultiSet as S
import System.Random.Mersenne

cardNum = 10
iterateNum = 1000000
completeSet = fromList [0..cardNum-1]

main = do
  s <- replicate iterateNum <$> newMTGen Nothing >>=
       foldM (\(!s) g -> flip S.insert s <$>
         S.size . fromJust . find (completeSet `isSubsetOf`) .
           scanl (\x n -> S.insert (n `mod` cardNum) x) S.empty <$>
         (randoms g :: IO [Int])) S.empty
  print $ (findMin s, findMax s, maximumBy (comparing snd) $ toAscOccurList s)
0902デフォルトの名無しさん2012/05/21(月) 22:26:30.65
いろいろスゴイ!
0903デフォルトの名無しさん2012/05/24(木) 18:05:17.49
そもそも847はなぜ関数型で書けないと思ったのか
Smalltalkのコードだってブロック(クロージャ)多用してるのに
0904デフォルトの名無しさん2012/05/24(木) 18:34:08.78
副作用を前提としたクロージャと、Haskell のそれはだいぶ違うと思うけど。
0905デフォルトの名無しさん2012/05/24(木) 19:04:47.32
オブジェクト指向も最初はそんな感じだったじゃないか
C言語で同じことができると思う奴と
だいぶ違うと思う奴に分かれていた
0906デフォルトの名無しさん2012/05/24(木) 20:08:35.48
いいかげん関数型言語 = Haskellの図式で語るのをやめなさい
OCamlとF#とSMLが怒りますよ
0907デフォルトの名無しさん2012/05/24(木) 20:13:47.73
C言語は実際凄いだろ。副作用がかけるし。
0908デフォルトの名無しさん2012/05/24(木) 21:03:56.77
Haskellでも副作用は書けるけどね
副作用の有無が型でキッチリ区別されて
静的型チェックの対象になるだけで
0909sage2012/05/25(金) 08:12:50.15
今時OOPが本当に優れていると考えているヤツなんているのかよ。
OOPなんて、回路基盤 -> アセンブリ -> C言語の延長線上にある、非常にアドホックな
考え方だと思うのだが。
多くの静的型付け関数型言語は次の利点があるのは有名だろ。

* 自動テストが容易
* 拡張に対する変更箇所が少ない
* 型で「ありえない状態」の存在を除去
* nullがない

関数型と比べて、OOPのいいことってなんだ?存在しないんじゃない?
0910デフォルトの名無しさん2012/05/25(金) 08:43:38.16
今どき、静的型のメリットと関数型のメリットを混同している奴がいるとはな。
あといい加減、OOP(あるいはもっと一般化した抽象データ型)と関数型は
型による抽象化か関数による抽象化かという抽象化手法の違いに過ぎず、
つまりそれぞれ得手不得手があるし互いにある程度補い合う事が可能な
考え方だってことに気づけよ。
0911デフォルトの名無しさん2012/05/25(金) 08:49:33.01
つまりOCaml(関数型+抽象データ型)とScala(抽象データ型+関数型)が最強というわけでつね。
0912sage2012/05/25(金) 09:13:10.98
>>910
OOPの得意な抽象化手法ってなんぞや。
カプセル化、多態性、継承はHaskellの方が優れていると思うのだが。
0913デフォルトの名無しさん2012/05/25(金) 10:00:48.53
関数型言語の方が優れていますが
同時に優れたプログラマを必要とするので流行りません
0914デフォルトの名無しさん2012/05/25(金) 10:07:25.99
どうりでRubyが流行るわけだ
0915デフォルトの名無しさん2012/05/25(金) 10:11:57.06
黒板言語とその仲間たちと、実用は別だからな。
0916デフォルトの名無しさん2012/05/25(金) 10:18:37.09
存在する処理系を認識できないような脳をしている >>915 のような人間もいるしな。
0917デフォルトの名無しさん2012/05/25(金) 10:26:44.60
>>912
カプセル化・継承・多態性というお題目は、OOPにおいてクラスを用いて
抽象データ型が実現されている(その恩恵〜かつてはそう信じられていた〜として
継承による差分プログラミングや、付随して多態性もある)ということを言い表わしてるだけなので
OOPで可能な抽象化手法を列挙したものではないってのはOK?
加えて、OOPにおいてクラスが単なる(SIMULAからの)借り物なのに対して、
抽象データ型を最初から視野においてよく練られたHaskellの型クラスが優秀なのは
あたりまえといえば当たり前。
Haskellはよく純粋な関数型と言われるけれど、OOPのように抽象データ型にクラスを使っていない
というだけで、言語としては関数型と抽象データ型のハイブリッド。

しいて言えば、クラスのように関数(メソッド)を型に内包する機構を使って
実現された抽象データ型の場合、関数型で好まれる関数を型の外に置く
抽象データ型(狭義の抽象データ型。CLUやAdaなんかもこの類)に比べて
型を追加する拡張が得意だし、その逆で後者は関数(その結果としてインターフェイス)を
増やす拡張が容易という程度の得手不得手はある。
http://www.cs.utexas.edu/~wcook/papers/OOPvsADT/CookOOPvsADT90.pdf
0918デフォルトの名無しさん2012/05/25(金) 10:39:11.21
>>912
Haskell のカプセル化って何?
カプセル化って副作用のための仕組みじゃないの?
0919デフォルトの名無しさん2012/05/25(金) 10:49:14.56
カプセル化→隠蔽工作
0920デフォルトの名無しさん2012/05/25(金) 10:50:04.22
>>917
出典がちょっと古いな。
今はハイブリッドもある。
0921デフォルトの名無しさん2012/05/25(金) 10:50:55.89
>>918
カプセル化っていうのは有り体に言えば抽象データ型、簡単にはユーザー定義型のこと。
あるいはその作業・手法のこと。OOPでは抽象データ型にクラスを使うから副作用の封じ込め的な
イメージがあるけれど、広い意味での抽象データ型においてはそれだけを意図したものではないよ。
0922デフォルトの名無しさん2012/05/25(金) 10:55:47.86
カプセル化というのはアクセス制御をちゃんとやることです
もっといえば必要なもの以外はpublicにすんな、ということです
0923デフォルトの名無しさん2012/05/25(金) 10:57:00.98
>>920
切り分ければそうだというだけで、別にクラスを使った関数(メソッド)を
内包させるタイプの抽象データ型と、内包しない狭義の抽象データ型の共存が
できないということを意味するものではないよ。
PythonとかScalaとかC#とか普通に(後者は特に巧妙に)やっているでしょう。
0924デフォルトの名無しさん2012/05/25(金) 11:04:29.57
>>922
坊や。危ないからこんなところに来ちゃだめだよ。ほらほらOOP村にお戻りなさい。
0925デフォルトの名無しさん2012/05/25(金) 11:09:01.64
>>921
だとしても「継承、多態、カプセル化」と並べられた場合
カプセル化が意味するところは封じ込めのほうで良いのでは?
0926デフォルトの名無しさん2012/05/25(金) 11:28:10.90
>>921
haskellでのカプセル化はモジュール化して公開するシンボルを制限することだと思うが

>簡単にはユーザー定義型
カプセル化とオブジェクト化を混同してないか
0927デフォルトの名無しさん2012/05/25(金) 11:38:11.45
>>925
必ずしも副作用の「封じ込め」に特化した作業や仕組み、を意図しないのであればはなから異論は無いよ。
それとも、この文脈における「カプセル化」を抽象データ型やユーザー定義型と
言い換えることがダメってこと? それなら君はエセ識者に間違った知識を植え付けられている。
http://www.cs.swan.ac.uk/~csulrich/ftp/adt/adt.pdf
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.55.8524&rep=rep1&type=pdf
0928デフォルトの名無しさん2012/05/25(金) 11:49:49.56
ADTは、カプセル化の型システムからの射影。
0929デフォルトの名無しさん2012/05/25(金) 12:01:22.74
OOPの文脈で
データの抽象化:データと振る舞いを一つにまとめること(クラスベースやプロトタイプベースで実現)
カプセル化:整合性を保つため内部への直接の操作を制限すること(アクセス指定子やクロージャで実現)
0930デフォルトの名無しさん2012/05/25(金) 12:32:36.76
抽象化:派生クラスが何個あるのか気にしない
カプセル化:メンバ変数が何個あるのか気にしない

「obj.fooとobj.barは絶対にアクセスするなよ」と言われると逆に気になってしまう
0931デフォルトの名無しさん2012/05/25(金) 14:12:53.84
OOPのカプセル化も公開するシンボルの制限にすぎんだろ

副作用を制限するって言ってるけど、OOPでカプセル化すれば
同じメソッド呼び出しが常に同じ結果を返すようになるんか?
ならないなら副作用の何を制限してるんだ?
0932デフォルトの名無しさん2012/05/25(金) 15:16:47.49
>>901をSmalltalkに逆翻訳してみた。もちろん厳密にはいろいろと違うけどまあ勘弁して。
>>782や>>799と見比べて、関数型でMultiSet(Bag)が使えてもぜんぜん嬉しくないのはよく分かった。

| M N cards bag replicate randoms |
M := 1000.
N := 10.
cards := 1 to: N.
replicate := [:n :x | Array new: n withAll: x].
randoms := [:g | (g next: N*10) * 2147483647 truncated].
bag := (replicate value: M value: Random new) inject: Bag new into: [:b :g |
   b add: (((randoms value: g) inject: {Bag new} into: [:xs :n |
         xs, {xs last copy add: n \\ N + 1; yourself}])
      detect: [:xs | xs includesAllOf: cards]) size; yourself].
^{bag min. bag max. bag sortedCounts first} "=> {12 . 85 . 56->23} "
0933デフォルトの名無しさん2012/05/25(金) 21:14:49.94
>>932
HaskellのMultiSetはimmutableだから、SmalltalkのBagとはその点で違うよ

immutableなコレクションに値を次々突っ込んでいく場合、
foldl等使って次々に新しいコレクションを生成する必要があるけど、
mutableなデータ構造で同じことやっても無意味に遅いだけだし

だからSmalltalkで真似したときに意味を見出せないのは当然だと思う
0934デフォルトの名無しさん2012/05/25(金) 21:22:35.75
immutableなデータ構造や副作用の隔離による
ミス防止の恩恵は、うっかりなプログラマには嬉しいものだが
全く必要としないプログラマも居るんだよな

SmalltalkerにはHaskellのメリットなんて拘束具にしか見えんのかもしれんね
0935デフォルトの名無しさん2012/05/25(金) 22:02:29.67
>>931
副作用をもたらす経路を制限出来る、というのは副作用を許す言語にとってかなり大きいことだよ
0936デフォルトの名無しさん2012/05/26(土) 00:09:31.75
>>934
つまり、マルチセットをイミュータブルにして、その状態は
リストや再帰コンテキストに封じ込めて破壊的操作の代替にするのは
ミス防止のためっていう理解であってます?
具体的にはどんなミスが想定されて、イミュータブルにすることで
どうしてそれが防げるのか教えてもらえますか?
0937デフォルトの名無しさん2012/05/26(土) 00:41:19.76
>>936
同じ値が複数箇所から参照されてるケースを考えれば分かるよ。
0938デフォルトの名無しさん2012/05/26(土) 01:14:49.41
そういや>>932ってどのくらいの実行速度だったの?
次世代高速CogVM(笑)だから速いんだよね?
0939デフォルトの名無しさん2012/05/26(土) 09:47:01.25
暫定ダイナブック環境ww
老害しか使わないOSもどきの玩具www
0940デフォルトの名無しさん2012/05/26(土) 10:21:30.92
レッテル貼りしかできない馬鹿wwwwwwww
0941デフォルトの名無しさん2012/05/26(土) 16:49:39.04
オブジェクト指向言語って今でもあるのか。
0942デフォルトの名無しさん2012/05/26(土) 18:02:27.90
>>941
お前が何の言語を知っているのか
すごく不安になるwwww
0943デフォルトの名無しさん2012/05/27(日) 17:36:36.53
自分で作った訳でもない言語をドネーションも無しで手に入れて、他の言語ファンを叩くのに使うのが楽しい人って何時の世でも居るんだな。

訂正:本当に使ってるかは判らんか。
0944デフォルトの名無しさん2012/05/27(日) 17:56:22.96
ドネーションの意味がわからない。
どないしよん。

>>943
笑うところだよ。
0945デフォルトの名無しさん2012/05/27(日) 17:59:29.34
HaskellやSmalltalk使ってる人達は
JavaやC#使ってる人達をドカタ呼ばわりして
見下してるから好感が持てる
0946デフォルトの名無しさん2012/05/27(日) 18:06:23.19
>>945
最後の行で不覚にも
09479442012/05/27(日) 18:26:08.71
・・・
09489412012/05/27(日) 19:55:08.90
>>942
Smalltalkっていう言語があったのは知ってるけど。あの言語の
ような徹してオブジェクト指向という言語はあるのかい?
0949デフォルトの名無しさん2012/05/27(日) 20:01:34.46
値打ちのわからない者には何の役にもたたないということ。
0950デフォルトの名無しさん2012/05/27(日) 20:24:44.13
>>948
> ような徹してオブジェクト指向という言語はあるのかい?

中置演算子っぽく見せかけて実は他のメッセージと同じ扱いなので
2 + 3 * 4 => 20 になるような言語ってこと?
0951デフォルトの名無しさん2012/05/28(月) 08:52:12.04
Rubyをdisろうとして失敗してる?
0952デフォルトの名無しさん2012/05/28(月) 19:40:32.58
お題:
整数型を引数に取る、次の性質を満たす関数fを定義せよ。

f(f(x)) = -x

OOPLで解く場合は x.f.f = -x でも良い。
0953デフォルトの名無しさん2012/05/28(月) 20:02:24.48
def f(x):
 return complex(0, x)
0954デフォルトの名無しさん2012/05/28(月) 20:31:07.66
>>953
二回目の関数適用でfの引数が複素数になるぞ。
0955 ◆QZaw55cn4c 2012/05/28(月) 20:43:18.80
場合わけはOK?
f(x) = -x (x >= 0)
f(x) = +x (x <= 0)
0956デフォルトの名無しさん2012/05/28(月) 20:46:51.86
operator=だかoperator==だかを置き換えればいいのだな!
0957 ◆QZaw55cn4c 2012/05/28(月) 20:50:52.15
>>955
ごめん。これ x < 0 のときf(f(x)) = x だった。
降参だ。
0958デフォルトの名無しさん2012/05/28(月) 20:58:11.75
>>957
何か問題でも?
0959デフォルトの名無しさん2012/05/28(月) 21:38:52.33
>>958
御題の条件が自然数なら問題ないけど、整数だからね
0960デフォルトの名無しさん2012/05/28(月) 21:41:12.33
f(f(x)) = -x
なので
f(f( f(f(x)) )) = x

引数が整数型なので戻り値も整数型
オブジェクトもタプルも複素数も使えない

分かんね
0961デフォルトの名無しさん2012/05/28(月) 21:58:10.67
こんな感じかな。

f 0 = 0
f k | k > 0 = if odd k then k+1 else 1-k
f k = - f (-k)
0962デフォルトの名無しさん2012/05/28(月) 21:59:05.84
>>952
たぶんこういうのを求めてはいないのだろうけど、Squeak Smalltalk で。

Integer >> f
   | selectors |
   selectors := #(negated yourself).
   thisContext method literals first swap: 1 with: 2.
   ^self perform: selectors first

1 f f "=> -1 "
2 f f "=> -2 "
3 f f "=> -3 "
0963デフォルトの名無しさん2012/05/28(月) 22:02:39.76
あ、いかん。負数の実行例を忘れた。

-1 f f "=> 1 "
-2 f f "=> 2 "
-3 f f "=> 3 "
0964デフォルトの名無しさん2012/05/28(月) 22:15:18.79
>961が正攻法なんだろうけど、>962も面白いな。
0965デフォルトの名無しさん2012/05/28(月) 22:18:46.71
>>961と基本的に一緒だけど

f x = (-1) ^ abs x * x - signum x


> map (f . f) [-5..5]
[5,4,3,2,1,0,-1,-2,-3,-4,-5]
レス数が950を超えています。1000を超えると書き込みができなくなります。