【激突】関数型言語 VS オブジェクト指向言語2
■ このスレッドは過去ログ倉庫に格納されています
0001営利利用に関するLR審議中@詳細は自治スレへ
2012/04/07(土) 21:26:47.61一部には関数型言語を崇拝している人もいます
どちらが上なのか、この際はっきりさせましょう
前スレ http://toro.2ch.net/test/read.cgi/tech/1331328955/
0773デフォルトの名無しさん
2012/05/13(日) 21:06:51.99てっきり拡張メソッド的なものを要求してるのかと思ってた。
Scalaなら暗黙型変換あるからできそうな気がする。
0774デフォルトの名無しさん
2012/05/13(日) 21:08:02.77なるほど。Scalaですか、調べてみます。
0775デフォルトの名無しさん
2012/05/13(日) 22:46:41.690776デフォルトの名無しさん
2012/05/14(月) 00:37:38.04可読性皆無のコード書く御題で
型付けの弱さを競うスレはここですか?
時代に逆行してて笑えるwww
0777デフォルトの名無しさん
2012/05/14(月) 01:46:05.41何か前提がおかしいんだろうね。
元々何がしたかったのか聞ければよいんだけど、
彼にそういった振る舞いが出来るとも思えないしなぁ。
0778デフォルトの名無しさん
2012/05/14(月) 07:07:11.76オブジェクトとしてなら「出来ている」認定してるっぽい処だな。
0779デフォルトの名無しさん
2012/05/14(月) 07:40:52.01別に不思議でもなんでもない
もちろん出題者は底なしのアホだけど
0780デフォルトの名無しさん
2012/05/14(月) 17:54:42.36等確率N種類のカードをコンプするのに必要なガチャ回数のM回試行時の頻度分布から、
最小および最大のガチャ回数と最多頻度のガチャ回数を抽出して出力するコードを書き、
N=10、M=1000000のときの結果とその算出にかかった時間を示せ。
遅い処理系ではMを減らした際の結果を示しても構わないがその旨を明記すること。
0781デフォルトの名無しさん
2012/05/14(月) 18:47:07.65関数型 VS 手続き型 って感じになりそう
0782デフォルトの名無しさん
2012/05/14(月) 19:41:29.94最低 10ガチャ、最高 156ガチャ、頻度最多は 23ガチャで 45475回出現。
1.8GHz Core i7 で 66秒程度。(CogVM 使用)
| N M histo cards time |
N := 10.
M := 1000000.
histo := Bag new.
cards := 1 to: N.
time := [
M timesRepeat: [
| player |
player := Bag new.
[player add: cards atRandom; includesAllOf: cards] whileFalse.
histo add: player size]
] timeToRun.
^{time. histo min. histo max. histo sortedCounts first} "=> {66128 . 10 . 156 . 45475->23} "
0783デフォルトの名無しさん
2012/05/14(月) 19:54:50.29これで、できてると言ってる訳ではなくて、
数値を関数化してラムダ演算をするのが目的であって
オブジェクトで雰囲気が近いことできても仕方ない
という事を書いたつもりです。
最終的な目標は>>759の様な(欲を言えばチャーチ数)演算が
できる言語を見つける事です。
>>775
よく知らないので、調べてる最中ですよ。
0784デフォルトの名無しさん
2012/05/14(月) 20:17:53.30型無しラムダな処理系なら、学生演習レベルのものならいくらでもあるだろ。
0785デフォルトの名無しさん
2012/05/14(月) 21:01:05.790786デフォルトの名無しさん
2012/05/14(月) 21:07:37.59存在すればどちらでも構いません。
ただし誤解されてるかもしれませんが、
チャーチ数というのは、f x.x を直に表現できて
欲しいと思ってる訳ではなく。0なら f x.xと同じ振る舞いを
して欲しいという話で、今までの話とは大きく違いません。
チャーチ数と今までの話は、2以上の時、1回関数が評価されるのか、
2回評価されるのか程度の違いの意味で書いてます。
0787デフォルトの名無しさん
2012/05/14(月) 21:14:35.72×2回評価されるのか
○その数だけ評価されるのか
0788デフォルトの名無しさん
2012/05/14(月) 21:50:45.36再起でよいんじゃないの?
0789デフォルトの名無しさん
2012/05/14(月) 22:49:56.49型なしラムダ計算でやりたいことがかける?
もしそうならLazy Kやunlambdaを使えばできるな。
0790デフォルトの名無しさん
2012/05/15(火) 00:51:10.23関数名が数値型だったら特別扱いすりゃいいだけだろ
0791デフォルトの名無しさん
2012/05/15(火) 08:00:22.83変数名が値だったらって何か変だぞ
変数は単に置き換えるのが目的であって
置き換えた後にどのような演算が出来るかというと、確かに何でも出来ると思う
しかしLispは要らない
0792デフォルトの名無しさん
2012/05/15(火) 10:10:16.800793デフォルトの名無しさん
2012/05/15(火) 10:31:41.96変数zを(\ f x -> x)に置き換えることはできる
なら定数を使わない言語を考えるのが普通で
定数の定義を書きかえるのは変だ
0794デフォルトの名無しさん
2012/05/15(火) 14:05:34.62いずれにしろ、リテラルの意味を再定義できる言語、というのは珍しいが、無いわけじゃない。
Forthなんかモード切り替えで、"100" というワードが 10 進にも 16 進にも解釈される、
っていう仕様だったと思ったし。
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を評価する
こう言ってるから、処理系の持ってる整数型はそのまま使いたいんだろうと思う。
その上で、整数値を関数としても定義したいと。
良く分からないのは、整数値を関数で定義せず、
引数で渡せばよさそうなものなのに、なぜそうしないかだな。
0796795
2012/05/15(火) 16:41:00.21単純に整数をfunctorにしたいんだろう。
分からないのは、普通ならパラメータで渡せば直ぐ済むのに、
なぜそうしないかだとおもう。
その辺の説明が何も無いから、誰も答えられないんだと思う。
0797デフォルトの名無しさん
2012/05/15(火) 18:43:21.09http://ideone.com/0LiFz
0798デフォルトの名無しさん
2012/05/15(火) 18:49:15.951.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
0799798
2012/05/15(火) 18:50:05.32main = 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.35R
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.41JavaScriptで多分ベタな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コードそのものよりもNode.jsがspidermonkeyより
44倍も速いのが興味深い
0803デフォルトの名無しさん
2012/05/15(火) 23:30:56.130804デフォルトの名無しさん
2012/05/15(火) 23:32:18.16各処理系の乱数の質の差が反映されているのか。
0805デフォルトの名無しさん
2012/05/15(火) 23:52:23.55さすがに速い
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しかも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せめてこういうスレのトイプログラムの御題でくらいは
存在感を出さないとね。
0810デフォルトの名無しさん
2012/05/17(木) 16:53:53.950811デフォルトの名無しさん
2012/05/17(木) 19:18:25.65Intに限らず任意の型で同じことが言えるのでチャーチ数は関係ない
0812デフォルトの名無しさん
2012/05/17(木) 19:53:36.50加算や減算ができるなら
チャーチ数で無くても文句無いんだろう、多分
ただし>>797のプログラムはチャーチ数でないと
加算減算が出来ないから成立しない
0813デフォルトの名無しさん
2012/05/17(木) 20:37:57.990814デフォルトの名無しさん
2012/05/18(金) 00:44:10.29静的言語は一貫していない
0815デフォルトの名無しさん
2012/05/18(金) 01:54:17.00それぞれで代表一つ以外は全て潰し
最後に決定戦とすべき
0816デフォルトの名無しさん
2012/05/18(金) 07:15:42.96スレが幾つ在っても足りんだろ
0817デフォルトの名無しさん
2012/05/18(金) 07:52:12.43評判の良いやつだけで潰しあえ
0818デフォルトの名無しさん
2012/05/18(金) 07:55:27.260819デフォルトの名無しさん
2012/05/18(金) 08:10:51.950820デフォルトの名無しさん
2012/05/18(金) 21:20:26.37判定する関数を書くのに苦労してた。
短く書けるとウワサのScalaですらそのレベルなんて、
静的型付け言語はダメダメだなぁ。
0821デフォルトの名無しさん
2012/05/18(金) 21:56:20.82def 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.960823デフォルトの名無しさん
2012/05/18(金) 22:38:39.58def 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.030825デフォルトの名無しさん
2012/05/18(金) 22:52:26.14二分探索を使う前とかに調べるじゃん
0826デフォルトの名無しさん
2012/05/18(金) 22:53:00.87それなら十分許容範囲だね。
0827デフォルトの名無しさん
2012/05/18(金) 22:55:38.83引数と返り値の型は推論してくれないんだっけ?
0828デフォルトの名無しさん
2012/05/18(金) 22:56:20.290829デフォルトの名無しさん
2012/05/18(金) 23:33:06.68ソートしとけよ
してないなら、まずソートしろ
0830デフォルトの名無しさん
2012/05/18(金) 23:37:28.63同じ計算量だと思ってる男の人って...
0831デフォルトの名無しさん
2012/05/18(金) 23:57:52.40静的型チェックのメリットと釣り合わない
0832デフォルトの名無しさん
2012/05/19(土) 00:44:54.270833デフォルトの名無しさん
2012/05/19(土) 01:06:57.97釣り合う物を取り返そうとしたら保険の意味がなくなる
0834デフォルトの名無しさん
2012/05/19(土) 01:10:31.94ソートされてるかどうかわからない
なんてことになる設計がダメだしされてるんだろ
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.880837デフォルトの名無しさん
2012/05/19(土) 04:29:01.17SequenceableCollection >> 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コードの長さはあまり関係なくないか?
考えた処理をサクサクとコード化できるか、だと思う
0840デフォルトの名無しさん
2012/05/19(土) 10:06:00.60>>833
保険というか、コンパイラに一部の整合性のチェックを任せられるので
作業量増加と引き換えに、開発者が気を使う要素が減る
トレードオフで負担を変化させる
[作業量が減る][気を使う要素が減る]どちらの開発効率が良いかは
ケースバイケースだと思うが
0841デフォルトの名無しさん
2012/05/19(土) 10:58:17.400842デフォルトの名無しさん
2012/05/19(土) 15:29:10.77もしかしてHaskellについて言ってるなら、遅延評価だから途中で止まる
無限リストで試せば分かる
Prelude> isSorted [1,0..]
False
0843デフォルトの名無しさん
2012/05/20(日) 09:55:31.76もしかしてSmalltalkについて言ってるなら、どうせ遅過ぎてウンコだから
そんなところ気にしても仕方ない
メッセージング(笑)
0844デフォルトの名無しさん
2012/05/20(日) 13:40:56.75Smalltalkerかアラン・ケイになんか嫌なことでもされたか?
0845デフォルトの名無しさん
2012/05/20(日) 13:47:01.48なんで使うことってあまりないんだろうね。
0846デフォルトの名無しさん
2012/05/20(日) 14:11:04.260847デフォルトの名無しさん
2012/05/20(日) 14:15:09.70「N種類のカードをアトランダムにコンプするまで引く作業をM回繰り返して集計」
ってただそれだけのことをSmalltalkみたいにそのまんまに書き下すことも可能なのかな。
HaskellにもMultiSet(SmalltalkでいうところのBag)とかあるよね?
0848デフォルトの名無しさん
2012/05/20(日) 14:18:36.97内部で勝手に遅延評価してるってだけだから
そんな言語の話をしたってしょうがない。
遅延評価をしたい場面が無いって話をしてる。
0849デフォルトの名無しさん
2012/05/20(日) 14:34:00.38あ?政府から海運業、通信、保険、金融、音響。
お前がしらんだけで実際いろんな所で使われとるわ。
英語が読めん奴が覆いから日本人の開発者が少ないだけ。
0850デフォルトの名無しさん
2012/05/20(日) 14:34:50.90こういうイデオムはgetterのあるオブジェクト指向プログラミングだとよくある。
getterがないと値参照から関数呼び出しを引き起こせないので、
単に関数呼び出しをすることになってしまう。
ただしそのような場合でも遅延評価イデオムと呼ぶ場合もある。
例えば上に出たamotized sortは挿入時にやるべき並び替えを最後までやらずに、
細かい部分はサボって後回しにして、後でまとめてやっている。
こういうのは遅延実行の一種。
0851デフォルトの名無しさん
2012/05/20(日) 14:42:50.92Smalltalkという実行環境が現存してると思ってんだろ
うんで「Smalltalkでググっても見つからないよー」とw
Linuxと同じように純粋なSmalltalkは存在しないのにな。
0852デフォルトの名無しさん
2012/05/20(日) 14:45:54.09よしわかった。
具体t系な実行環境を言ってくれ。
それに対して、使われているかいないか
判断することにしよう。
0853デフォルトの名無しさん
2012/05/20(日) 14:52:32.76Visual Works.
VA Smalltalk.
Squeak.
Pharo.
GNU Smalltalk.
0854デフォルトの名無しさん
2012/05/20(日) 14:56:00.00VisualAgeは、各種言語の統合開発環境でもあり
Smalltalkの実行環境なんだよな。
emacsのlispをSmalltalkに置きかえたと考えればわかりやすい。
0855デフォルトの名無しさん
2012/05/20(日) 15:01:44.14よし、じゃあ次にどれくらい使われてるか
公平に判断するために、どこかが発表した
ラインキングを見てみるとしよう。
何か希望はあるかね?
ないならこちらで適当なランキングを
もってくるが、それだと不満だろう?
0856デフォルトの名無しさん
2012/05/20(日) 15:08:03.81なんで回答者に左右されるランキングが必要なんだ?
製品のダウンロード件数でも調べてくりゃいいじゃねぇか。
0857デフォルトの名無しさん
2012/05/20(日) 15:08:38.060858デフォルトの名無しさん
2012/05/20(日) 15:16:04.37物流や医療じゃ高確率で見かけるからな
その癖ググっても資料がでてこないから苦労する
あとCOBOLもまずランキングにのる事はないが
未だに金融じゃ必ずと言っていいほど見かける
ネットで見かける需要が現実の需要と
一致してるとは限らんよ(COBOLはみんな
嫌々使ってんだろうけど)
0859デフォルトの名無しさん
2012/05/20(日) 15:18:14.23> なんで回答者に左右されるランキングが必要なんだ?
個人の意見じゃ、回答者(個人)に
左右されるからじゃないかw
同じ回答者でも、たくさんの意見を聞いたほうが良い。
回答者(多数)の方が信頼性が高いって言ってるんだよ。
0860デフォルトの名無しさん
2012/05/20(日) 15:28:53.00個人じゃなく販売数とか、ダウンロード数とか
確実な値で調べろと言ってるんだが
マスコミがキムチピザをランキングの1位にしてたからって信じるのか?
まともな思考なら販売店の商品別売上実績を調べるだろ。
0861デフォルトの名無しさん
2012/05/20(日) 15:35:06.94>回答者(多数)の方が信頼性が高い
理論的にはね。現実にはそううまくは実情は反映されない。
だからTIOBEを人気ランキングと勘違いする情弱が量産されてるんだと気づけよ。
0862デフォルトの名無しさん
2012/05/20(日) 15:38:32.51関数型言語のドマイナーさ加減が情弱にも理解できて少しはおとなしくなるだろう。
0863デフォルトの名無しさん
2012/05/20(日) 15:43:00.810864デフォルトの名無しさん
2012/05/20(日) 15:47:26.30Win専用だけどDolphin Smalltalkというすばらしい処理系も忘れないでいてください。
イルカと言えば名古屋のSmalltalk勉強会はAmber押しだよね。
http://dynagoya.info/index.html
京都はVisualWorks、東京はSqueak/Pharo系か。
0865デフォルトの名無しさん
2012/05/20(日) 15:53:17.14すまんすまん
0866デフォルトの名無しさん
2012/05/20(日) 15:55:15.81その時点でどうでも良くない?
豆粒みたいな普及率をどうのこうの言ったって仕方ないし、
どうせ、数字の見方の問題に話がそれるだけでしょう。
それより、関数型言語のスレらしく、、
関数型言語の優れている点でも語り合ったら?
手続き型言語には副作用を簡単に表現できる利点があるから、
それを上回るメリットが関数型言語に無いことにはねぇ。
手続き型言語でも、副作用を禁止して書いていくことは出来るし、
その場合は副作用が無いからとても安全に記述できるわけだけど、
それと比べて関数型言語に一体どれだけのメリットがあるのか。
特に最近は遅延評価をサポートしている手続き型言語もあるし。
0867デフォルトの名無しさん
2012/05/20(日) 15:55:37.97えるしってるか どるふぃんはまっくでもうごくw
http://www.youtube.com/watch?v=Te4Cx0Mz1Gw
0868デフォルトの名無しさん
2012/05/20(日) 15:58:39.62普及率自体はどうでも良くて社会基盤の一部として実働してることが重要。
そもそも玩具だの言い出したから始まった話だし。
0869デフォルトの名無しさん
2012/05/20(日) 16:02:56.95普及しているとは全然言えないからAdaは
おもちゃだと言ってるのに似てるね
0870デフォルトの名無しさん
2012/05/20(日) 17:16:45.10https://twitter.com/#!/hajimehoshi/status/204083496610832385
0871デフォルトの名無しさん
2012/05/20(日) 19:22:30.25> 個人じゃなく販売数とか、ダウンロード数とか
> 確実な値で調べろと言ってるんだが
公表されてないから調べようがない。
0872デフォルトの名無しさん
2012/05/20(日) 19:27:28.72そんなのが何でブログラムスレに居るのかは謎だが。
0873デフォルトの名無しさん
2012/05/20(日) 19:30:44.25実際、使われてないんだろ?
■ このスレッドは過去ログ倉庫に格納されています