関数型言語は何故普及しないのかを考える
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2010/10/11(月) 19:07:49このテーマの存在をどうかお忘れなきよう願います。
前スレ
関数型言語は何故普及しないのかを考える
http://hibari.2ch.net/test/read.cgi/tech/1277215506/l50
0652デフォルトの名無しさん
2010/12/22(水) 22:14:41あーそうなん?
悪貨が良貨を駆逐した例ってことなんかな?w
0653デフォルトの名無しさん
2010/12/22(水) 22:30:03Cできないんじゃお話にならない
0654デフォルトの名無しさん
2010/12/22(水) 22:34:410655デフォルトの名無しさん
2010/12/22(水) 22:41:58誰もCをやるなとは書いてないじゃん
Cから始める人、Haskellから、VBからと多様性があるのは悪い事でもあるまい
0656デフォルトの名無しさん
2010/12/22(水) 22:42:17最低限実行ファイルが作れる言語な
0657デフォルトの名無しさん
2010/12/22(水) 22:43:22なぜ
0658デフォルトの名無しさん
2010/12/22(水) 22:43:36その次はLisp、その後にC
0659デフォルトの名無しさん
2010/12/22(水) 22:52:34haskellのunsafeCoerceはどうよ?
その論理だと、haskellもC同様型付けは弱い言語になるのでは
0660デフォルトの名無しさん
2010/12/22(水) 22:59:45Cだとキャストとかcoerceのために何の呪文も唱えず
ごく普通にこういう風に代入できるし、勿論誰もチェックしないし、
ポインタを使ったunsafeなコードを隔離するのも困難なので
さすがに一緒にはできないのでは
void *p = "Don't do this" + 1;
int *np = p;
*np++ = 12345;
0661デフォルトの名無しさん
2010/12/22(水) 23:22:25作ったプログラムを配布しやすいからじゃないか?
初心者が自習するのには、関係ない話ではあるが。
>>659
void*、union、...(さらに、マクロも入れるべきか)は、一種の「呪文」だと思う。安上がりで、
genericityを手に入れるための。
0662デフォルトの名無しさん
2010/12/22(水) 23:27:45Cの問題は、ごく普通のプログラムでもしばしばその種の呪文に触れる
必要があるってことかな
0663デフォルトの名無しさん
2010/12/22(水) 23:49:01なのに、静的な型付けのおかげで安全だ、とミスリードする
こういう呪術的なものは本当にごく普通にある
0664デフォルトの名無しさん
2010/12/22(水) 23:57:31デバッグモードで詳細が取れれば言語仕様を安全にする必要はないんだが
0665デフォルトの名無しさん
2010/12/23(木) 00:10:500666デフォルトの名無しさん
2010/12/23(木) 00:14:36お前の言う「正常に出来上がって動き出したら無駄な負荷でしかないコンパイルチェック」
って何の事だ?
0667デフォルトの名無しさん
2010/12/23(木) 00:16:400668デフォルトの名無しさん
2010/12/23(木) 02:21:280669デフォルトの名無しさん
2010/12/23(木) 02:36:51マシン語アセンブリ語やれば自動的にCもできるじゃん
Cなんて汎用アセンブラ以外の何者でもないだろうに
0670デフォルトの名無しさん
2010/12/23(木) 02:38:120671デフォルトの名無しさん
2010/12/23(木) 02:44:050672デフォルトの名無しさん
2010/12/23(木) 08:58:290673デフォルトの名無しさん
2010/12/23(木) 13:11:160674デフォルトの名無しさん
2010/12/23(木) 13:20:30頭が良くなる
0675デフォルトの名無しさん
2010/12/23(木) 13:23:500676デフォルトの名無しさん
2010/12/23(木) 13:34:31たとえば10進数を2進数に変換するときに
順番に2で割っていって最後に逆順に表示
ってことをやるんだけどこれを再帰的に
プログラムに書くとどうなりますうか?
0677デフォルトの名無しさん
2010/12/23(木) 14:11:14Haskellだと、例えばこんな感じかな:
num2binlist n = let{ f 0 [] = [0]; f 0 l = l; f n l = f (n `div` 2) (n `mod` 2 : l) } in f n []
0678デフォルトの名無しさん
2010/12/23(木) 14:15:49大雑把に言えば、関数型言語は
全ての計算を(写像とほぼ同義な)関数の評価によって行う言語だよ。
一方C言語なんかの手続き型言語は、
状態を変化させる命令によって全ての計算を行うんだよ。
> それ極めると、C言語で再帰関数が簡単に書けるようになるの?
「再帰」というものの考え方はどの言語でも同じだよ。
だから、例えば Java を極めればCでの再帰関数が簡単に書けるようになる、
とも言えてしまう。
C言語で再帰が理解できない人は関数型でも他言語でも理解できないよ。
どれでも理解するのに同じくらいの努力が必要になるね。
ちなみに関数型では、現実的には再帰計算を明示的に記述することはあまりないよ。
ふつうは再帰計算を暗黙的に行う高階関数(関数を引数に取ったり返したりする関数)が
すでにライブラリで用意されているから、可能な限りそれを駆使するよう努める。
その方がプログラムソースの見通しが良くなるし、
おまけとしてコンパイラの最適化機能を働かせるのが簡単になるからね。
(これについては私が知ってるのは Haskell だけだが、他の言語でも似たようなものでしょ)
0679デフォルトの名無しさん
2010/12/23(木) 15:11:51(labels ((f (i binlist)
(if (zerop i)
(or binlist 0)
(f (truncate (/ i 2)) (cons (mod i 2) binlist)))))
(f n nil)))
0680デフォルトの名無しさん
2010/12/23(木) 15:25:46(define (f x)
(if (= x 0) '()
(begin (f (quotient x 2)) (display (logand x 1)))))
0681デフォルトの名無しさん
2010/12/23(木) 15:41:06void printbin(unsigned n)
{
if (n > 1) printbin(n >> 1);
printf("%u", n & 1);
}
ってとこだろ
これだけだとCでも十分短くて大して変わらんけど、
これでは印字する以外の使い道が無いので汎用性が低い
リストのような形で数の列を簡単に扱える言語なら、印字するのではなく
リストを返す関数にすれば汎用性を高められる
この例だと生成される数の列が有限にしかならないが、
そうとは限らない問題の場合は、無限リスト的な物を扱える言語なら、そう作ることで
より汎用性を高められる
0682デフォルトの名無しさん
2010/12/23(木) 15:51:26とりあえずprintしといて後でreverseできるよって例を書こうとして
ググってもビット演算子が出てこんから挫折した\(^o^)/
0683デフォルトの名無しさん
2010/12/23(木) 16:36:10順番にnで割っていって最後に逆順に表示
ってことをやるんだけどこれを再帰的に
プログラムに書くとどうなりますうか?
0684デフォルトの名無しさん
2010/12/23(木) 16:44:51あるよー。超あるよー bit演算子:
http://www.haskell.org/ghc/docs/6.12.2/html/libraries/base-4.2.0.1/Data-Bits.html
0685デフォルトの名無しさん
2010/12/23(木) 16:46:21http://hibari.2ch.net/test/read.cgi/tech/1289292155/477
関数型言語でどうやるかはしらない。
0686デフォルトの名無しさん
2010/12/23(木) 17:18:242進数はn進数の一種だからbit演算子より整数の割り算と余りの方が良いのでは?
http://haskell.org/ghc/docs/7.0-latest/html/libraries/haskell2010-1.0.0.0/Prelude.html
>div :: a -> a -> a
> integer division truncated toward negative infinity
>mod :: a -> a -> a
> integer modulus, satisfying
> (x `div` y)*y + (x `mod` y) == x
>divMod :: a -> a -> (a, a)
> simultaneous div and mod
0687デフォルトの名無しさん
2010/12/23(木) 19:20:00超ありがとう。満足♪
f :: Int -> IO ()
f n = if n==0 then return () else f (Data.Bits.shiftR n 1) >> (printf "%d" (n .&. 1))
g n k = if n==0 then return () else g (div n k) k >> (printf "%d" (mod n k))
reverseを使ってみた版
当初IO [a]をliftMでreverseみたいなのが頭の中にあったものの
printとかじゃIO[a]は作れなかったので
結局リストに入れただけ
思ったより複雑になってしまったし
あまり利点が感じられなかった
h:: Int -> Int -> [IO ()]
h n k = if n==0 then [] else (printf "%d" (mod n k)) : (h (div n k) k)
i n k = List.reverse $ ((putStrLn ""):(h n k))
j k n = List.foldl (\a b -> a >> b) (return ()) (i n k)
tester k = mapM_ (j k) [1..10]
--2進数と3進数で10まで出力
main = tester 2 >> tester 3
0688339
2010/12/23(木) 19:36:49規制で書けなかった
おまえは一行で言語の仕様を全て把握できるんだな?
定義しようが同じ関数には違いないんだろ?
a <== b <== c <== d
<==は関数であり文の外で定義されているものとする
<==はxクラスを受け取ってyクラスを渡す
ab間bc間cd間が同じ関数だと知ることができる
関数は関係そのものである
従って同じ関係であると"知ることができる"
e<==(f<==(g<==(h)))
g<==メソッドはmクラスを受け取りnクラスを渡す
f<==メソッドはnクラスを受け取りmクラスを受け取っていない
同じ関係となるためには渡すクラスもmクラスにする必要がある
ところがそれを一箇所で定義できないため確信できない
定義が誤って一致したとしても文中でそれを知る術が無い
コピペを変更し忘れた場面を想像して欲しい
したがって同じ関係かどうか"知ることができない"
OOPLも演算子オーバーライドを使えば書くことはできる
だがそれはOOPLに不要な機能とされている
現にJAVAはC++との差別化を図りそれを削っている
C++もCの思想を優先したに過ぎない
「プログラマーのできることを制限しない」という思想だ
すなわち高級言語とは真逆の思想だ
0689339
2010/12/23(木) 19:38:22a(b)
aとbが関数でありxクラスを受け取ってxクラスを返すものとする
するとaとbを入れ替えて書くこともできる
入力に関わらず同じ値を返す関数を想像してくれ
全体の関係は変わるがaとbの定義は変わらない
述語と目的語が場面によって換わるので自然言語的とは言えない
e.f
OOPLで入れ換えるにはf.eを別に定義することになる
同じ名前であってもオブジェクトとメソッドという定義が変わる
したがって入れ換えることができず自然言語的と言える
人は理由も無く面倒なことはしたがらない
ましてそれが良くないと判っていればなおさら
つまり面倒であることが抑止力になるということ
関数型は自然言語的でないしそれっぽく書くのも面倒
上の例で判るように一文に関数を詰め込んだ方が書き易いから
思想が反映された書き方の違いこそ言語の違い
高級言語は何をできるかより何をできないかに存在意義がある
関数型はOOPLより少しできてしまうから低級なだけ
低級な言語を理由無く使おうとしないのが人間の心理
普及させたければ使う理由を作ってやれば良い
0690339
2010/12/23(木) 19:40:57じゃあ自分と何かとの関係を考えてみてくれ
├──関係─→┤__何か__│
関数型であればこうなる
├──関数─→┨__何か__┃
何かが関数であればこうなる
├──関数─→┨__関数__┃
関数は直接扱える
扱えないと既に関係を扱っていることと矛盾するため
関数を直接扱えるということは関数を知ることができる
関数は関係そのものだから関係も"知ることができる"
どこからどの関数なのか境界が曖昧になるところに注目
それこそが参照透過性や遅延評価の有無になる
OOPLであればこうなる
┃___オブジェクト____┃
├─メソッド→┨__何か__┃
何かがオブジェクトであればこうなる
┃_______オブジェクト_______┃
├─メソッド→┨___オブジェクト____┃
├─メソッド→┼─メソッド→┨__何か__┃
オブジェクト以外の何かは直接扱えない
直接何かを扱うことがオブジェクトの定義に反するため
従ってメソッドは直接扱えず知ることができない
メソッドは関係そのものだから関係も"知ることができない"
関数型はミクロの関係を扱おうとする
OOPLはマクロの関係を扱おうとする
相反する概念なのだから良いとこ取りはできない
関数型言語を知らなくても本質は語れる
関数とオブジェクト指向を理解してればな
これでも解らないならもう知らん
0691デフォルトの名無しさん
2010/12/23(木) 20:33:55そうだな、俺が悪かった、もう許せ
0692デフォルトの名無しさん
2010/12/23(木) 21:25:59>>622は論理回路、金融デリバティブと書いてるが他にもある?
0693デフォルトの名無しさん
2010/12/23(木) 21:31:32科学技術計算ではFORTRANに勝てず
低水準の仕事ではCやアセンブラに勝てず
事務計算ではCOBOLに勝てず
WebではJavaやLLに勝てないから
きんゆうでりばてぃぶとかになるのか?
0694デフォルトの名無しさん
2010/12/23(木) 21:39:230695デフォルトの名無しさん
2010/12/23(木) 22:00:50おもちゃとして遊びに使われるに決まってる
おれは Haskell で遊んでるぞ
0696デフォルトの名無しさん
2010/12/23(木) 22:09:140697デフォルトの名無しさん
2010/12/23(木) 22:15:050698デフォルトの名無しさん
2010/12/23(木) 22:25:29parseん:じいさん、manyはさっき(コンパイラが)食ったばかりですよ
0699デフォルトの名無しさん
2010/12/23(木) 22:44:52状況とか価値の判断がおかしくなるんだよ
幼児よりもキチガイに近い
もともと頭の悪かったやつにプログラミングなんてやらせても意味ない
0700デフォルトの名無しさん
2010/12/23(木) 22:49:11さすがにCOBOLには勝ってるのでは…
それと、低水準の処理でアセンブラに「勝てる」言語など、永遠に登場しないだろう。
コンピュータ・アーキテクチャが変わりでもしない限り。
0701デフォルトの名無しさん
2010/12/23(木) 23:21:24いやマジでつっこまれてもw
COBOLって任意桁数のBCD演算やらISAMやらを組み込みで持ってて
メインフレームの固定長データセットに非常に相性が良いようだし
COBOLが使われてる分野では未だに圧倒的なシェアを誇る言語だと
思っていたけど、何しろ全然詳しくないので…
事務処理の世界はもう関数型の独壇場だったのか?
0702デフォルトの名無しさん
2010/12/23(木) 23:30:170703デフォルトの名無しさん
2010/12/23(木) 23:33:430704デフォルトの名無しさん
2010/12/23(木) 23:36:57例えば給与明細の紙を出力するためにデータベースからデータを取ってきて
それを整形表示して印刷とかそんなの?
0705デフォルトの名無しさん
2010/12/23(木) 23:38:50相当範囲は広い。
0706デフォルトの名無しさん
2010/12/23(木) 23:44:160707デフォルトの名無しさん
2010/12/23(木) 23:46:38勝てないのに普及させるのは相当難しくないか?
0708デフォルトの名無しさん
2010/12/23(木) 23:48:49うん俺もそんなんをイメージしていた
汎用機にもツリー型とかリレーショナルなデータベースはあるはずだけど
固定長のISAMファイルって要するに簡易的なデータベースだから
ただのISAMでやってるケースも多いのではと思われ
バッチだけでなくオンライン的な処理が必要な場合は
資源管理のためにトランザクションモニタとかジョブキューとか使うんだろう
Javaは特別にその種の仕事に特化した言語じゃないから、
J2EEあたりのブクブクに太ってた頃のJavaでリプレースしようとして
泣いた会社は結構あるのでは
全然詳しく無いし、ただの想像だけど
0709デフォルトの名無しさん
2010/12/23(木) 23:50:110710デフォルトの名無しさん
2010/12/23(木) 23:51:080711デフォルトの名無しさん
2010/12/23(木) 23:53:350712デフォルトの名無しさん
2010/12/23(木) 23:57:45C++, Java, C#, Flash/ActionScript, Luaといったあたり?
0713デフォルトの名無しさん
2010/12/24(金) 00:06:06アダルトに特化するしかない
0714デフォルトの名無しさん
2010/12/24(金) 00:06:32メーカによりけりだろ?
メーカー固有のゲーム製作言語とかあったりするし…
0715デフォルトの名無しさん
2010/12/24(金) 00:09:36つまり「大人のおもちゃ」か!
0716デフォルトの名無しさん
2010/12/24(金) 00:22:33Real World Haskell を成人図書コーナーに置けば
中高生が隠れて読み耽るだろう
0717デフォルトの名無しさん
2010/12/24(金) 05:45:44http://www.indeed.com/jobtrends?q=Perl,PHP,Python,Ruby,COBOL,Fortran,Lisp,SML,Haskell
COBOLの求人はLLに抜かれましたが、関数型言語の数十倍あります。
http://www.indeed.com/jobtrends?q=Lisp,SML,Haskell,Scala,Clojure
古参をごぼう抜きしたScalaは普及が続くかも知れません。
0718デフォルトの名無しさん
2010/12/24(金) 07:46:13プログラムしてて楽しければ、役に立たなくてもいいじゃん
(応用じゃない)純粋な数学と同じだよ
0719デフォルトの名無しさん
2010/12/24(金) 07:48:44なんで考えるかというとそういう趣旨のスレだから
0720デフォルトの名無しさん
2010/12/24(金) 07:49:13Webアプリを簡単に組めないプログラム言語を
探す方が難しい。
0721デフォルトの名無しさん
2010/12/24(金) 07:52:41数学的思考が出来ないドカタは理解出来なくて当然!
こういう上から目線が多いから、いつまでたっても普及しない。
0722デフォルトの名無しさん
2010/12/24(金) 07:53:07あると、将来その分野に進出するケースも
想定して忌避することはある。関数型言語の
場合ここら辺はあるのかな。
0723デフォルトの名無しさん
2010/12/24(金) 07:54:35それは、はっきりいって、あると思う。
0724デフォルトの名無しさん
2010/12/24(金) 09:33:09まあ、プログラム言語としての利用じゃないわけだけどね。
0725デフォルトの名無しさん
2010/12/24(金) 10:14:050726デフォルトの名無しさん
2010/12/24(金) 10:33:39数値計算とか数式処理って専用のソフト使わないの?
matlabとかmathematicaとか
0727デフォルトの名無しさん
2010/12/24(金) 10:58:42そもそも関数型を本当に普及させたいのかと疑問に思う
自分はポルシェを乗り回せるぜ、というひとは、ポルシェがカローラになるより
ポルシェのままのほうがうれしいのでは?
0728デフォルトの名無しさん
2010/12/24(金) 12:36:18それもあるし、関数型が普及する必要があるとみんな思ってるのかも疑問
普及する必要あるのか?
無ければ普及しないぞ
0729デフォルトの名無しさん
2010/12/24(金) 13:23:24Haskellは、IOモナドが分かりにくいのが一番の理由じゃないかな。
副作用を分かりやすく形式化したもののはずなのに、これが分かりにくくて普及しないって、にんともかんとも。
0730デフォルトの名無しさん
2010/12/24(金) 15:37:43部分評価とか非正格評価は分散サーバとかに使える。
純粋ナンタラで美しいィィ!とか
モナドはストリームより表現力が上ェェェ!
とかはどうでもいい。
0731デフォルトの名無しさん
2010/12/24(金) 15:56:03普及した方が、給料は上がる。
0732デフォルトの名無しさん
2010/12/24(金) 16:29:50一般に、普及すると仕事は増えるけど給料は下がるのでは
需要「だけ」が増えれば給料も上がるかもしれないが
そういう都合のいい普及の仕方ってあるのだろうか
0733デフォルトの名無しさん
2010/12/24(金) 16:49:37普及の程度にもよるけど。10年後に世の中の主流が
Haskellになると周知されたら、今、ソフトウェアハウス
で月給40万のHaskellプログラマの月給は転職前提で
100万を超える。そういう意味で。それを夢見て。
0734デフォルトの名無しさん
2010/12/24(金) 17:01:220735デフォルトの名無しさん
2010/12/24(金) 17:43:361番でなくては。
0736デフォルトの名無しさん
2010/12/24(金) 19:11:45その給料を出す方から見た関数型の必要性は?
0737デフォルトの名無しさん
2010/12/24(金) 21:20:09最近の数値計算はMatlabとC、C++が主流っぽい
0738デフォルトの名無しさん
2010/12/24(金) 21:22:460739デフォルトの名無しさん
2010/12/24(金) 21:29:580740デフォルトの名無しさん
2010/12/25(土) 00:21:59やはり、Webかクラウドに最適だと言えなきゃね。
0741デフォルトの名無しさん
2010/12/25(土) 00:53:530742デフォルトの名無しさん
2010/12/25(土) 01:04:590743デフォルトの名無しさん
2010/12/25(土) 01:15:03マルチコアCPU時代のプログラム言語は関数型言語でウッドボールって
説はどうなったの?
最近、あんまり聞かないから、フカシだったの?
0744デフォルトの名無しさん
2010/12/25(土) 01:57:05「ねぁ、はやく。はやく、あなたを感じたいの!」
「ふふ… ここかい? ここが君のメールボックスなのかい?」
「そうそうよ。はやく、あなたの… あなたのメッセージを私にいれて」
「いいね? 一緒に動くんだよ」
「いいから、はやくあなたのメッセージをいれてったら!」
>>743
「あら? 早漏?」
0745デフォルトの名無しさん
2010/12/25(土) 02:34:54ItaniumのEPIC向けの最適化にも関数型言語が適してるなんて話もあったなw
0746デフォルトの名無しさん
2010/12/25(土) 02:52:54って、以下の考え方でおk?
(L1 L2 L3 ... Ln)
で、L(k+1)はLkの結果とは関係がない
Lkは互いに無関係だから別々のスレッドで処理できる
さらにLkは
(M1 M2 ... Mn)
で、M(k+1)は以下略
どんどんスレッド増えていくからうまくいってないのかな
0747デフォルトの名無しさん
2010/12/25(土) 03:00:50条件が厳しすぎると思う。状態の概念は導入しないと。
0748デフォルトの名無しさん
2010/12/25(土) 05:50:090749デフォルトの名無しさん
2010/12/25(土) 09:12:080750デフォルトの名無しさん
2010/12/25(土) 11:18:390751デフォルトの名無しさん
2010/12/25(土) 13:20:41関数型って難解なのか?
何年もかけて習得した手続き型でのテクが使えないから
最初は手も足も出ないが
■ このスレッドは過去ログ倉庫に格納されています