[表示 : 全て 最新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/

9 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 21:42:07.17 ]
>>6
OOPでやると簡潔になるんじゃなくて、
変更の範囲を極小化出来るんだよ。

該当のフィルタだけの修正で、
それ以外の場所は何も変えないで変更できる。

10 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 21:42:59.33 ]
いいから代表的なコードは貼りなおせよ
使えないな

11 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 21:43:29.55 ]
>>8
え? 行フィルタなのに、ファイル全体をセパレートするのはおかしいでしょ?
ここにないのは、ここにあるべきじゃないコードだからだよ。

12 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 21:43:49.61 ]
じゃあ、問題をはっきりさせよう

「標準入力から文字列を読み込んで、カンマ区切りで改行して、
各行の文字数を数えて最大文字数を標準出力に表示せよ」

これを書いて

13 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 21:45:14.12 ]
設計がおかしいって指摘されて
ファビョってきたなw
全部関数なんかでやろうとするから
設計ができないんだ。

14 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 21:46:27.84 ]
>>12
それ問題が不適切。

「標準入力」から文字列を読み込んで、「カンマ区切りで改行」して、
「各行の文字数を数えて最大文字数」を「標準出力」に表示せよ

ただし、カッコの中は一例であり
容易に変更できる設計にしておくこと

15 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 21:47:53.75 ]
○から文字列を読み込んで、△で改行して、
各行に対して□を処理をして、その結果を☆に表示せよ

抽象化するとこんな感じか。

16 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 21:49:26.82 ]
またこういう例題か…
オレ何度も書いたし、もういいや今日は。

17 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 21:50:59.80 ]
コードが出ても議論が進まないことがはっきりしただけかw



18 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 21:51:11.25 ]
まず、リーダーインターフェースが必要。
そのリーダーインターフェースを実装した、
標準出力リーダークラスを作る。

行セパレータインターフェースが必要
その行セパレータインターフェースの実装として、
\r\nセパレータを作る

その後フィルタインタフェースが必要で
そのフィルタインタフェース(begin、filter、end)を実装した、
「各行の文字数を数えて最大文字数」はfilterで文字数を数えて
endで結果を出力する。

あとは、同様にライタインターフェースを実装した
標準出力ライタクラス。

19 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 21:51:29.89 ]
どうせなら、parottをJapaで書いたらこーんなに見通しのよいプログラムが短期間でできましたよ
とかそんくらいの成果聞いてみたいもんだわ

20 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 21:52:01.14 ]
結局拡張性をもたせようとすると、
こんな感じになるわけ。

例外が悪いという意味がわかったかな?

21 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 21:53:56.24 ]
能書きからして冗長までは良くわかった。

22 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 21:54:17.31 ]
関数型は実装の一つを書いているだけ。

オブジェクト指向は様々な実装を書くための仕組みを
提供するもの、つまり設計の部分なので
やることの対象が違うんだよ。

オブジェクト指向で枠組み設計を行い
関数型言語でその枠組みの中身を書く

23 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 21:55:34.83 ]
冗長というか、単にオブジェクト指向は、単処理よりも
広範囲な部分、処理の連携部分を記述する言語ってことなだけでしょ。

24 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 21:57:26.44 ]
この程度の例題で広範も減ったくれもない気がす

25 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 21:58:48.39 ]
>>22
> オブジェクト指向で枠組み設計を行い
> 関数型言語でその枠組みの中身を書く

こんな感じ?


{-# LANGUAGE RecordWildCards #-}
import System
import Control.Monad

data Filter a b = Filter { begin :: a, body :: a -> String -> b, end :: b -> IO () }

awkLike Filter{..} = end . body begin

countFilter = Filter {
              begin = Nothing,
              body = \_ -> maximum . map length . lines,
              end = \p -> putStrLn $ "最大文字数は" ++ show p ++ "文字でした"}

splitBy _ [] = []
splitBy p xs = a : (splitBy p $ drop 1 b) where (a, b) = break p xs

countFilterSplitBy sep filepath = countFilter {
  body = \_ -> maximum . map length . splitBy (== sep),
  end = \p -> writeFile filepath $ "最大文字数は" ++ show p ++ "文字でした"
}

main' = awkLike countFilter =<< getContents -- 例1: 標準入出力使用、普通にカウント
main = mapM_ (awkLike (countFilterSplitBy ',' "test.txt") <=< readFile) =<< getArgs -- 改行コードを変えて入出力先も変更

26 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 22:00:33.04 ]
>>25
おー、なかなか。パチパチ

27 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 22:04:02.78 ]
なんかお株奪われた?



28 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 22:37:31.82 ]
>容易に変更できる設計にしておくこと

ソースにパッチを当てて変更するのは容易ではないの?
パッチが容易ではないというのは、もしかして
「CUIは容易ではない」「GUIは容易」みたいな思想と関係あるのか

29 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 00:08:18.23 ]
> ソースにパッチを当てて変更するのは容易ではないの?
ソースにパッチ当てるといってもいろんな意味がある。

インターフェースを変更するようなソースの修正は容易ではない。
影響があちこちに波及するからだ。


30 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 04:41:56.60 ]
OOが使えそうなところにはOOの機能を使うし、
関数型が使えそうなところには関数型の機能を使う。
両方使えそうにないところは普通の手続き型の格好に。たったそれだけのことだろ?
「関数型 vs オブジェクト指向」 からは、「if文 vs for文」並みのナンセンスさを感じるね。
OOも関数型も単なる一機能なんだから、状況に合わせて 使う/使わない すればよいじゃない。

31 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 04:57:44.26 ]
なにも言ってないレスされても

32 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 07:15:51.37 ]
>>30
「関数型 vs オブジェクト指向」ならその通りなんだけど、
ここは「関数型言語 vs オブジェクト指向言語」なんだわ

33 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 09:46:11.98 ]
そういや関数型指向ってないよねw

34 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 09:53:06.98 ]
>>29
パッチの意味は追加と削除の二種類しかない。
マクロな視点でいうと、最新版を出す影響と古い安定版を切り捨てる影響の二つ。
現に大きな影響が出ているが、
関数型とオブジェクト指向の人間はこの問題についてなにも言ってない。
なぜなら、古い仕様が優遇されてしまうと手続き型が圧倒的に有利だから。

35 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 09:55:37.49 ]
>>34
具体的に言って下さい。

36 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 10:00:13.98 ]
>>33
functional (programming)

37 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 10:35:21.46 ]
一口にパッチと言っても

・ソースコード自体を書き換える方法
・ソースコードはそのままに静的に書き換える方法(マクロ、テンプレート)
・ソースコードはそのままに実行時に書き換える方法(モンキーパッチ)

などがあるのですが



38 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 11:01:10.34 ]
>>37
文字列自体を操作する方法と、文字列に代わるものを操作する方法があるよね

39 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 11:13:21.18 ]
>>33
個人的に、関数型言語は「型指向」だと思う
どう言う型受け取って、どう言う型を変えしたいのか考えると、自然と答えが出て来る


40 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 11:22:39.91 ]
>>37
それらの区別はたいして何も変わらんw

41 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 11:25:46.31 ]
個人的には、OOPLだと設計がしっかりしてないと拡張するとき困ること多いけど、関数型言語だと、設計を意識しなくても(行き当たりばったりでも)拡張しやすい感触がある
納期に迫られ、ろくに設計できる環境も、人材も無い現場では関数型言語の方が向いてると思うんだが・・・


checkPermu ns = and.concat $ check ns
where
check [] = [[]]
check (x:xs) = map (x/=) xs : check xs

allPattern 0 _ = [[]]
allPattern _ [] = [[]]
allPattern n (ns:nss) = [x:xs | x <- ns, xs <- allPattern (n-1) nss]

-- 普通に作ったpermutations(使用例:permutations [1..3])
permutations ns = permutations' (length ns) ns
where
permutations' 0 _ = [[]]
permutations' _ [] = [[]]
permutations' n ns = [x:xs | x <- ns, xs <- permutations' (n-1) ns, checkPermu (x:xs)]

-- 汎用的なallPatternを作って、それに差し替えたpermutations
permutations2 ns= filter checkPermu $ allPattern (length ns) (replicate (length ns) ns)

-- allPatternを使った拡張版permutations(使用例:permutationsEx 3 [[1..3],[1..3],[1..3]])
permutationsEx n ns= filter checkPermu $ allPattern n ns


42 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 11:45:02.42 ]
>>40
全然違うだろアホか

43 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 12:11:04.47 ]
>>39
節子、動的・動的…

44 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 12:22:28.84 ]
>>18の方針でJavaで実装したら100行超えた……
やっぱOOPはウンコだわ……

45 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 12:33:46.77 ]
でも関数型でも50歩100歩だったよ・・・

46 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 12:34:12.65 ]
>>41
俺は

「設計を意識しないとそもそも書けない」のが関数型言語で
手続き型言語やOOPLはメチャクチャな設計でも書けるor書けてしまうが
ちゃんと意識すると関数型言語にも通ずるようなコードが出来上がる

…と感じる

47 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 12:34:19.20 ]
じゃあRubyで実装しましょうよw



48 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 12:37:13.94 ]
俺は
設計・・・オブジェクト指向
実装・・・関数型言語
って感じるな。

49 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 12:47:10.04 ]
UMLがアップを始めました

50 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 13:16:53.33 ]
単なる型スイッチに夢おいもとめんなって。
OOだって実装の道具にすぎん。ハンマーやカンナの類だ。

51 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 13:29:13.33 ]
実装の道具は、OOPLだよ。
OOにはOOA(分析)やOOD(設計)があって
開発プロセス全体をカバーするものなんだ。

OOPLはOOによる開発プロセスを素直に実装するための言語

分析や設計がなぜOOなのかというと、それが一番
システム開発に適しているから。
そしてその分析、設計に一番適している実装がOOPL

関数型による分析や設計が出てこないことには
関数型は実装のみにしか適用されずに終わるよ。

52 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 13:33:38.15 ]
OOPLが先にあって、それを生かす形でOOAやOODが生まれたわけで。
夢見ちゃったって感じだね。

53 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 13:36:27.78 ]
>分析や設計がなぜOOなのかというと、それが一番
>システム開発に適しているから。

正しくはこうだね。

分析や設計がなぜOOなのかというと、使う言語がOOPLだから。

54 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 13:40:00.97 ]
結局無記名で議論すると個人の感想の叫びあいなんだよね

55 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 13:51:51.24 ]
関数型における分析と設計が出ない時点で
実装のみの技術ってことだろうね。

56 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 13:53:30.17 ]
>>47
何を?

57 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 14:02:15.98 ]
関数と述語による形式的仕様記述やZ言語は?



58 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 14:49:46.34 ]
OOP より FPのほうが響きがいい よってFPの勝ち。

59 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 15:50:29.78 ]
>>56
流れ的に>>41


60 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 16:36:57.37 ]
>>59
今Haskell版読みながらRuby版書いてみてるんだけど、やっぱ適当に書かれてる印象はないなあ
発想自体がよく練らないと出てこないというか
「自分が手作業でやるならこう」を素直にコード化する手続き脳ではいきなりは出てこないコードだと思う

61 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 16:49:51.49 ]
ああ、適当っつーか原文に倣えば「行き当たりばったり」か
どちらにしても行き当たりばったりにも見えないんだよ、それがサクッと出て来る時点でもう設計できてんじゃん、みたいな

62 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 17:02:45.73 ]
>>55
そうは言っても関数型言語での記述は、仕様をそのまま記述してるだけだしな・・・
クイックソートの記述が有名だけど、マージソートはもっと仕様そのまま書いてるだけなのがハッキリする

-- ソート済みのリストの小さい方をリストに追加して、他方を元のリストに戻して、リストのどちらかが空になるまで比較とリストへの追加、他方のさし戻しを繰り返す
merge xs [] = xs
merge [] ys = ys
merge (x:xs) (y:ys) | x < y = x:merge xs (y:ys)
merge (x:xs) (y:ys) = y:merge (x:xs) ys

-- 1要素または空になるまで半分に分割を繰り返してからmergeによる結合(1要素のリスト、または空リストはソート済みのリスト)
mergesort [] = []
mergesort [z] = [z]
mergesort zs = merge (mergesort xs) (mergesort ys)
where
(xs,ys) = splitAt (length zs `div` 2) zs


分析については、プログラミングHaskellの最後の方に書いてるプログラムの論証を読むと参考になると思う
>>41も、設計もへったくれも無く、こうしたいなと言う脳内仕様をそのまま書いたし、checkPermuを外に追い出して差し替えられるようにしたいな。とか、長さの異なるリストも扱えるようにしたいな。という気まぐれでどんどん変更してた
(そもそも設計が必要な規模じゃないが)


63 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 17:07:38.47 ]
ちなみに数分で、行き当たりばったりで書いてみたRubyのコードはこんな感じ
手作業でやる場合の手順をそのままコードに書いた、非常に手続き的な思考回路だと思う

class Array
 def my_permu
  return [] if empty?
  return [ns] if size == 1
  result = []
  each do |n|
   without_n = reject{|x| x == n }
   without_n.my_permu.each do |ary|
    result.push( [n] + ary )
   end
  end
  return result
 end
end
p (1..3).to_a.my_permu

64 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 17:08:07.37 ]
>>60-61
ruby挫折したりプログラマとしても挫折した(半年で才能無いと悟って辞職)私が褒められてる・・・
設計経験Zeroですよ^^;


65 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 17:08:33.41 ]
ごめんテストしてからレスすべきだった…

66 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 17:12:31.25 ]
>>64
手続き的なやり方が合わなかったんじゃね?
俺は逆に、そういう式的というか関数的というか…そういう発想が出てこない
まず最初に「それをやるなら、あれをやって、これをやってから…こうかな」と考えて、それをコード化してしまう

その例で言えば俺の脳内ではまず「数字の書かれたカードを並べていき、並べたらメモる」という作業が行われる
いきなりリストを組み合わせ分増やし、フィルタを掛けるなんて発想が出てこない

67 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 17:14:26.36 ]
>>63 を修正
class Array
    def my_permu
        return [] if empty?
        return [self] if size == 1
        result = []
        each do |n|
            without_n = reject{|x| x == n }
            without_n.my_permu.each do |ary|
                result.push( [n] + ary )
            end
        end
        return result
    end
end
p (1..3).to_a.my_permu



68 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 17:55:38.95 ]
褒められてイイナァ…
オレのコードは誰も褒めてくれなかった。それどころかオセロの難解コートと同列扱いされる始末…orz

69 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 17:59:46.60 ]
でもまあ、この程度の規模ではオブジェクト指向が
出てこないのはやっぱりって感じ

オブジェクト指向・・・設計部分の実装
関数型 or 手続き型 ・・・ 一処理の実装

といわれるのはこういうとことか

70 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 18:18:58.67 ]
>>66
発想の基点は恐らく、リスト内包表記でしょうね
勝手に全ての組み合わせを生成してくれますし、条件で生成される組み合わせを絞り込める
それを柔軟に扱えるようにしない手は無いな。と

じつは、昔、別のスレでリスト内包表記と再帰の合わせ技は見掛けてたんですよ
発想だけ貰って、自分で自作しました

関数脳の作り方は今も昔も、どう言う関数?どう動くべき?です
このメソッドを使ってとか、ここはポインタで・・・とかの発想は無いです
最初にベタな発想があって、流用できる関数があれば、流用する

Q:lengthは何をする関数?
A:リストを受け取って、長さを返す関数

Q:lengthはどう動くべき?
A:先頭から、1ずつ足して行くべき

Q:リストが空っぽになったら?
A:足しても変わらない0を返す

length [] = 0
length (_:xs) = 1 + length xs

流用版

length xs = sum [1 | _ <- xs] -- 上のQ&Aと、要素数と同じ数だけ1が入ったリストを生成して足し合わせるのは等価

多分、手続き脳ですでにプログラミング出来てる人は、最初から抽象的に考える素養はあると思うので、仕様をそのまま書いてる感覚さえ分かれば、一気に関数脳になると思います


71 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 18:35:37.90 ]
昔Smalltalkという言語があったけど普及しなかった。
これは局所的なコードは手続き型のほうが恩恵あることを示している。
C++やJavaが受け入れられたのは局所的でないところでは
OOの援用が有効だということを示している。
関数型と対峙するのは手続き型。
受け入れられるとしたらOOと手続き型の中間地点なんじゃないかな。

72 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 18:46:14.25 ]
>>70
俺の場合、まず >>67 のように書いてから、それを発展させて初めて関数的コードになる感じになる
実は前スレの >>172 を書いたのも俺なんだが、同じようなコードをまず書いて、それを inject に直した
そこから更に発展させると関数型言語のコードとして成り立つようには出来ると思うが(inject→foldlの変換は難しくないし)
本当に関数型な人のアプローチとはやはり違う形になってしまうんじゃないかなと思う

73 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 19:03:33.53 ]
>>70
関数に焦点があたってるけどさ、
それより大きな範囲のオブジェクトはどうするのさ?

74 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 19:06:22.94 ]
>>71
昔は、手続き型とか関数型とかの選択肢より、切実にメモリやCPU速度が足りなくて、Cが選択されて、速度を損なわずOOP出来るC++が選択されてきた(OOPも最初はメモリの無駄が多いと敬遠されてきた)
PCの進化とともにLLが選択される場面が増えて来たのと同様に、関数型言語が選択される場面が増えても不思議ではない
・・・けど、C系列の言語が多く選ばれるんだろうな

do記法も、モナドが何となく分かってくると順番が重要な処理をこれまた仕様通りに書いてるだけって気付くし、手続き型を見事に矛盾無く関数型言語でエミュレートしてる事に気付いて鳥肌立つんだが
順序の無い関数の世界で順序の概念をエミュレートしてるって凄い!って

前スレの「テキストファイル読み込んで、行番号つけて表示せよ」ってのを読みやすく?書いてみた

import System.Environment

numbering xs = unlines $ map (\(x,y) -> show x ++ y) (zip [1..] (lines xs))

main = do
fnames <- getArgs
fstrings <- mapM readFile fnames
let numfstrings = map numbering fstrings
putStr $ unlines numfstrings

75 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 19:17:21.85 ]
速度やメモリの問題はJavaやJavascriptが普及した時点で終わってる。
とくにJavascriptは関数型風にも書けるけどただの趣味の範囲で終わってる。

76 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 19:18:44.83 ]
何を持って趣味なのかわからんけど、
ブラウザで動く言語はJavaScriptで決まりだよ。

77 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 19:22:04.44 ]
副作用なしラムダ計算だけで記述するJavascriptって意味なんだが



78 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 19:24:17.12 ]
順序をリストにしてるだけだと思うんだが

79 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 19:57:11.75 ]
速度やメモリからすれば
関数型言語は無駄が多いからね。

80 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 20:42:28.52 ]
>>71
Objective-CとC#は局所的であることを怖れないが、そういうのは受け入れられにくい

C++とJavaが受け入れられたのは、局所化でないところが実在するのではなく
漠然と、どこかそういうところに行きたいという願望があっただけだろう

81 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 20:43:30.86 ]
何言ってるかさっぱりわからんw

82 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 21:27:01.14 ]
>>73
意味が分からない

親が動物クラスで子が犬クラス・猫クラスとかのあれ?
型の性質を引き継ぐと言うのは型クラスとか有るけど・・・


ええと・・・で、そのオブジェクトで何をしたいの?どう拡張したいの?それって、オブジェクトである必要あるの?
犬か猫かに合わせて泣き声変えるんなら

data Animals = Dog | Cat deriving (Eq,Show)

voice a | a == Dog = "wan wan!"
voice a | a == Cat = "nya- nya-!"

これで十分なんだけど・・・そして、どっちもanimals型

犬は猫じゃないし、猫も犬じゃない

taroは犬で、taroという名前で、7歳
taro = (Dog,"taro",7)

miiは猫で、miiと言う名前で、3歳
mii = (Cat,"mii",3)

taroは猫じゃないし、miiは犬じゃない
let animalCategory (x,_,_) (y,_,_) = x == y

animalCategory taro mii
>False


83 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 21:30:52.01 ]
>>80
全部受け入れられている言語だと思うが・・・
言語なんて金になるかどうかで受け入れるかどうかが決まるもんだよ
関数型言語で金になる話が無いだけ
と言うわけで関数型言語でスマフォアプリ作れる環境を(ry


84 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 21:32:33.29 ]
>>82
犬とか猫を
どうやって関数型言語で表現するの?

85 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 21:35:40.55 ]
>>83
これを本気でいうからなぁ

86 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 21:54:02.37 ]
>>84
犬とか猫を
どうやってオブジェクト指向言語で表現するの?

まさか class Dog のインスタンスが犬なの?www

87 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 21:54:21.43 ]
>>83
言いたい事は分かったが、なんでUMLで分析しないの?
金銭の概念をオブジェクト指向分析すればいいのに、なぜ犬と猫なんだ?



88 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 21:57:00.90 ]
>>86
型と値の区別ついてるかな?

89 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 21:58:20.34 ]
>>88
もちろん
だからクラスではなくインスタンスだって言ってるだろ

90 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 22:08:10.34 ]
>>84
え、表現できてるでしょ?
むしろ、DogもCatもAnimalsに属してるのであって、オブジェクト指向のDogとCatがAnimalの子って言う関係の方が不自然だよ
そして、SnakeやLionが増えても、Animals型である限り、同じ関数が使えるし、せいぜい1つの機能に付き、一つの関数書き換えで済む(泣き声変えるために、いちいちクラスごとにvoiceメソッドを書く必要も無い)
OOPLでもジェネリックやテンプレートで型ごとにメソッド書くでしょ?
でもそれって、OOPLの利点じゃないと言うか、むしろ関数型言語の方が強力
voiceメソッドがAnimalクラスや、その子クラスにあるのは良いけど、animalCategoryメソッドをAnimalクラスが保持するのは不自然。そうなると、関数型では存在しない第3のクラスを作る必要が出てくる(Categoryクラスみたいな?)
関数型言語のデータはデータ。関数は関数。という関係の方が、シンプルに思える


91 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 22:08:18.46 ]
争いは、同じレベルの者同士でしか発生しないのAA

92 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 22:12:10.32 ]
>>90
それって、関数型言語でオブジェクト指向やってるだけですよね?

93 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 22:19:51.16 ]
>>82
一応さ、型クラス使った方が良いと思うので貼っとくね
Animalに動物足すたびに代数データ型を変更するのはアレなんで


class Animal a where
  voice :: a -> String

data Dog = Dog deriving (Eq, Show)
instance Animal Dog where
  voice _ = "wan wan!"

data Cat = Cat deriving (Eq, Show)
instance Animal Cat where
  voice _ = "nya- nya-!"

taro = (Dog, "taro", 7)
mii = (Cat, "mii", 3)

94 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 22:35:52.14 ]
>>87
いや、プロじゃないんでUML触ったこと無い
名前しか知らん

プロの視点で関数型言語とオブジェクト指向言語の生産性の比較とかやって欲しいところ

素人視点(=感覚的)では、LLとの比較でも、rubyやpythonは記憶力勝負(多くのメソッドを記憶してれば効率的。むしろ、何もメソッド知らない状態だとほぼ何も出来ない)
Haskellは少ない知識で割と素人でも何とかなる(既存の関数知ってる方が効率的なのはLLと変わらないが、何も知らない状態での開発効率に雲泥の差がある)

初学者へのモチベーション維持と言う意味では、関数型言語の方が向いてると思う
そして、最終的な生産効率はLLと変わらないか若干劣る(読みやすさ重視だとほぼ差がなくなる)

昔、length関数をrubyでどう書くの?と言う質問に対して、メソッドとクロージャ駆使して短いコードが返ってきた
素人じゃとても書けないと思った
Haskellなら基本的な再帰関数の作り方覚えるだけで作れるものが、LLだとそれなりの知識を必要とするのだと感じた瞬間だった


95 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 22:43:11.49 ]
>>73
Haskellばかり話題に登るのでMLに触れておくと、
MLにはモジュール(関数とデータの集合)というものがあり、
さらにモジュールを引数に取ってモジュールを返す関数(Functor)がある

これはOOPでいうとクラスからクラスへの関数を定義できるようなもの
カプセル化?差分プログラミング?全部余裕ですよ

96 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 22:48:52.63 ]
別に完全否定してるわけじゃないのにできますよって
余計なこと考えるだけのメリットが聞きたいのに

97 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 22:56:12.60 ]
メソッドをどのクラスに入れるか迷うようなことは無くなるね

例えば文字列のリストのjoinを
",".join(strlist) とするか
strlist.join(",") にするかみたいなね



98 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 23:05:31.47 ]
>>92
・・・・え?
オブジェクト指向設計って事?
意識したこと無いけど、これがそうなのか・・・

まあ、関数型言語は色んな角度の視点を許容する感覚はあるかな
何だろう。破壊的な代入が出来ない分、そのものの性質を見ようとする体質に自然となるような・・・

Haskell でリストの要素を swap する 9 つの方法
jutememo.blogspot.jp/2011/04/haskell-swap-9.html

>>70のlengthも視点の角度が違うだけで等価なものだしプログラミングHaskellの付録Aに書いてるlengthの定義もまた違う視点

length = foldl (\n _ -> n + 1) 0 -- 初期値0とリストの先頭要素を受け取るが、初期値に+1を繰り返すだけ、リストが空になったら蓄積変数(初期値0のもので、リストが空になるまでひたすら+1されてた変数)を返す

仕様の表現の仕方に色んな表現があるけど、OOPLや手続き型は表現自体を制限されてる感じ
だから、そのまま仕様をコードに落とせないと感じるのかも・・・




99 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 23:08:49.08 ]
OOも知らないで語ってたのかw

100 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 23:11:21.47 ]
ライムゲームを関数型で設計したら間違いなく不便

101 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 23:16:53.03 ]
すっぱそうだな

102 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 23:23:09.41 ]
>>99
でも、ぶっちゃけOOの定義定まってないだろ、このスレで
下手すりゃデータと関数を一纏めにしたらOO、くらいの勢いだぞ

103 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 23:32:16.09 ]
>>95
HaskellでもFancterやArrow使うと表現が広がるってのは良く見かけます
自分もMonadoやFancter・Arrowを自作できると楽しみが広がりそうで楽しみに学習続けてます
(でも現時点でさえ、Rubyでどう書くの?って処理もHaskellで書けてるのですでに関数型言語マンセーですが)

短く書けても、そもそも知識がないんじゃ書けないなら意味がない(と言うのは言い過ぎだが、学習コストが高い)
と言うのが私の持論です


104 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 23:42:25.23 ]
>>100
んなこたー無い
そもそも、ライフゲームはプログラミングHaskellで載ってる
入門書でライフゲーム書かせるOOPLの入門書って何があるよ
ちゃんと読めばdo表記やIOモナドの洗練されてる事が分かる



105 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 23:42:42.99 ]
最小公倍数は間違いなくあるだろ。
OOはオブジェクトを起点としたプログラミング(設計)
関数型ならλ計算を起点としたプログラミング

OO側は最小公倍数を前提してるものが多いのに対し
関数型は言語サポートでそれもできるというレスが多い(Haskeller以外のことね)

俺は関数型のメリットは副作用の排除の明示にあると思ってるから
OOベースの言語に相当の機能追加すればいいんじゃないのっていうスタンス
状態をベースにしないということはモナドで状態を表現して状態を引数
実際D言語はpureキーワードあるけどね

細部の状態を追い出すのは本末転倒(メリットが少ない)だと思うし
GUIやOSを見れば分かるように大枠から状態ベースをやめるのは直感的じゃないと思う。
状態を排除する方向じゃなくコーディングレベルで状態を追い出せる記述力を持たせる。

106 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 23:44:50.01 ]
>>104
もちろん読んでるから知ってるし自分で書いたよ
あれ書いててあれば作りやすいというならば完全に平行線だし
おれの感想は「うそつき」だね

ちなみにライフゲームはOOで書く必要ない。
「状態」をオブジェクト分割する必要性がほぼ無いから

107 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 23:51:09.92 ]
ちなみに>>104が言ってるのはこれね
www.cs.nott.ac.uk/~gmh/life.lhs



108 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/09(月) 00:02:29.16 ]
しかも「無理があると思える対話型プログラムを自然に書く」
というお題の章に乗ってるんだけどな。
つまり書けますよといっているだけでよりメリットがあるとは言っていない。

109 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/09(月) 00:06:55.06 ]
「無理がある」がかかってるのは「対話的プログラミング」の
部分であってライフゲームじゃない

そしてHaskellでもIO使えば無理じゃないことを学ぼう、という
内容になってるのはちゃんと読んだなら知ってるな






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

前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