【激突】関数型言語 VS オブジェクト指向言語2
■ このスレッドは過去ログ倉庫に格納されています
0001営利利用に関するLR審議中@詳細は自治スレへ
2012/04/07(土) 21:26:47.61一部には関数型言語を崇拝している人もいます
どちらが上なのか、この際はっきりさせましょう
前スレ http://toro.2ch.net/test/read.cgi/tech/1331328955/
0584デフォルトの名無しさん
2012/04/29(日) 01:30:58.02本当に短いコードは動的型付け言語だけの特権じゃないことを
証明してしまったな。
0585デフォルトの名無しさん
2012/04/29(日) 02:11:32.74500x500 500世代で動的な >>579 が 112秒なのに、>>581 は 196秒。
0586デフォルトの名無しさん
2012/04/29(日) 02:18:22.73それ事前コンパイルしてないだろ?
0587デフォルトの名無しさん
2012/04/29(日) 02:35:44.97これって一回のlifeのコール後、
すべてのセルがアップデートを終えるのをどこで待ち合わせているの?
0588デフォルトの名無しさん
2012/04/29(日) 06:27:13.54そんなんで感動できるとか何時の時代の人?
OCaml : let msg = if true then "true" else "false"
Haskell : let msg = if True then "true" else "false"
0589デフォルトの名無しさん
2012/04/29(日) 06:30:26.820590デフォルトの名無しさん
2012/04/29(日) 07:52:20.17C++11 : auto msg = true ? "true dayo" : "false dayo";
C#(3.0) : var msg = true ? "true dayo" : "false dayo";
0591デフォルトの名無しさん
2012/04/29(日) 08:14:29.69メリットがなくなっていくね。
0592デフォルトの名無しさん
2012/04/29(日) 08:47:25.44…それでmsgの型を推論しろってか。
0593デフォルトの名無しさん
2012/04/29(日) 09:24:13.53この戦いが終わったら全ての武器のメリットがなくなるんだ
0594デフォルトの名無しさん
2012/04/29(日) 09:42:55.390595デフォルトの名無しさん
2012/04/29(日) 09:43:05.44スクリプト言語はこれからも残るよ
0596デフォルトの名無しさん
2012/04/29(日) 10:59:45.94変数trueに再代入できたりしないとあんま意味なくね?
いや違ってたらすまんが
0597デフォルトの名無しさん
2012/04/29(日) 11:11:11.60"true dayo"も"false dayo"も文字列リテラルなので
三項演算の条件のtrue/falseを問うことなくmsgの型を文字列と確定できる
0598デフォルトの名無しさん
2012/04/29(日) 11:27:23.87ああなんだそういうことか、勘違いしてたわ
0599デフォルトの名無しさん
2012/04/29(日) 11:55:08.69再代入できる言語はクソです。
0600デフォルトの名無しさん
2012/04/29(日) 12:10:48.87Scalaって事前(?)にコンパイルする以外になんか実行方法あったっけ?
0601デフォルトの名無しさん
2012/04/29(日) 12:18:53.17>>581はコンパイルしたらエラーがでます。
0602デフォルトの名無しさん
2012/04/29(日) 12:21:46.030603デフォルトの名無しさん
2012/04/29(日) 12:31:37.65-Xscript XXX オプションをつける必要があるかと
0604デフォルトの名無しさん
2012/04/29(日) 12:42:00.90$ time scala Lifegame.scala
0,1,1,0,0
0,1,0,1,0
0,0,0,0,0
0,0,0,0,0
0,0,1,0,0
scala Lifegame.scala 1.44s user 0.09s system 4% cpu 37.965 total
AMD MV-40 1.6GHz シングルコア
0605デフォルトの名無しさん
2012/04/29(日) 12:42:30.36それで、代入を禁止するのと共用体を禁止するのは、どっちが良いんですか
0606デフォルトの名無しさん
2012/04/29(日) 12:48:02.58time scala LifeGame.scala
0,1,1,0,0
0,1,0,1,0
0,0,0,0,0
0,0,0,0,0
0,0,1,0,0
real 0m1.819s
user 0m0.704s
sys 0m0.104s
コンパイル実行
time scala LifeGame
0,1,1,0,0
0,1,0,1,0
0,0,0,0,0
0,0,0,0,0
0,0,1,0,0
real 0m0.585s
user 0m0.528s
sys 0m0.072s
コンパイル時間の分、スクリプト実行だと起動に時間がかかるね
0607デフォルトの名無しさん
2012/04/29(日) 12:48:20.97両方いいです。
0608デフォルトの名無しさん
2012/04/29(日) 12:51:30.57よく見れ。
msgにtrueを代入してる。
0609デフォルトの名無しさん
2012/04/29(日) 12:53:31.56どのtrueを代入してるんですか?
全文を引用して、該当のtrueを【】でくくって下さい。
0610デフォルトの名無しさん
2012/04/29(日) 13:04:26.07コンパイル通らないのでAppにして通したんだけどこれでも遅いままなのかな?
object LifeCell extends App {
val board = Board(List(List(0,1,1,1,0),List(0,1,0,0,0),List(0,0,1,0,0),List(0,0,0,0,0),List(0,0,0,0,0)))
board.life
println(board)
val rand = new Random()
val b500 = Board(List.fill(500, 500){rand nextInt 2})
val s = new Date().getTime
for (i <- 1 to 500) b500.life
println(new Date().getTime - s)
}
>>603
あ、Scalaスクリプトなんてモードがあるんですね。
実行オプションでそんなに差が出るものなんですか?
0611デフォルトの名無しさん
2012/04/29(日) 13:31:36.87>>608
$ cat hello.cs
class Program {
public static void Main() {
var hoge = true ? "*true*" : "*false*";
System.Console.WriteLine(hoge); } }
$ mono hello.exe
*true*
0612デフォルトの名無しさん
2012/04/29(日) 13:56:15.31お前が良く見た方がいい
0613デフォルトの名無しさん
2012/04/29(日) 14:10:28.74式と文を区別しない言語も危険
0614デフォルトの名無しさん
2012/04/29(日) 14:12:28.08蛇の国からようこそおこしやす
0615デフォルトの名無しさん
2012/04/29(日) 14:22:29.080616デフォルトの名無しさん
2012/04/29(日) 19:36:04.130617デフォルトの名無しさん
2012/04/30(月) 00:25:42.19Lispの関数は
apply = foldl ($)
(((f x) y) z) == (apply f) [x, y, z]
省略ではなく、式を変形している
(x, y, zの型が異なる場合、Haskellは上の式が間違っていると主張する)
0618デフォルトの名無しさん
2012/04/30(月) 01:24:53.48core i5で90s程度だね。
ちなみに
def life() {
cells.foreach(_.foreach(_.evaluate))
cells.foreach(_.foreach(_.update))
}
を
def life() {
cells.par.foreach(_.foreach(_.evaluate))
cells.par.foreach(_.foreach(_.update))
}
にして並列化すると30s。
まだまだ遅いけど。
0619デフォルトの名無しさん
2012/04/30(月) 01:28:51.62遅くなって悪い。確かに待ち合わせが抜けてるね。
BoardもActorをextendsしてlifeを以下のactに替えればよさそう。
def act() {
cells.foreach(_.foreach((c:Actor) => {link(c); c.start}))
var count = 0
loopWhile(count < m * n) { receive { case _ => count += 1 } } andThen { print(this) }
}
0620デフォルトの名無しさん
2012/04/30(月) 01:42:08.34こういうのは一番早いね。
0621デフォルトの名無しさん
2012/04/30(月) 06:36:40.190622デフォルトの名無しさん
2012/04/30(月) 08:02:32.770623デフォルトの名無しさん
2012/04/30(月) 09:21:02.55from __future__ import print_function
from ctypes import *
clife = cdll.LoadLibrary('liblife.so')
clife.life.argtypes = [POINTER(POINTER(c_int)), POINTER(POINTER(c_int)), c_int, c_int]
x = [[0,1,1,1,0], [0,1,0,0,0], [0,0,1,0,0], [0,0,0,0,0], [0,0,0,0,0]]
a, b = (POINTER(c_int) * 5)(), (POINTER(c_int) * 5)()
for i in xrange(5):
a[i], b[i] = (c_int * 5)(*x[i]), (c_int * 5)()
clife.life(a, b, 5, 5)
print('\n'.join(''.join(str(b[i][j]) for j in xrange(5)) for i in xrange(5)))
0624デフォルトの名無しさん
2012/04/30(月) 15:16:50.31import Foreign.Marshal (newArray, mallocArray, peekArray, free)
import Foreign.C.Types (CInt)
import Foreign.Ptr (Ptr, plusPtr)
import Foreign.Storable (sizeOf, peek)
import Data.List (unfoldr)
foreign import ccall "life" cLife ::
Ptr (Ptr CInt) -> Ptr (Ptr CInt) -> CInt -> CInt -> IO ()
main = do
x' <- newArray $ concat xss :: IO (Ptr (CInt))
y' <- mallocArray (m * n)
x <- f x' =<< peek x'
y <- f y' =<< peek y'
cLife x y (fromIntegral m) (fromIntegral n)
z <- peekArray (m * n) y'
mapM_ free [x, y]
mapM_ free [x',y']
print $ unfoldr (\xs -> if null xs then Nothing else Just $ splitAt n xs) z
where
xss = [[0,1,1,1,0], [0,1,0,0,0], [0,0,1,0,0], [0,0,0,0,0], [0,0,0,0,0]]
m = length xss
n = length (concat xss) `div` m
f p h = newArray [plusPtr p (sizeOf h * i * n) | i <- [0..m-1]]
0625デフォルトの名無しさん
2012/04/30(月) 20:00:22.80速い言語(C/C++/Java)で書けば良いのに
クソ遅い言語で速度競っててワロタwww
0626デフォルトの名無しさん
2012/04/30(月) 20:14:25.980627デフォルトの名無しさん
2012/04/30(月) 20:25:46.030628デフォルトの名無しさん
2012/04/30(月) 21:11:28.94C言語に比べて物凄く遅いです(6.5倍遅い)
(出力が遅すぎるので、そこをコメントアウトしてもまだ遅いです)
http://ideone.com/FoYga
どうやったら速くなりますか?
0629デフォルトの名無しさん
2012/04/30(月) 21:27:32.39http://ideone.com/oLyyb
0630デフォルトの名無しさん
2012/05/01(火) 03:28:55.35そこが問題,
小さい処理ならそれでいいが,大きなシステムだとはなしにならん
0631デフォルトの名無しさん
2012/05/01(火) 03:59:53.53出来ないのはそいつが未熟なだけ
0632デフォルトの名無しさん
2012/05/01(火) 04:44:27.14自分は逆に関数型言語でトップダウンだが・・・
入れ子になった関数を変更するときぐらいだな。ボトムアップな感じになるのは
0633デフォルトの名無しさん
2012/05/01(火) 05:04:37.25ミクロな関数は入出力の型だけ決めて実装は後回し
なんでこんな簡単なことが>>630には出来ないの?
0634デフォルトの名無しさん
2012/05/01(火) 07:57:45.80再利用はどうしてもボトムアップになる
0635デフォルトの名無しさん
2012/05/01(火) 09:19:19.80実感として、トップダウンとボトムアップの出会うところでうんうんうなっています。
0637デフォルトの名無しさん
2012/05/01(火) 15:17:57.73ボディを違う色で塗って「ニューモデル」っていうだけだろ
0638デフォルトの名無しさん
2012/05/01(火) 19:35:01.49窓際に座ってる禿ですら操作できるんだからなぁ。
http://research.microsoft.com/en-us/um/people/simonpj/Papers/excel/index.htm
0639デフォルトの名無しさん
2012/05/01(火) 19:48:21.140640デフォルトの名無しさん
2012/05/01(火) 19:53:04.340641デフォルトの名無しさん
2012/05/01(火) 19:57:17.640642デフォルトの名無しさん
2012/05/01(火) 20:11:03.690643デフォルトの名無しさん
2012/05/01(火) 20:20:54.13何言ってんだ?
0644デフォルトの名無しさん
2012/05/01(火) 20:54:33.43A2=A1-32
A3=A2*5/9
これは静的単一代入 (SSA) です。
SSAは関数型に入りますか?
0645デフォルトの名無しさん
2012/05/01(火) 20:59:05.320646デフォルトの名無しさん
2012/05/01(火) 21:02:58.150647デフォルトの名無しさん
2012/05/01(火) 21:47:34.44これは開発工数が伸びる原因になる。
0648デフォルトの名無しさん
2012/05/01(火) 21:56:43.180649デフォルトの名無しさん
2012/05/01(火) 22:03:59.520650デフォルトの名無しさん
2012/05/01(火) 22:36:11.12だから、型ですよね?
0651デフォルトの名無しさん
2012/05/01(火) 22:36:32.170652デフォルトの名無しさん
2012/05/01(火) 22:37:00.050653uy
2012/05/02(水) 01:30:41.35class Array
def my_permu
return [self] if size < 1
inject [] do |r , n|
reject{|x| x == n }
.my_permu.inject r do |r,ary|
r << [n] + ary
end
end
end
end
p (1..3).to_a.my_permu
0654デフォルトの名無しさん
2012/05/02(水) 03:53:50.68自分が使ってる言語以外をdisりたいだけだよね
0655デフォルトの名無しさん
2012/05/02(水) 11:28:46.31まだpermutationやってんのかよ、こんなもんがそんな面白いか?
perm [] = [[]]
perm xs = [x:y | x <- xs, y <- perm $ filter (/=x) xs]
main = print $ perm [1,2,3]
0656デフォルトの名無しさん
2012/05/02(水) 11:34:39.78import Data.List
perm' [] = [[]]
perm' xs = [x:y | x <- xs, y <- perm $ delete x xs]
0657uy
2012/05/02(水) 13:23:15.71Rubyのpermutationって誰も知らないのか話題にならないから俺が最初に2chにコード投下したやつじゃん(半年前くらいに)
67の冗長ゴミカスRubyソースコードを添削しただけだよ
0658デフォルトの名無しさん
2012/05/02(水) 13:33:49.060659デフォルトの名無しさん
2012/05/02(水) 15:29:43.37いやHaskellでもRubyでも標準添付や組み込みのライブラリに入ってますし…
0660デフォルトの名無しさん
2012/05/03(木) 10:07:46.90要素の重複を取り除くところでバグるかもしれない点は面白い
0661デフォルトの名無しさん
2012/05/03(木) 14:24:19.11perm := [:xs |
xs ifEmpty: [#(())] ifNotEmpty: [
xs gather: [:x | (perm value: (xs copyWithout: x)) collect: [:ys | {x}, ys]]]].
perm value: #(1 2 3) "=> #((1 2 3) (1 3 2) (2 1 3) (2 3 1) (3 1 2) (3 2 1)) "
0662デフォルトの名無しさん
2012/05/03(木) 20:11:32.07SequenceableCollection >> perm
self size < 1 ifTrue: [^Array with: self].
^self inject: #() into: [:r1 :n |
(self reject: [:x | x = n]) perm inject: r1 into: [:r2 :ary |
r2 copyWith: (ary copyWithFirst: n)]]
#(1 2 3) perm "=> #((1 2 3) (1 3 2) (2 1 3) (2 3 1) (3 1 2) (3 2 1)) "
ちなみに、Squeak Smalltalkで組み込みのpermutation相当を見たらこんなふうに
破壊的操作による実装だった。
class Array
def perm_each(&block)
clone.perm_start_at(0, &block)
end
def perm_start_at(n, &block)
return if n > size-1
return block.call(self) if n == size-1
(n..size-1).each do |i|
swap!(n, i)
perm_start_at(n+1, &block)
swap!(n, i)
end
end
def swap!(a, b); self[a], self[b] = self[b], self[a] end
end
0663デフォルトの名無しさん
2012/05/04(金) 12:04:28.46let bind m f = seq {for x in m do yield! (f x)}
let ret x = Seq.singleton x
let rec perm xs =
if Seq.isEmpty xs then ret Seq.empty else
bind (seq {0 .. (Seq.length xs - 1)}) (fun n ->
bind (perm (Seq.append (Seq.take n xs) (Seq.skip (n+1) xs))) (fun ys ->
ret (seq {yield (Seq.nth n xs); yield! ys})))
0664デフォルトの名無しさん
2012/05/05(土) 00:05:09.38こんなひとおる?
0665デフォルトの名無しさん
2012/05/06(日) 08:01:00.40俺みたいな奴は案外多いんじゃないかね。
そんなことよりトランザクショナルメモリはよ。
0666デフォルトの名無しさん
2012/05/06(日) 09:25:35.24だが変な機能をゴリ押しされるとそれに対抗するものが欲しくなる
ゴリ押しを断るために、先約があるとかいって他のを抜擢するみたいな話は案外多い
0667デフォルトの名無しさん
2012/05/06(日) 11:09:05.44コレクションライブラリがあれば
十分だったりするw
Guavaおすすめ
0668デフォルトの名無しさん
2012/05/06(日) 12:23:52.010669デフォルトの名無しさん
2012/05/06(日) 12:33:51.12手続型 vs 関数型
構造化設計 vs オブジェクト指向設計
0670デフォルトの名無しさん
2012/05/06(日) 12:34:57.95メタプログラミングなんてどう?
LISPのように構文を犠牲にしないMPといえば、OO系が主流だろう。
0671デフォルトの名無しさん
2012/05/06(日) 12:59:41.15push型は一昔前のOO
pull型は遅延評価できるので関数型に近い印象がある
最近はpull型も普及したので、まだ売れ残っている型推論の方が関数型らしく見える
メタプログラミングは、共通のVMまたはC言語の上に好きな言語を乗せるのが主流
0672デフォルトの名無しさん
2012/05/06(日) 13:07:46.750673デフォルトの名無しさん
2012/05/06(日) 16:21:50.38一昔前がよくわからないのでpull型とpush型の違いがよくわからんです
0674デフォルトの名無しさん
2012/05/06(日) 17:41:19.49getterを呼び出したり成功か失敗か調べたりするのがpull型
getter反対派はpush型
0675デフォルトの名無しさん
2012/05/06(日) 19:43:30.180676デフォルトの名無しさん
2012/05/06(日) 20:31:27.12サンプルはJava。上がきっとpushで下がpull
http://www.akirakoyasu.net/2011/01/15/218/
List<B> blist = new ArrayList<B>(alist.size());
for (A a : alist) {
blist.add(new B(a));
}
Guavaを使う場合は次のように書きます。
List<B> blist = Lists.transform(alist, new Function<A, B>(){
@Override
public B apply(A a) {
return new B(a);
}
});
0677デフォルトの名無しさん
2012/05/06(日) 20:34:08.65pullとpushの言葉の使い方逆じゃね?
0678デフォルトの名無しさん
2012/05/06(日) 20:43:49.33放置したほうがいい人だと思うがどうか?
"Push-Pull Functional Reactive Programming"風に、
pull: demand driven
push: data driven
ってことでいいかと。
0679デフォルトの名無しさん
2012/05/06(日) 20:45:09.00pullは引く。
result = hoge( piyo( huga() ) );
pushは押す。
huga( result );
piyo( result );
hoge( result );
0680デフォルトの名無しさん
2012/05/06(日) 20:59:16.39遅延評価はdemand drivenだから、671は合ってるだろ
0681デフォルトの名無しさん
2012/05/06(日) 21:05:42.540682デフォルトの名無しさん
2012/05/06(日) 21:16:14.000箇所よりも1箇所の方がいいんじゃないか
0683デフォルトの名無しさん
2012/05/06(日) 21:18:45.89手続きタイプと、コールバックタイプとかでいいんじゃね?
■ このスレッドは過去ログ倉庫に格納されています