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

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

■ このスレッドは過去ログ倉庫に格納されています
0001営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 21:26:47.61
一般的には、オブジェクト指向型言語が優勢でが
一部には関数型言語を崇拝している人もいます

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

前スレ http://toro.2ch.net/test/read.cgi/tech/1331328955/
0795デフォルトの名無しさん2012/05/15(火) 16:30:18.62
>むちゃくちゃになっていたので直します。何度もすいません。
>( 0 (lambda () "true" ) ) 0関数はlambdaを評価せず、nilを返す
>( 1 (lambda () "true" ) ) 1関数はlambdaを評価し"true"を返す
>( 2 (lambda () "true" ) ) 2関数はlambdaを評価し"true"を返す

>( (- 1 1 ) (lambda () "true" ) ) 0関数を評価する事になるのでlambdaを評価しない
>( (+ 1 1 ) (lambda () "true" ) ) 2関数を評価する事になるのでlambdaを評価する

こう言ってるから、処理系の持ってる整数型はそのまま使いたいんだろうと思う。
その上で、整数値を関数としても定義したいと。
良く分からないのは、整数値を関数で定義せず、
引数で渡せばよさそうなものなのに、なぜそうしないかだな。
07967952012/05/15(火) 16:41:00.21
あー、だから、整数の無い処理系もNGだろうし、
単純に整数をfunctorにしたいんだろう。
分からないのは、普通ならパラメータで渡せば直ぐ済むのに、
なぜそうしないかだとおもう。
その辺の説明が何も無いから、誰も答えられないんだと思う。
0797デフォルトの名無しさん2012/05/15(火) 18:43:21.09
チャーチ数でも良いらしいので、Haskellでチャレンジ

http://ideone.com/0LiFz
0798デフォルトの名無しさん2012/05/15(火) 18:49:15.95
ついでに>>780
1.6GHz Core i5 で 3.5秒 (GHC 7.0.4)
最小10, 最大162, 最多頻度23(45003回)

import Control.Applicative
import Data.Ord
import Data.List
import Data.HashTable as H
import System.Random.Mersenne

cardNum = 10
iterateNum = 1000000

count n = (+ n) . sum . map (length . f) . zip [1..n-1]
  where f (x,p) = let q = fromIntegral x / fromIntegral n
                  in takeWhile (< p) $ iterate (\x -> x + (1-x) * q) q
07997982012/05/15(火) 18:50:05.32
続き

main = do
  ht <- new (==) hashInt :: IO (HashTable Int Int)
  gen <- newMTGen Nothing
  mapM_ (trial ht gen) [1..iterateNum]
  xs <- sort <$> H.toList ht
  print $ (fst $ head xs, fst $ last xs, maximumBy (comparing snd) xs)
  where
    trial ht gen _ = do n <- count cardNum <$> (randoms gen :: IO [Double])
                        incr ht n =<< H.lookup ht n
    incr ht k Nothing = H.insert ht k 1
    incr ht k (Just v) = H.update ht k (v + 1) >> return ()
0800デフォルトの名無しさん2012/05/15(火) 20:22:09.35
>>780
R
N = 10
M = 100000 (!= 1000000)
Intel(R) Atom(TM) CPU N455 @ 1.66GHzで、
user system elapsed
180.467 0.084 180.719
最小 10、最大 130、最頻値は4548回の23。

gacha <- function(N, M) {
  print(system.time(t <- table(sapply(1:M, function(x) {
    count <- 0
    card <- logical(length=N)
    while(!all(card)) {
      count <- count + 1
      card[sample(N, size=1)] <- T
    }
    count
  }))))
  print(t[1])
  print(t[length(t)])
  print(t[which.max(t)])
}
0801デフォルトの名無しさん2012/05/15(火) 23:05:25.41
>>780
JavaScriptで多分ベタなOOP
Core2Duo(3.16GHz) Node.js(Windows)で
試行回数=1000000 所要時間=1398msec 最小=10 最大=144 平均=29 最頻=23(44951回)

ソース(※こっちは10000回)
http://ideone.com/DkeKE
0802デフォルトの名無しさん2012/05/15(火) 23:14:59.88
>>801
コードそのものよりもNode.jsがspidermonkeyより
44倍も速いのが興味深い
0803デフォルトの名無しさん2012/05/15(火) 23:30:56.13
Node.jsの中身のV8はJIT持ってるので
0804デフォルトの名無しさん2012/05/15(火) 23:32:18.16
1000000回も試行してるのに各人の最大値がおおきくばらついてるのが気になる。
各処理系の乱数の質の差が反映されているのか。
0805デフォルトの名無しさん2012/05/15(火) 23:52:23.55
何度も気軽に試せるようにCで書いてみた
さすがに速い

http://ideone.com/WPpbW

同じプログラムでも試行ごとに最大値はばらつくみたいね
0806デフォルトの名無しさん2012/05/16(水) 00:08:03.51
書き捨てなのは分かるけど、
せめて void gacha(int n, int m, RESULT *r); くらいにロジック分離しようぜ。
0807デフォルトの名無しさん2012/05/16(水) 12:23:32.14
>>803
しかもx86,x64,ARMに特化されたかなり先進的なJITだしね。
0808デフォルトの名無しさん2012/05/16(水) 13:57:24.59
ところで、数値を関数にしたいと言ってた彼は
結局Scalaで望みのことが出来たの?

それとも、実はSmalltalk辺りのOOPLで
やりたいことは既に出来てて、あとは
「関数型言語で出来ないことがOOPLで出来る!OOPサイコー!!」
って言い出すタイミングをはかってるの?
0809デフォルトの名無しさん2012/05/17(木) 16:49:24.16
Smalltalkは実社会で何の価値もないので
せめてこういうスレのトイプログラムの御題でくらいは
存在感を出さないとね。
0810デフォルトの名無しさん2012/05/17(木) 16:53:53.95
既に引退の身ですが、現役の時はすごかったんですよ(棒読み
0811デフォルトの名無しさん2012/05/17(木) 19:18:25.65
Intは関数ではないけど forall a. ((Int -> a) -> a) は関数だよ
Intに限らず任意の型で同じことが言えるのでチャーチ数は関係ない
0812デフォルトの名無しさん2012/05/17(木) 19:53:36.50
関数を数リテラルとして表現できて
加算や減算ができるなら
チャーチ数で無くても文句無いんだろう、多分

ただし>>797のプログラムはチャーチ数でないと
加算減算が出来ないから成立しない
0813デフォルトの名無しさん2012/05/17(木) 20:37:57.99
静的言語 VS 動的言語スレとかないの?
0814デフォルトの名無しさん2012/05/18(金) 00:44:10.29
まずJavaかHaskellのどちらかを潰さないと
静的言語は一貫していない
0815デフォルトの名無しさん2012/05/18(金) 01:54:17.00
関数型言語も一貫してないから
それぞれで代表一つ以外は全て潰し
最後に決定戦とすべき
0816デフォルトの名無しさん2012/05/18(金) 07:15:42.96
クラスベースOOとプロトタイプOOの潰し合いとか
スレが幾つ在っても足りんだろ
0817デフォルトの名無しさん2012/05/18(金) 07:52:12.43
プロトタイプとか無視していいぞ
評判の良いやつだけで潰しあえ
0818デフォルトの名無しさん2012/05/18(金) 07:55:27.26
Javascript「えっ」
0819デフォルトの名無しさん2012/05/18(金) 08:10:51.95
動的言語の代表はLLバトルロワイヤルスレの勝者ですか?
0820デフォルトの名無しさん2012/05/18(金) 21:20:26.37
Scalaスレ見てたんだけど、リストがソート済みかどうか
判定する関数を書くのに苦労してた。
短く書けるとウワサのScalaですらそのレベルなんて、
静的型付け言語はダメダメだなぁ。
0821デフォルトの名無しさん2012/05/18(金) 21:56:20.82
scalaで書くとこんな感じかな。

def sorted[T:Ordering](xs:List[T]) : Boolean =
 xs match { case x::y::zs => implicitly[Ordering[T]].lt(x, y) && sorted(y::zs); case _ => true }

型指定は面倒だね。
暗黙の型変換を定義すればもう少し簡潔になるかも。
0822デフォルトの名無しさん2012/05/18(金) 22:32:39.96
おお、想像以上に型注釈がうざいw
0823デフォルトの名無しさん2012/05/18(金) 22:38:39.58
関数プログラミング的に、比較演算子を引数で受け取るようにすると少しましかも。

def sorted[T](xs:List[T], f:(T,T)=>Int) : Boolean =
 xs match { case x::y::zs => f(x, y) >= 0 && sorted(y::zs); case _ => true }
0824デフォルトの名無しさん2012/05/18(金) 22:44:02.03
ソート済か?なんて調べる発想が変だろ
0825デフォルトの名無しさん2012/05/18(金) 22:52:26.14
そんなこと無いだろ
二分探索を使う前とかに調べるじゃん
0826デフォルトの名無しさん2012/05/18(金) 22:53:00.87
>>823
それなら十分許容範囲だね。
0827デフォルトの名無しさん2012/05/18(金) 22:55:38.83
ていうかscalaって型推論って
引数と返り値の型は推論してくれないんだっけ?
0828デフォルトの名無しさん2012/05/18(金) 22:56:20.29
つ amortized sortでcheck inする必要がある時にtestしながらinsert sort
0829デフォルトの名無しさん2012/05/18(金) 23:33:06.68
>>825
ソートしとけよ
してないなら、まずソートしろ
0830デフォルトの名無しさん2012/05/18(金) 23:37:28.63
実際にソートするのとソート済みか確認するのが
同じ計算量だと思ってる男の人って...
0831デフォルトの名無しさん2012/05/18(金) 23:57:52.40
動的言語は静的言語より3〜5倍くらい短く書けないと
静的型チェックのメリットと釣り合わない
0832デフォルトの名無しさん2012/05/19(土) 00:44:54.27
でもあまりに短いと、それはそれで暗号になっちゃうんだよ。
0833デフォルトの名無しさん2012/05/19(土) 01:06:57.97
チェックは保険だろ
釣り合う物を取り返そうとしたら保険の意味がなくなる
0834デフォルトの名無しさん2012/05/19(土) 01:10:31.94
>>830
ソートされてるかどうかわからない
なんてことになる設計がダメだしされてるんだろ
0835デフォルトの名無しさん2012/05/19(土) 01:27:57.13
はいはい
オブジェクト指向で静的型のJavaですよー

public static<T extends Comparable<? super T>> boolean sorted(List<T> xs) {
for (int i = 1; i < xs.size(); i++) {
if (xs.get(i-1).compareTo(xs.get(i)) > 0) return false;
}
return true;
}
0836デフォルトの名無しさん2012/05/19(土) 03:31:46.88
isSorted xs = and $ zipWith (<=) xs $ drop 1 xs
0837デフォルトの名無しさん2012/05/19(土) 04:29:01.17
"Squeak Smalltalk"

SequenceableCollection >> isSorted
   self overlappingPairsDo: [:a :b | a <= b ifFalse: [^false]]. ^true
0838デフォルトの名無しさん2012/05/19(土) 07:54:30.96
大小関係を満たさないのが途中で分かってもソコで計算終了せず
全ての隣り合う組を比較するようなダメコードを書くダメプログラマは
まさかこのスレには居ないよね?
0839デフォルトの名無しさん2012/05/19(土) 09:09:24.99
>>831
コードの長さはあまり関係なくないか?
考えた処理をサクサクとコード化できるか、だと思う
0840デフォルトの名無しさん2012/05/19(土) 10:06:00.60
重要なのは品質,保守性,開発効率だな

>>833
保険というか、コンパイラに一部の整合性のチェックを任せられるので
作業量増加と引き換えに、開発者が気を使う要素が減る
トレードオフで負担を変化させる

[作業量が減る][気を使う要素が減る]どちらの開発効率が良いかは
ケースバイケースだと思うが
0841デフォルトの名無しさん2012/05/19(土) 10:58:17.40
単位が一貫していない量を比較するのは難しいね
0842デフォルトの名無しさん2012/05/19(土) 15:29:10.77
>>838
もしかしてHaskellについて言ってるなら、遅延評価だから途中で止まる
無限リストで試せば分かる

Prelude> isSorted [1,0..]
False
0843デフォルトの名無しさん2012/05/20(日) 09:55:31.76
>>838
もしかしてSmalltalkについて言ってるなら、どうせ遅過ぎてウンコだから
そんなところ気にしても仕方ない

メッセージング(笑)
0844デフォルトの名無しさん2012/05/20(日) 13:40:56.75
^falseってあるとおり、Smalltalkのもふつうに止まる。
Smalltalkerかアラン・ケイになんか嫌なことでもされたか?
0845デフォルトの名無しさん2012/05/20(日) 13:47:01.48
遅延評価ってこんなにすごいのに
なんで使うことってあまりないんだろうね。
0846デフォルトの名無しさん2012/05/20(日) 14:11:04.26
Haskell使ってれば基本は全部遅延評価だけど?
0847デフォルトの名無しさん2012/05/20(日) 14:15:09.70
関数型言語でも、効率とか速度とか(必要なら汚らしさとか)を度外視すれば、mainで
「N種類のカードをアトランダムにコンプするまで引く作業をM回繰り返して集計」
ってただそれだけのことをSmalltalkみたいにそのまんまに書き下すことも可能なのかな。
HaskellにもMultiSet(SmalltalkでいうところのBag)とかあるよね?
0848デフォルトの名無しさん2012/05/20(日) 14:18:36.97
>>846
内部で勝手に遅延評価してるってだけだから
そんな言語の話をしたってしょうがない。

遅延評価をしたい場面が無いって話をしてる。
0849デフォルトの名無しさん2012/05/20(日) 14:34:00.38
>>809
あ?政府から海運業、通信、保険、金融、音響。
お前がしらんだけで実際いろんな所で使われとるわ。
英語が読めん奴が覆いから日本人の開発者が少ないだけ。
0850デフォルトの名無しさん2012/05/20(日) 14:34:50.90
値を参照しようとするとその値の計算が始まる、
こういうイデオムはgetterのあるオブジェクト指向プログラミングだとよくある。
getterがないと値参照から関数呼び出しを引き起こせないので、
単に関数呼び出しをすることになってしまう。
ただしそのような場合でも遅延評価イデオムと呼ぶ場合もある。
例えば上に出たamotized sortは挿入時にやるべき並び替えを最後までやらずに、
細かい部分はサボって後回しにして、後でまとめてやっている。
こういうのは遅延実行の一種。
0851デフォルトの名無しさん2012/05/20(日) 14:42:50.92
Smalltalkが現実で使われてないと言ってるヤツは、
Smalltalkという実行環境が現存してると思ってんだろ
うんで「Smalltalkでググっても見つからないよー」とw
Linuxと同じように純粋なSmalltalkは存在しないのにな。
0852デフォルトの名無しさん2012/05/20(日) 14:45:54.09
>>851
よしわかった。
具体t系な実行環境を言ってくれ。

それに対して、使われているかいないか
判断することにしよう。
0853デフォルトの名無しさん2012/05/20(日) 14:52:32.76
>>852
Visual Works.
VA Smalltalk.

Squeak.
Pharo.
GNU Smalltalk.
0854デフォルトの名無しさん2012/05/20(日) 14:56:00.00
VA Smalltalkの前身であり、Eclipseの前身でもある
VisualAgeは、各種言語の統合開発環境でもあり
Smalltalkの実行環境なんだよな。
emacsのlispをSmalltalkに置きかえたと考えればわかりやすい。
0855デフォルトの名無しさん2012/05/20(日) 15:01:44.14
>>853-854
よし、じゃあ次にどれくらい使われてるか
公平に判断するために、どこかが発表した
ラインキングを見てみるとしよう。

何か希望はあるかね?
ないならこちらで適当なランキングを
もってくるが、それだと不満だろう?
0856デフォルトの名無しさん2012/05/20(日) 15:08:03.81
>>855
なんで回答者に左右されるランキングが必要なんだ?
製品のダウンロード件数でも調べてくりゃいいじゃねぇか。
0857デフォルトの名無しさん2012/05/20(日) 15:08:38.06
あと販売数も。
0858デフォルトの名無しさん2012/05/20(日) 15:16:04.37
MUMPSとかランキングにまず上がらんけど
物流や医療じゃ高確率で見かけるからな
その癖ググっても資料がでてこないから苦労する

あとCOBOLもまずランキングにのる事はないが
未だに金融じゃ必ずと言っていいほど見かける

ネットで見かける需要が現実の需要と
一致してるとは限らんよ(COBOLはみんな
嫌々使ってんだろうけど)
0859デフォルトの名無しさん2012/05/20(日) 15:18:14.23
>>856
> なんで回答者に左右されるランキングが必要なんだ?

個人の意見じゃ、回答者(個人)に
左右されるからじゃないかw

同じ回答者でも、たくさんの意見を聞いたほうが良い。
回答者(多数)の方が信頼性が高いって言ってるんだよ。
0860デフォルトの名無しさん2012/05/20(日) 15:28:53.00
>>859
個人じゃなく販売数とか、ダウンロード数とか
確実な値で調べろと言ってるんだが
マスコミがキムチピザをランキングの1位にしてたからって信じるのか?
まともな思考なら販売店の商品別売上実績を調べるだろ。
0861デフォルトの名無しさん2012/05/20(日) 15:35:06.94
>>859
>回答者(多数)の方が信頼性が高い

理論的にはね。現実にはそううまくは実情は反映されない。
だからTIOBEを人気ランキングと勘違いする情弱が量産されてるんだと気づけよ。
0862デフォルトの名無しさん2012/05/20(日) 15:38:32.51
Haskellのダウンロード数とSqueakのダウンロード数を比べえみたら良いんじゃない?
関数型言語のドマイナーさ加減が情弱にも理解できて少しはおとなしくなるだろう。
0863デフォルトの名無しさん2012/05/20(日) 15:43:00.81
Haskell, Lisp, Smalltalk押しの俺はどうしたらいいんだ
0864デフォルトの名無しさん2012/05/20(日) 15:47:26.30
>>853
Win専用だけどDolphin Smalltalkというすばらしい処理系も忘れないでいてください。

イルカと言えば名古屋のSmalltalk勉強会はAmber押しだよね。
http://dynagoya.info/index.html

京都はVisualWorks、東京はSqueak/Pharo系か。
0865デフォルトの名無しさん2012/05/20(日) 15:53:17.14
linuxユーザーだから忘れてたわ
すまんすまん
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
恥ずかしいならメールでもいいぞ
■ このスレッドは過去ログ倉庫に格納されています