[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 2chのread.cgiへ]
Update time : 05/14 13:02 / Filesize : 255 KB / Number-of Response : 780
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 21:26:47.61 ]
一般的には、オブジェクト指向型言語が優勢でが
一部には関数型言語を崇拝している人もいます

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

前スレ toro.2ch.net/test/read.cgi/tech/1331328955/

559 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 12:11:25.24 ]
>>557
他スレで遊んでる内に作られてしまった…

560 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 12:13:20.34 ]
>>552
ライフゲームは生物が単純だから変に思えるかもしれないけど、
これがゲームのキャラクターと考えればごく普通の考え方。

ライフゲームはどの生物も同じ能力だけど、セルがオブジェクトなら
実際の生物みたく、オブジェクトごとに能力を変えることだって出来る

というかそういうゲームがあったね。

マルチプレイヤー・ネットワーク・ゲームTerrarium
www.atmarkit.co.jp/fdotnet/wwebserv/wwebserv010/wwebserv010-001.html
> プレイヤーは各自プログラミングした動物を持ち寄り、フィールド上で動物同士を戦わせる。


561 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 12:23:40.64 ]
やっぱりオブジェクト指向だと規模が大きくなる。

逆に言えば、規模が大きい場合は
オブジェクト指向が有利ってことか。

562 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 12:42:19.17 ]
大規模で全貌の把握がしづらいものを
個々人では把握できないままでも比較的扱いやすいのがOOPLだと思ってる

563 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 12:57:03.02 ]
全体を統一しづらい規模になると言語は一つではなくなる
Objective-C++/CLIのような状態

564 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 16:19:14.44 ]
>セルがオブジェクトなら
>実際の生物みたく、オブジェクトごとに能力を変えることだって出来る

大抵のOOPLにはマルチメソッドすらないのに、
良くそんな大口たたけるな。

565 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 16:24:25.86 ]
無いのはマルチメソッドを実現するための言語仕様であって、
マルチメソッド自体は実装できるからね。

566 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 16:25:24.90 ]
>>564
突然何言い出してんのこの子(´・ω・`)

567 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 16:28:06.39 ]
ホーミングミサイルの話でボコボコにされたやつだ。
気にすんな



568 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 18:10:20.59 ]
>>565
関数型言語でも実装できる
パラダイムじゃなく言語間の比較スレなんだから
そんなこと言っても意味ない

569 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 18:15:28.58 ]
>>561
仮に「OOPだと規模が大きくなる」が真だとしても
そこから「規模が大きいとOOPは有利」は導けない

570 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 18:53:58.34 ]
静的型付けの割に簡潔に書けて、かつ型チェックも厳しくやってほしい

こういうニーズに関数型言語が応えてるから使ってるだけで、
関数型言語使ってる奴が皆OOを嫌ってるわけでも
設計レベルで使わないわけでもないんよ

争いは不毛だ

571 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 19:06:33.77 ]
> 静的型付けの割に簡潔に書けて、かつ型チェックも厳しくやってほしい
なんとなくC#を思いだしたけどC#で書く人いないね

572 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 19:31:55.12 ]
争わなかったらスレの存在意義がないだろ

573 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 20:25:37.43 ]
>>571
C#のジェネリックってダックタイピングできないんでしょ?簡潔かなぁ。

574 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 20:41:49.41 ]
>>560
ライフゲームのセルっていう文脈だからねぇよって言ったわけで
ゲームのキャラクターのオブジェクト化まで否定はしてねぇよw

>>564
またホーミングの子www

575 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 21:39:52.98 ]
>>570
Scalaがそう。

静的言語で、簡潔に書けることを
証明した言語。

576 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 21:45:24.53 ]
>>575
このスレでまだ一回もScala出て来てないぞ
ライフゲームで良いからコードで証明してみてくれ

577 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 23:03:24.87 ]
「Scalaは簡潔に書けると証明した」=>「じゃあチョット書いてみて」=> 逃亡


どんなコントだよwww



578 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 23:11:10.96 ]
ん? Scala知らないの?

579 名前:デフォルトの名無しさん mailto:sage [2012/04/28(土) 23:31:57.42 ]
Scala待ちの間にw、Squeak Smalltalkでセルがオブジェクト版。(要クラスブラウザ)
細かい違いを無視すれば Python の >>557 とほぼ同じ方針。

Object subclass: #Cell
   instanceVariableNames: 'neighbors next'
Cell >> setBit: int
   neighbors := OrderedCollection with: int
Cell >> collectNeighborsAt: pos in: array2D
   neighbors addAll: (#(-1 0 1) gather: [:dx | #(-1 0 1) collect: [:dy |
      (array2D atWrap: (pos y + dy)) atWrap: (pos x + dx)]]); remove: self
Cell >> calcNext
   next := (neighbors inject: 0 into: [:sum :neigh | sum + neigh value])
      caseOf: {[3]->[1]. [4]->[self value]} otherwise: [0]
Cell >> update
   neighbors at: 1 put: next
Cell >> value
   ^neighbors first
Cell >> printOn: stream
   self value printOn: stream
Cell class >> newWith: bitInt
   ^self new setBit: bitInt; yourself
Cell class >> newLatticeFrom: array2D
   | lattice |
   lattice := array2D collect: [:row | row collect: [:bit | Cell newWith: bit]].
   ^lattice doWithIndex: [:row :y | row doWithIndex: [:cell :x |
      cell collectNeighborsAt: x@y in: lattice]]; yourself
Cell class >> updateLattice: array2D
   ^array2D do: [:row | row do: #calcNext]; do: [:row | row do: #update]

| lattice |
lattice := Cell newLatticeFrom: {{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}}.
Cell updateLattice: lattice. "=> {{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}} "

580 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 00:22:22.02 ]
純粋な関数型言語って、参照するたびに値が変化する変数みたいなのは作れるの?
たとえば乱数とか、参照した時点の現在時刻を値として持ってる変数とか

581 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 00:31:18.37 ]
>557をscalaでベタ移植してみた。

case class Cell(var alive:Int) {
 var neighborhood = List[Cell]()
 var alive_ = 0
 def evaluate() {
  val s = neighborhood.map(_.alive).sum
  alive_ = if(s == 3 || s == 4 && alive == 1) 1 else 0
 }
 def update() { alive = alive_ }
}
case class Board(val lattice:List[List[Int]]) {
 val cells = lattice.map(_.map(x => Cell(x)))
 val m = lattice.size; val n = lattice(0).size
 for(i <- 0 until m; j <- 0 until n; k <- -1 to 1; l <- -1 to 1)
  cells(i)(j).neighborhood ::= cells((i+k+m)%m)((j+l+n)%n)
 def life() {
  cells.foreach(_.foreach(_.evaluate))
  cells.foreach(_.foreach(_.update))
 }
 override def toString() = {
  cells.map(_.map(_.alive.toString).reduce(_ + "," + _)).reduce(_ + "\n" + _)
 }
}
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
print(board)

scalaの機能を余り活用できていない感じ。

582 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 01:14:20.15 ]
これで静的型付け言語なんだぜ。

val msg = if (true) "true dayo" else "false dayo"

583 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 01:27:13.41 ]
せっかくなのですべてのセルが並行に動くように>581を修正

case class Cell(var alive:Int) extends Actor {
 var neighborhood = List[Cell]()
 def act() = {
  neighborhood.foreach(_ ! alive)
  var count = 0; var s = 0
  loopWhile(count < neighborhood.size) {
   receive { case i:Int => s += i; count += 1 }
  } andThen { alive = if(s == 3 || s == 4 && alive == 1) 1 else 0 }
 }
}
case class Board(val lattice:List[List[Int]]) {
 val cells = lattice.map(_.map(x => Cell(x)))
 val m = lattice.size; val n = lattice(0).size
 for(i <- 0 until m; j <- 0 until n; k <- -1 to 1; l <- -1 to 1)
  cells(i)(j).neighborhood ::= cells((i+k+m)%m)((j+l+n)%n)
 def life() {
  cells.foreach(_.foreach(_.start))
 }
 override def toString() = cells.map(_.map(_.alive.toString).reduce(_ + "," + _)).reduce(_ + "\n" + _)
}
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
print(board)

evaluate/updateの分割が不要になったので少し短くなったか

584 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 01:30:58.02 ]
これで静的型付け言語なのか。
本当に短いコードは動的型付け言語だけの特権じゃないことを
証明してしまったな。

585 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 02:11:32.74 ]
ただ静的型にしては遅いよね。
500x500 500世代で動的な >>579 が 112秒なのに、>>581 は 196秒。

586 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 02:18:22.73 ]
>>585
それ事前コンパイルしてないだろ?

587 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 02:35:44.97 ]
>>583
これって一回のlifeのコール後、
すべてのセルがアップデートを終えるのをどこで待ち合わせているの?



588 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 06:27:13.54 ]
>>582
そんなんで感動できるとか何時の時代の人?

OCaml : let msg = if true then "true" else "false"
Haskell : let msg = if True then "true" else "false"

589 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 06:30:26.82 ]
どうせ、RubyとかLLばっかり使ってる人だろw

590 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 07:52:20.17 ]
C++,C#にも導入されたね
C++11 : auto msg = true ? "true dayo" : "false dayo";
C#(3.0) : var msg = true ? "true dayo" : "false dayo";

591 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 08:14:29.69 ]
最近どんどん動的型付け言語の
メリットがなくなっていくね。

592 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 08:47:25.44 ]
>>590
…それでmsgの型を推論しろってか。

593 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 09:24:13.53 ]
>>591
この戦いが終わったら全ての武器のメリットがなくなるんだ

594 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 09:42:55.39 ]
機械語のメリットがなくなってゆくね、とか言ってる奴の同類だよなぁw

595 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 09:43:05.44 ]
でも静的型はコンパイルが必要でREPLももっさり、型推論も万能じゃない
スクリプト言語はこれからも残るよ

596 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 10:59:45.94 ]
trueって名前の変数を作って、遅延評価によってmsgを参照したときの変数trueの値によりmsgの値も変わるってことでいいんかの
変数trueに再代入できたりしないとあんま意味なくね?
いや違ってたらすまんが

597 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 11:11:11.60 ]
>>590は型推論の話じゃないの?
"true dayo"も"false dayo"も文字列リテラルなので
三項演算の条件のtrue/falseを問うことなくmsgの型を文字列と確定できる



598 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 11:27:23.87 ]
>>597
ああなんだそういうことか、勘違いしてたわ

599 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 11:55:08.69 ]
変数に互換性がない別の型の値を
再代入できる言語はクソです。

600 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 12:10:48.87 ]
>>586
Scalaって事前(?)にコンパイルする以外になんか実行方法あったっけ?

601 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 12:18:53.17 ]
>>600

>>581はコンパイルしたらエラーがでます。

602 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 12:21:46.03 ]
コンパイルしない場合は、そのまま動きます。

603 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 12:31:37.65 ]
>581はscalaスクリプトだから、コンパイルする場合は
-Xscript XXX オプションをつける必要があるかと

604 名前:デフォルトの名無しさん mailto:sage [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 シングルコア

605 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 12:42:30.36 ]
>>599
それで、代入を禁止するのと共用体を禁止するのは、どっちが良いんですか

606 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 12:48:02.58 ]
スクリプト実行
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
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

コンパイル時間の分、スクリプト実行だと起動に時間がかかるね

607 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 12:48:20.97 ]
>>605
両方いいです。



608 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 12:51:30.57 ]
>>597
よく見れ。
msgにtrueを代入してる。

609 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 12:53:31.56 ]
>>608
どのtrueを代入してるんですか?

全文を引用して、該当のtrueを【】でくくって下さい。

610 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 13:04:26.07 ]
>>601
コンパイル通らないので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スクリプトなんてモードがあるんですね。
実行オプションでそんなに差が出るものなんですか?

611 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 13:31:36.87 ]
Javaの実行環境に詳しくないとまともにベンチとれないんじゃないかと思う

>>608
$ cat hello.cs
class Program {
public static void Main() {
var hoge = true ? "*true*" : "*false*";
System.Console.WriteLine(hoge); } }
$ mono hello.exe
*true*

612 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 13:56:15.31 ]
>>608
お前が良く見た方がいい

613 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 14:10:28.74 ]
括弧を省略する言語は危険
式と文を区別しない言語も危険

614 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 14:12:28.08 ]
>>613
蛇の国からようこそおこしやす

615 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 14:22:29.08 ]
Lisp系から見るとHaskellも括弧省略言語だな

616 名前:デフォルトの名無しさん mailto:sage [2012/04/29(日) 19:36:04.13 ]
λ式に比べたらLispだって

617 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 00:25:42.19 ]
>>616
Lispの関数は
apply = foldl ($)
(((f x) y) z) == (apply f) [x, y, z]
省略ではなく、式を変形している
(x, y, zの型が異なる場合、Haskellは上の式が間違っていると主張する)



618 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 01:24:53.48 ]
>610
core 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。
まだまだ遅いけど。

619 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 01:28:51.62 ]
>>587
遅くなって悪い。確かに待ち合わせが抜けてるね。
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) }
}

620 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 01:42:08.34 ]
やっぱり手続き型のC言語が
こういうのは一番早いね。

621 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 06:36:40.19 ]
つまりCの関数を簡単に呼べる言語が優秀

622 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 08:02:32.77 ]
なんだ。Rubyが最強ってことか。

623 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 09:21:02.55 ]
>>546のCの関数を呼び出してみた


from __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)))

624 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 15:16:50.31 ]
Haskell(GHC)からC関数を使用


import 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]]

625 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 20:00:22.80 ]
速度が必要な極一部の処理だけ
速い言語(C/C++/Java)で書けば良いのに
クソ遅い言語で速度競っててワロタwww

626 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 20:14:25.98 ]
なんだJava厨か

627 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 20:25:46.03 ]
Ruby「実行速度とかそんなの求めてませんから(キリッ」



628 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 21:11:28.94 ]
>>546のコードをJavaにベタ移植したんですが
C言語に比べて物凄く遅いです(6.5倍遅い)
(出力が遅すぎるので、そこをコメントアウトしてもまだ遅いです)

ideone.com/FoYga

どうやったら速くなりますか?

629 名前:デフォルトの名無しさん mailto:sage [2012/04/30(月) 21:27:32.39 ]
すいません正しく移植したら速くなりました
ideone.com/oLyyb

630 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 03:28:55.35 ]
関数型言語で書くとどうしてもボトムアップになる,
そこが問題,
小さい処理ならそれでいいが,大きなシステムだとはなしにならん

631 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 03:59:53.53 ]
関数型言語はトップダウンでもボトムアップでも組む事が出来る
出来ないのはそいつが未熟なだけ

632 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 04:44:27.14 ]
>>630
自分は逆に関数型言語でトップダウンだが・・・
入れ子になった関数を変更するときぐらいだな。ボトムアップな感じになるのは


633 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 05:04:37.25 ]
マクロな関数(処理)から書き始め、マクロな関数から呼ばれる
ミクロな関数は入出力の型だけ決めて実装は後回し

なんでこんな簡単なことが>>630には出来ないの?

634 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 07:57:45.80 ]
トップダウンはどうしても車輪の再発明になる
再利用はどうしてもボトムアップになる

635 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 09:19:19.80 ]
え?

636 名前: ◆QZaw55cn4c mailto:sage [2012/05/01(火) 12:12:45.49 ]
>>634
実感として、トップダウンとボトムアップの出会うところでうんうんうなっています。

637 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 15:17:57.73 ]
>>634
ボディを違う色で塗って「ニューモデル」っていうだけだろ



638 名前:デフォルトの名無しさん [2012/05/01(火) 19:35:01.49 ]
Excel内臓の関数型言語の普及率はすげぇよな。
窓際に座ってる禿ですら操作できるんだからなぁ。
research.microsoft.com/en-us/um/people/simonpj/Papers/excel/index.htm

639 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 19:48:21.14 ]
simonpj先生の勤務先都合仕事だからだまされないで!

640 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 19:53:04.34 ]
騙されるも何も、内容は事実じゃん。

641 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 19:57:17.64 ]
スプレッドシート猿によるアホな決定というリスクマネジメントのための学会?

642 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 20:11:03.69 ]
現実には使えないExcelの拡張の話だけどなw

643 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 20:20:54.13 ]
拡張せずとも、普通に計算するだけで関数型だろ?
何言ってんだ?

644 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 20:54:33.43 ]
A1=3
A2=A1-32
A3=A2*5/9

これは静的単一代入 (SSA) です。
SSAは関数型に入りますか?

645 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 20:59:05.32 ]
y = x + 5 は一次関数。あとは説明要らんよな。

646 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 21:02:58.15 ]
そもそも、型に入るとか入らないとかいう型の理論が要らない

647 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 21:47:34.44 ]
型がないと、実行時にしかメソッド名の解決ができない。
これは開発工数が伸びる原因になる。



648 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 21:56:43.18 ]
なんという緻密な分析

649 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 22:03:59.52 ]
関数"型"の話してんだろコミュ障

650 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 22:36:11.12 ]
>>649
だから、型ですよね?

651 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 22:36:32.17 ]
型だよ型。

652 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 22:37:00.05 ]
型の話しようぜ。

653 名前:uy mailto:sage [2012/05/02(水) 01:30:41.35 ]
>>67
class 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

654 名前:デフォルトの名無しさん mailto:sage [2012/05/02(水) 03:53:50.68 ]
ぶっちゃけ関数型もオブジェクト指向もどうでも良くて
自分が使ってる言語以外をdisりたいだけだよね

655 名前:デフォルトの名無しさん mailto:sage [2012/05/02(水) 11:28:46.31 ]
>>653
まだpermutationやってんのかよ、こんなもんがそんな面白いか?

perm [] = [[]]
perm xs = [x:y | x <- xs, y <- perm $ filter (/=x) xs]

main = print $ perm [1,2,3]

656 名前:デフォルトの名無しさん mailto:sage [2012/05/02(水) 11:34:39.78 ]
こっちは要素の重複を取り除かないバージョン

import Data.List
perm' [] = [[]]
perm' xs = [x:y | x <- xs, y <- perm $ delete x xs]

657 名前:uy mailto:sage [2012/05/02(水) 13:23:15.71 ]
>>655
Rubyのpermutationって誰も知らないのか話題にならないから俺が最初に2chにコード投下したやつじゃん(半年前くらいに)
67の冗長ゴミカスRubyソースコードを添削しただけだよ



658 名前:デフォルトの名無しさん mailto:sage [2012/05/02(水) 13:33:49.06 ]
へえー、これ良いね。

659 名前:デフォルトの名無しさん mailto:sage [2012/05/02(水) 15:29:43.37 ]
>>658
いやHaskellでもRubyでも標準添付や組み込みのライブラリに入ってますし…






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<255KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef