関数型と手続き型
at TECH
1:デフォルトの名無しさん
06/04/16 00:46:11
大きな二つの流れである関数型と手続き型について議論・学習するスレです。
両者のメリット、デメリット、得意・不得意分野などをまなびませう。
2:デフォルトの名無しさん
06/04/16 00:59:14
関数型なんて一部のマニアが趣味で使っているだけだろ。
3:デフォルトの名無しさん
06/04/16 01:08:41
手続き型は文系・原始人
関数型は理系・知的
4:デフォルトの名無しさん
06/04/16 01:09:18
エージェント指向
5:デフォルトの名無しさん
06/04/16 01:28:33
erlangは関数型だけど,実用的なものに使われてるよ。
6:デフォルトの名無しさん
06/04/16 06:01:15
一階述語論理は?
7:デフォルトの名無しさん
06/04/16 07:30:18
>>2
関数型は馬鹿を切り捨てるぶん、浸透しにくいよね。
8:デフォルトの名無しさん
06/04/16 08:28:21
C++はSTLのあたりから結構関数型風に傾いていないか?
9:デフォルトの名無しさん
06/04/16 09:15:10
C#でのdelegate、Generics,インターフェースを駆使したものでの生産性と関数型の生産性は異なるの?
10:デフォルトの名無しさん
06/04/16 12:26:25
>>7
教育の問題だと思う。初めてプログラミングを教えるときに使う言語をPrologとかSchemeみたいなのにすれば浸透すると思う。
私は命令型の言語よりもPrologのような論理型言語を使った方がプログラムしやすい。
11:デフォルトの名無しさん
06/04/16 12:29:59
>>10
Prologは言語というよりも証明支援系・・・かな?
12:デフォルトの名無しさん
06/04/16 12:35:27
>>11
ふつうのプログラミング言語だよ。ライブラリは少ないかもしんないけど。
13:デフォルトの名無しさん
06/04/16 12:44:23
手続き型→一般人
関数型→厨房・暇人
14:デフォルトの名無しさん
06/04/16 13:39:51
手続き型のアホに対する優しさは異常
15:デフォルトの名無しさん
06/04/16 13:48:00
>>8
無い。
16:デフォルトの名無しさん
06/04/16 14:16:38
object is poormans closer!!!!!!!!!!!!
17:デフォルトの名無しさん
06/04/16 14:17:43
>>14
手続き型っていうか、代入型は初心者がバグを書くのを助けてくれる。
18:デフォルトの名無しさん
06/04/16 14:18:13
>>15
使ってない人が反応しなくていいです(^^)
19:デフォルトの名無しさん
06/04/16 14:35:21
>>18
お前のことだろw
20:デフォルトの名無しさん
06/04/16 15:17:58
>>8
関数型というより静的(コンパイル時)に決められるものは
徹底的に静的に決めるということだな。
仮想関数はなるべく使わない。クラスを避ける。
自然と関数指向になる。
21:デフォルトの名無しさん
06/04/16 16:45:23
ここで手続き型と関数型の違いについて質問でてるけど、まともな答え返ってこないね。
スレリンク(tech板)
22:デフォルトの名無しさん
06/04/16 16:46:17
>>20
> 関数型というより静的(コンパイル時)に決められるものは
> 徹底的に静的に決めるということだな。
>仮想関数はなるべく使わない。クラスを避ける。
という説明から
> 自然と関数指向になる。
これにはならんのだが。
関数型というものを、勘違いしている人のいうセリフだな。
23:デフォルトの名無しさん
06/04/16 17:14:11
手続き型と関数型の違いはプログラミングスタイルじゃないかな。
* 手続き型
状態の変化を脳内でシミュレーションし,プログラムを作成。その状態の変化というのが代入などの副作用。
* 関数型
事実を定義し,それらの事実と事実との関係を構築しプログラムを作成。
24:デフォルトの名無しさん
06/04/16 17:17:15
関数型、手続き型でおのおの得意なプログラム、苦手なプログラム、出来ないプログラムってあるの?
25:デフォルトの名無しさん
06/04/16 17:18:21
できないプログラムはありません。実はラムダ式に帰着できちゃいます。
26:デフォルトの名無しさん
06/04/16 17:19:43
関数型の生産性と持続可能な発展性は美味しい
27:デフォルトの名無しさん
06/04/16 17:20:35
向き不向きは?
後ラムダ式に帰着できるって言うのはマシン語に帰着できるというような極論?
28:デフォルトの名無しさん
06/04/16 17:23:12
遅延評価があるとリアルタイム処理が難しくならない?
29:デフォルトの名無しさん
06/04/16 17:26:47
>向き不向きは?
あると思う。
>後ラムダ式に帰着できるって言うのはマシン語に帰着できるというような極論?
その通り。
30:デフォルトの名無しさん
06/04/16 17:29:41
関数型は馴染みが無いが、説明的なところを読んで解釈して書いてみる。
間違ってたらスマソ。
関数型は参照透過性を前提としているから、
途中の「代入」などの状態変化要因がある限り本当の関数型にはなりえない。
なにせ関数型はプログラムの全てを"数学的な意味での関数"として記述するので参照透過性が保たれるのは当然。
f(a,b,c) = 3*a^3 - 5*b^2 + c
こういう代数方程式をプログラムとして記述するのが関数型。
(手続き型は手順というかフローチャートをプログラムとして記述するもの)
(論理型は複数の命題の組み合わせをプログラムとして記述するもの)
関数型ならこうプログラムが組める(こんな言語あるかは知らんが)
hlwd(str) = strcat("Hello! ", str)
main(argv) = putstr(hlwd(argv))
>main("World")
Hello! World
手続き型で書くとこうなる(こっちも言語仕様は適当)
main(argv){
string str="Hello! ";
strcat(str,argv); //第1引数と第2引数の文字列を結合し、第1引数へ返す
print(str)
}
31:デフォルトの名無しさん
06/04/16 17:31:39
あらゆる計算モデル、つまりチューリングマシン、帰納的関数論、またはActor理論、etc..はλ計算で表現できます。
32:デフォルトの名無しさん
06/04/16 17:42:13
結局さぁ・・・
普通のプログラムだと、データ受信したとか、入力があったとか何らかの起点があるよね?
そこからの流れが関数として書かれてるってこと?
状態の保持とかどうすんの?
状態持つとかだったら、オブジェクト型のほうが人の思考になじみやすいってこと?
で、どこら辺で生産性があがるのよ?
33:デフォルトの名無しさん
06/04/16 17:44:02
んな小難しいことしなくても
手続きっぽいの
kekka = nanka_no_function( nantoka kantoka )
if kekka then
print ( "dekitayo!" )
else
print ( "dekine-yo!" )
関数っぽいの
print (
if nanka_no_function( nantoka kantoka ) then
"dekitayo!"
else
"dekine-yo!"
)
34:デフォルトの名無しさん
06/04/16 17:47:23
あ、手続きのは"dekitayo!"とかをstringの変数に入れたほうがよかったか。
バカっぽくてごめん。
35:30
06/04/16 17:49:33
関数型には if も else も存在しない。
なぜなら状態という概念が無いから状態によって変化、分岐するということが無いから。
36:デフォルトの名無しさん
06/04/16 17:50:19
なぁそのコンパクトに書けるっていうのじゃなくてさぁ・・・ほらこう・・・あるだろ?
関数型がこう・・・いいって言われるものがさぁ・・・あるんだよな?
37:デフォルトの名無しさん
06/04/16 17:51:21
生産性は下がるんじゃねーの?関数型はマイナーなんだし。
38:デフォルトの名無しさん
06/04/16 17:58:08
>>35
嘘をつくな。
例えば
abs x = if x > 0 then x else -x
は数学的な意味で関数だ。
39:デフォルトの名無しさん
06/04/16 18:00:45
>>37
そういう次元の話じゃない。
40:デフォルトの名無しさん
06/04/16 18:17:12
関数っていうのは基本的には、
特定の集合に特定の一つの集合を結びつける規則という縛りしかない。
41:デフォルトの名無しさん
06/04/16 18:26:42
確かに馬鹿文系に無理に使わせるのは却って生産性を下げるな。
使いこなせないだろうから。
42:デフォルトの名無しさん
06/04/16 18:29:41
×生産性があがる
○抽象性があがる
43:デフォルトの名無しさん
06/04/16 18:34:20
ラムダとかクロージャとか、
最近の手続き型言語と言われてる言語にも
それなりに導入されてるしな。
直接的なものでなくとも、
言語機能を使えばそれなりに簡単に実装できる、とか。
純粋な手続き型言語ってのはそのうち死滅しそうだが、
だからといって純粋な関数型言語もずっとマイナーでいつづけるだろうな。
44:デフォルトの名無しさん
06/04/16 20:00:58
これが手続き型、
if( ... ) { ... } else { ... }
これが関数型。
... ? ... : ...
if を使わないで、三項演算子だけを使って作れば関数型っぽくなる。
45:デフォルトの名無しさん
06/04/16 20:02:32
人間の考え方は、手続き型です。
だから手続き型の方が人間に分かりやすいのです。
46:デフォルトの名無しさん
06/04/16 20:11:12
>>44
if使う使わないの話は関数型,命令型に関係ない。
もともとCは関数型のスタイルでプログラミングするように設計されてない。Cで関数型プログラミングできないことはないけどやりにくい。
47:30
06/04/16 20:32:15
>38
Wikipedia項目リンク
数学上の絶対値の定義。
>abs x = if x > 0 then x else -x
これ数学的な意味での関数の書き方じゃないから。
Cでかくとこうなるけどね。
double abs(double x){
if(x > 0) ;
else x*=-1;
return x;
}
そもそも条件分岐している時点で「状態」が存在しているわけだから純粋な関数型じゃない。
48:デフォルトの名無しさん
06/04/16 20:39:16
>>47
お前が言うところの「数学的な意味での関数の書き方」て何よ
49:デフォルトの名無しさん
06/04/16 20:44:08
>>48
自然言語が入っちゃマズイとか、
連続していないといけないとか、
定義域が実数じゃないといけないとか、
なんだか色々元の定義とは別のもの仮定してそう。
関数型と数学の関数は違うんじゃないのかな。
50:デフォルトの名無しさん
06/04/16 20:46:35
>>47
条件分岐のどこに状態がある?値を渡す時間によって帰ってくる値が変わるっていうなら状態があるっていうけど。
51:デフォルトの名無しさん
06/04/16 20:48:22
もうこいつら何について話してるのかわかんね。コンテキストがあってねー。
52:デフォルトの名無しさん
06/04/16 20:49:46
結論:誰も分かってる奴がいない。
53:デフォルトの名無しさん
06/04/16 20:50:55
>>51-52
MediatorパターンとAdapterパターン使って。
54:38
06/04/16 21:08:29
>>47
数学を引き合いに出したのがまずかったなら言い直すが、
abs x = if x > 0 then x else -x
は正しいHaskellの関数定義(MLでもちょっといじれば通るはず)。
55:30
06/04/16 21:27:18
>54
そういうことでなら納得。確かに参照透過性は損なわれないわけだし。
56:デフォルトの名無しさん
06/04/16 21:45:19
つまり、数学のための言語であって
実用的じゃないのが関数型でいいの?
57:デフォルトの名無しさん
06/04/16 21:50:40
>>56
よくないです
58:デフォルトの名無しさん
06/04/16 21:54:04
>>56
違う。
モデル化する方法が異なるだけ。
ディジタル回路を扱うときに使う言語とアナログ回路を扱うときに使う言語の違いのようなもの。
それに実用的に使える。
59:デフォルトの名無しさん
06/04/16 23:03:43
ビジネスというのは最初がローコストに見えることが重要。
安く導入して保守費用で儲けたりさ。そういう観点から見ると手続き型しかありえんのだわ。
60:デフォルトの名無しさん
06/04/16 23:24:44
つはっかーと画家
61:デフォルトの名無しさん
06/04/17 01:02:51
手続き型の言語ばかりやっていると新しい言語の習得が難しくなりコストがかかる。
Schemeみたいな関数型と手続き型の両方のプログラミングスタイルが気軽に扱える言語を覚えた方がトータルで考えると低コストだと思う。
62:デフォルトの名無しさん
06/04/17 03:48:16
手続き型に組み込まれた関数型は実用的だけど、
純粋関数型は実用的だとは思えない。
63:デフォルトの名無しさん
06/04/17 03:50:57
たとえば、Javaの総称型が関数型言語の多相型を取り入れたものだということは明らかなんだけど、
元からの言語仕様に強制的にねじ込んだものだからひどく煩雑なつくりになっている。
あれなら素直に関数型言語を使ったほうが良いとさえ思う。
64:デフォルトの名無しさん
06/04/17 03:56:53
>>62
純粋関数型言語で作られた実用的なアプリ。
URLリンク(www.wings3d.com)
思う、思わないはどうでも良いけど、要は使いようですぜ。
頭脳が固まっちゃったら、もうお仕舞いだけどね。
;; 予め言っておくが、他にはって聞かれたら、次は darcs 出すから聞くなよ。
;; 際限無いからな。
65:デフォルトの名無しさん
06/04/17 04:18:01
>>64
英語じゃなくて日本語のやつは無いの?
66:デフォルトの名無しさん
06/04/17 10:24:28
>>64 正直オブジェクト指向に頭が固まってるんだが・・・関数型だとオブジェクトとかどうとらえるの?
そうはとらえんのか?
たとえば、ブラウザ作るとして開いてるページとその中身のhtmlとかはどんな感じに保持するの?
67:デフォルトの名無しさん
06/04/17 11:29:57
>>66 俺も。○○指向、という点ではオブジェクト指向に
頭が固まっちゃってる。問題を解決するに当たって
どんな風にクラスにモデル化するかということばかり
考えてしまう。関数型プログラミングとオブジェクト指向
プログラミングって相性悪い?
ぜんぜん的はずしてるかもしれないけど、 Emacs Lisp
いじってるときはオブジェクト指向の頭が取れてる気がする。
68:67
06/04/17 11:43:11
で、なんで相性悪いって気になるのか
仕事中にもかかわらずぼーっと考えてみたんだけど、
オブジェクトの内部状態って関数型プログラミング
ではどうやってあらわすのよ?ってオモタ。
69:デフォルトの名無しさん
06/04/17 11:49:23
>>68
純粋な関数型ではないけどSchemeだったらクロージャと代入を使ってオブジェクトを作る。
純粋な関数型の場合,詳しくはないけど,クロージャとモナドを使うんじゃない?
70:デフォルトの名無しさん
06/04/17 11:52:43
>>69 挿すっと今度は逆にオブジェクト指向を関数型で実現するのに無理してる。最初からオブジェクト指向言語使えばいいのにって感じになるのか?
71:デフォルトの名無しさん
06/04/17 12:05:02
>>70
うん。オブジェクト指向で考えた方が楽なら無理して関数型を使う必要はないと思う。SmalltalkとかRubyみたいな言語を使った方がいいと思う。
72:67
06/04/17 12:07:44
>>71 それが混在してるのが悩ましいところなんだよな。
73:デフォルトの名無しさん
06/04/17 12:34:49
逆に手続き型の言語なのに、マシンの状態をイメージしないで
プログラミングするのはカンベンしてホスイ。人の能力に限りはあるけど、
できるだけそうするように努めるべき。
74:デフォルトの名無しさん
06/04/17 12:37:20
>>71 そうすると、関数型で作るときはオブジェクト的な考え方はしないの?
例であげた、ブラウザ作るときに複数ページを保持するようなものはどうするの?
75:デフォルトの名無しさん
06/04/17 12:56:54
つStateT
76:デフォルトの名無しさん
06/04/17 12:59:16
ストリームとか使うんでない?
77:デフォルトの名無しさん
06/04/17 13:07:42
結局状態を保存しないと無理なんじゃ
78:デフォルトの名無しさん
06/04/17 14:57:57
実際の動作は状態を保存するようなことになるけど、
形式的にはステップごとに状態をバケツリレーしていく感じ。
手続き型
[状態0] -処理1-> [状態1] -処理2-> [状態2] -> ...
関数型
関数x(.. 関数2( 関数1(状態0) ) .. )
79:デフォルトの名無しさん
06/04/17 15:02:09
>>78 処理と処理の間に空白があるときは?たとえば入力してしばらくしてから修正するときとか。
その間はどっかに状態保持するよね?
80:デフォルトの名無しさん
06/04/17 15:23:44
Lispいじるときは関数=クロージャだから
あまり「手続き型と真っ向対立」みたいなことは思わないなぁ
各関数が各環境を持っているわけで
81:デフォルトの名無しさん
06/04/17 15:29:31
>>79
引数として状態が渡される。
関数nは状態を変更する処理と思えばよい。
入力してしばらくしてからと言う場合はその間に状態を変更する関数が実行されていないか、
もしくは恒等関数( f(x) = x )が実行されていると考えてもよい。
82:81
06/04/17 15:34:24
>関数nは状態を変更する処理と思えばよい。
正確には関数nは状態を受け取って次の状態を返す関数。
83:デフォルトの名無しさん
06/04/17 15:37:35
>>81 状態を変更する処理が実行されない間は住所録?どこかに保持されるんじゃないんですか?
オブジェクト指向なら普通
class AddressBook{
void Add(Address addr);
void Delete(string key);
}
見たいなクラスでシングルトンかなんかでアクセスされてインスタンスはひとつがずっと保持されるんだが。
84:デフォルトの名無しさん
06/04/17 15:40:18
>>83
引数として状態が渡されて、引数はその関数を計算する間定数として保持される。
85:デフォルトの名無しさん
06/04/17 15:46:00
>>84 いやだから、入力処理があるよね?で削除処理があるよね?その間どこに保持されるんですか?
86:67
06/04/17 15:50:05
>>85 そういうのは副作用で系外に・・・
って、そういうのは反則?
87:デフォルトの名無しさん
06/04/17 15:50:36
>>83
純粋でない関数型言語の場合は、普通にローカル変数を使う。
x = add_address(empty_address_book, "a");
print(x);
// ここで何か別のことをやる。
x' = add_address(x, "b");
print(x');
純粋な関数型言語ではいろいろ妙なことをやるけど、
結果的に似たようなコードになる。
そもそも、逐次処理は手続的に書くのが最善の事が多いから、
関数型言語でも手続的に書けるようになっている。
88:デフォルトの名無しさん
06/04/17 15:51:53
純粋じゃない関数的プログラミングっつったら↓みたいなイメージあるけど間違ってる?
AddressBookって変数を用意して
AddressBook = CreateAddressBook();
AddressBook = AddAddress( AddressBook "Tokyo");
AddressBook = AddAddress( AddressBook "Osaka");
AddressBook = DeleteAddress( AddressBook "Tokyo");
みたいにしていくイメージがあるけどこれでいいの?
89:デフォルトの名無しさん
06/04/17 15:52:53
「状態」っていうのを変数と値の組を記録したデータベースと考えて、
状態0はそれが空のものと考えると、
状態1 = {(住所録, {})} = 新しい住所録作成(状態0)
状態2 = {(住所録, {Aさんの住所})} = Aさんの住所追加(状態1)
状態3 = {(住所録, {Aさんの住所, Bさんの住所})} = Bさんの住所追加(状態2)
状態4 = {(住所録, {Bさんの住所})} = Aさんの住所削除(状態3)
といった感じ。
90:88
06/04/17 15:53:03
リロードし忘れましたごめんなさい
91:デフォルトの名無しさん
06/04/17 15:55:12
>>89 結局そのいずれかの状態にあたるものはグローバル変数なり何なりアクセスできるところにおいてあるということ?
92:デフォルトの名無しさん
06/04/17 15:57:51
>>91
いや、その状態にアクセスする関数間を全部引数として引きまわすのが原則。
93:デフォルトの名無しさん
06/04/17 15:59:10
>>92 だとしたら、入力とか削除とかなにされるかわからないときはどんなコードになるんです?
94:デフォルトの名無しさん
06/04/17 16:01:31
>>93
>入力とか削除とかなにされるかわからない
意味が分からん。もうちょっと詳しく。
95:デフォルトの名無しさん
06/04/17 16:05:22
>>94 んーたとえばさっきの住所録みたいなやつ。
>>89 みたいなやつでおのおのの作業(A追加、B追加、A削除)の間にユーザーが行うまでに間がある場合
96:92
06/04/17 16:07:15
ごめん。>>92は俺の勘違い。
>>89にあるような「状態」はグローバルにあると考えていい。
97:デフォルトの名無しさん
06/04/17 16:11:32
オブジェクト指向だとデータとメソッドを一体化させるけど、関数型はそれをしないということ?
あと>>96のようにするならば、関数型の状態を変えないからバグが出にくいとかというのはそのばあいには適用されないということ?
98:96
06/04/17 16:15:47
混乱させてすまん。>>89の話は(俺が正しく理解してるなら)どちらかというと概念上の話
(あるいは実装の詳細)で、
「関数型言語のインタプリタを作る際にグローバルな状態を活用できる」位の意味に取ってくれればいい。
実際の関数プログラミングでは、データは全部関数間を引きまわす。
99:96
06/04/17 16:17:57
で、
>おのおのの作業(A追加、B追加、A削除)の間にユーザーが行うまでに間がある場合
だけど、>>87の説明で分からないところはあるか?
100:デフォルトの名無しさん
06/04/17 16:23:28
>>95
要するに並列処理の場合でしょ。
ちょいややこしいけど、処理のリストを2つ考えてそれを適当に混ぜて1つのリストにしてしまうものを考える。
処理A : abcdef
処理B : ABCDEF
混ぜたやつ : aAbBCcDdeEfF
そして混ざったやつを先頭から順に、
状態1 = a(状態0)
状態2 = A(状態1)
...
状態n = F(状態n-1)
のような感じに計算する。
101:デフォルトの名無しさん
06/04/17 16:24:03
>>99 >>87でわからないところは特にないです。
が、プログラム全体の構造がやっぱりいまいち理解できてないかな・・・
102:デフォルトの名無しさん
06/04/17 16:28:31
自分はハッカーと画家で言われてたようなLISPのきわめて高い生産性に興味があったんだがそれは>>9でいわれてるようなもので可能なものとはまったく異なるものなの?
103:デフォルトの名無しさん
06/04/17 16:30:07
LISPはプログラミング言語じゃありません
104:デフォルトの名無しさん
06/04/17 16:40:14
>>103
LISPがプログラミング言語って書いてあるのはどのへんですか?
105:96
06/04/17 16:46:54
>>101
例えば、対話的に追加と削除が出来る住所録のCUIあぷりはこういう感じに書ける。
void loop(address_book book)
{
command c = get_command();
if(is_remove_command(c))
loop(remove_address(book, command_value(c)));
else if(is_add_command(c))
loop(add_address(book, command_value(c)));
else if(is_show_command(c))
{
print_address_book(book);
loop(book);
}
}
int main()
{
loop(empty_address_book());
}
106:デフォルトの名無しさん
06/04/17 16:59:29
>>105 そうかくと手続き型と何もかわらんねぇ。
107:デフォルトの名無しさん
06/04/17 17:20:02
>>105
最後のifに対応するelseがないのはまずくない?
まぁ、 else loop(book); でもつければいいだけのことだけど。
108:デフォルトの名無しさん
06/04/17 20:20:54
>>66
レコード型で表現可能
関数型言語でオブジェクト指向はできるかどうか、という質問は非常に多いね。
関数型言語のスレには是非テンプレに入れておいてもらいたいな。
109:デフォルトの名無しさん
06/04/17 22:59:13
ステートマシンみたいな状態の保存必須の事を関数型言語でどうやって表現するの?
結局(setq hoge (func fuga))なの?
というか状態の保存って概念は関数型とか以前な話でFA?
110:デフォルトの名無しさん
06/04/17 23:11:09
>>109
普通に表現できる。
type StateMachine = Input -> (Output, StateMachine)
言い替えると、
「ステートマシンとは、Inputを引数に取って、Outputとステートマシンを返す関数である」
とする。
111:デフォルトの名無しさん
06/04/17 23:57:30
>>109
だから、チューリングマシンでできることはλ計算でできるんだって。
C言語やJavaのような代入型言語でできて関数型言語でできないことはないの。
112:デフォルトの名無しさん
06/04/18 00:16:06
保守性とか可読性とかまったく違うところ目指してる?
113:デフォルトの名無しさん
06/04/18 02:54:34
はい
114:デフォルトの名無しさん
06/04/18 03:25:07
関数型の利点
URLリンク(www.sampou.org)
115:デフォルトの名無しさん
06/04/18 10:49:46
代入型言語でプログラミングするなら、レジスタ、CPUキャッシュ、物理メモリの状態を
把握できるようになるべき。それをして初めて関数が多言語並みの厳密なプログラミングができるようになる。
代入型言語でプログラミングしてるやつはやってることがいい加減なくせにそのことにあまりにも無頓着すぎ。
116:デフォルトの名無しさん
06/04/18 10:52:02
>>115
> 代入型言語でプログラミングするなら、レジスタ、CPUキャッシュ、物理メモリの状態を
> 把握できるようになるべき。
それはアセンブリ言語やらC言語などの比較的低級言語の場合だけ。
高級なプログラミング言語では、そういった低レベルなことを忘れても良いように作られるべきなんだよね。
117:デフォルトの名無しさん
06/04/18 10:58:46
>>116
>高級なプログラミング言語では、そういった低レベルなことを忘れても良いように作られるべきなんだよね。
これはドキュンコーダー向けの愚民化コピーだろう。こんなの真に受けてどうするw
118:デフォルトの名無しさん
06/04/18 11:01:20
>>115
>関数が多言語並みの厳密なプログラミング
具体的にはどういう事?
「物理メモリの状態」というのも具体的に何を指しているの?
119:デフォルトの名無しさん
06/04/18 11:03:51
>>115
日本語でおk
120:無知蒙昧
06/04/18 11:07:22
URLリンク(www.sampou.org)
この文章では、説得力ゼロじゃんとか感じた無知蒙昧なオイラにだれかご教授いただけると幸いです。
ここに書いてあるメリットは、最近はC#でもJavaでもPerlでも容易かつスムーズにできると思うんですが。
high-orderはC#の匿名メソッドで。
遅延評価はデザインパターンで。
もちろん、シンタックスは、関数型のが美しいし、可読性もよいけど、
この文章からだと、そんな劇的に生産性が異なるほどとは、ぜんぜんピンときません。
自分でdynamic arrayのクラスを切って、それでLISPのmap関数やapplyに
ラムダ式を渡すような感じで匿名メソッド(クロージャっぽい機能もある)を
渡すように記述することで、極力foreachやforを使わないように書く癖がついてますし。
つまり、それらをデータ構造定義と数式で書き直したとしても、
大して違いはないようなやたらと宣言的に「見える」コーディングスタイルなわけなんですが。
状態云々とか、宗教じゃなくって、関数型言語だと、具体的に、どうしてこれよりも
ずっとソースコード量が減るのか、そこを教えて欲しいです。
121:デフォルトの名無しさん
06/04/18 11:07:34
>>117曰く、「俺は凄いコーダなんだぜ」
122:デフォルトの名無しさん
06/04/18 11:10:04
>>120
代入文って冗長でしょ?
123:& ◆9EVNtil89o
06/04/18 11:22:41
冗長な代入文なんて、そもそも書いたりしませんよ。
LISPだって、ラムダ式が長くなりすぎなときは、
普通にdefunして、式をsymbolにbindするじゃないですか。
そういう風に式をブロック化することで可読性と再利用性と
デバッガビリティーが向上するからです。
ぼくがC#で代入文を使うときも、それとほとんど同じような感覚で使うんですよ。
つまり、長くなりすぎた式を、部分式に分割して、それに名前をつける目的で、
それを変数に代入する。
だから、結局、それをhaskellに置き換えたとしても結局、やはりその
代入文の右側にある式は、haskellの右側の式とほとんどおなじになっちゃうし、
haskellの左側にある関数名は、C#の変数宣言とほとんどおなじになってしまい、
ソースコードの見た目はほとんど変わらない。
124:デフォルトの名無しさん
06/04/18 12:11:01
C#とかだと変数の型宣言が必須だから、型推論してくれるHaskellと比べるとその分冗長になるとは思うが、
同じ物を同じようなやり方で書くのなら見た目がほとんど同じになるのは当然でしょう。
125:無知蒙昧
06/04/18 12:18:57
型推論自体は、関数型言語とは関係ないですよね。
だって、手続き型なのに型推論機能のついている言語はありますよね。
Pythonとか。
C#の次のバージョンからは、型推論機能も少しは入るらしいし。
「同じものを同じようなやり方で書く」と言っているのではなく、
「より少ないソースコード量やシンプルな表現で記述しようとするにも関わらず、
避けがたい結果として、同じようなソースコード量や表現になってしまう」
ことを問題としています。
126:デフォルトの名無しさん
06/04/18 12:39:24
関数型言語なら短くなる、じゃなくて、
lisp的なマクロがある言語なら短く書ける、じゃねーの?
127:デフォルトの名無しさん
06/04/18 13:03:46
短さならPerl最強
128:& ◆nF6VLM6wpw
06/04/18 13:10:48
実感値としては、中規模以上のプログラムだと、
「短さならPerl最強」は完全に間違いだと思う。
「lisp的なマクロがある言語なら短く書ける」は結構
実質的には当たっているが、関数型言語の話とは関係ない。
だって、LISPマクロと同等の機能を手続き型言語に入れれば
それで済んじゃう話だもん。
129:デフォルトの名無しさん
06/04/18 13:20:19
.NETで使える関数型ってあるの?
130:デフォルトの名無しさん
06/04/18 13:21:57
Pythonは動的型付けであって、型推論ではないでしょ。
131:デフォルトの名無しさん
06/04/18 13:24:58
純粋関数型+変数への代入機能(状態保存機能)=手続き型
っていう認識でおk?
132:デフォルトの名無しさん
06/04/18 13:37:13
>>128
それを言っちゃおしまい。
「関数型言語なら短く書ける」は結構実質的には当たっているが、本質的ではない。
だって、関数型言語と同等の機能を手続き型言語に入れればそれで済んじゃう話だもん。
でも、ほいほい何でもかんでも入れちゃうのは文法とかの整合性が取れなくなったりしてまずいと思う。
133:デフォルトの名無しさん
06/04/18 13:54:52
>.NETで使える関数型ってあるの?
つ URLリンク(d.hatena.ne.jp)
Haskell、もStandardMLも、LISPもありますよ。
134:デフォルトの名無しさん
06/04/18 14:08:37
>>131たぶんおk
135:デフォルトの名無しさん
06/04/18 14:19:55
>>134
でたらめ言うな。
136:デフォルトの名無しさん
06/04/18 15:32:24
関数型ってのは関数に値を渡して返ってきた値をまた他の関数へ渡す。このようなスタイルでプログラムを書いていく言語を関数型と言って,代入はあまり使われない。
純粋って言われるのはホントに関数と関数との組合せでプログラムを組み,代入を使わない。又は,代入が使えない。
命令型ってのは変数の値を代入により変えていくようなスタイルでプログラムを書くための言語。
別に関数型だからと言って命令型のプログラムが作れないわけではない。同様に命令型の言語でも関数型プログラミングは可能。
ただ,設計の目的が異なるため関数型ように設計された言語は関数型のプログラムを書き易い。
137:デフォルトの名無しさん
06/04/18 15:57:48
C 言語だとカリー化とかがなぁ。
こんな風にゴリ押しできないこともないみたいだけど、
何だかなぁ。
URLリンク(nicosia.is.s.u-tokyo.ac.jp)
138:デフォルトの名無しさん
06/04/18 16:14:00
ハギヤ先生って今のC++についてはどう思ってるんだろ
139:デフォルトの名無しさん
06/04/18 16:33:10
カリー化もそうだが、ラムダはもっと深刻かも。
GCC の内部関数を利用すれば、
近い事はできなくもないが・・・。
140:デフォルトの名無しさん
06/04/18 16:55:38
boost:lambda も面白いな
141:デフォルトの名無しさん
06/04/18 18:08:59
>>136 純粋な関数がたって状態の管理どうするの?
142:デフォルトの名無しさん
06/04/18 18:57:15
>>141
>>110みたいにするのでは?
143:デフォルトの名無しさん
06/04/18 19:15:50
>>141 んー代入と何が違うのかわからん・・・orz
144:デフォルトの名無しさん
06/04/18 19:20:14
すべての処理を const への参照を取って const への参照を返す
って書き方にしたら、関数型言語っぽくなる?
145:デフォルトの名無しさん
06/04/18 19:20:32
状態を扱うときに代入スタイルと大差なくなるのは自然じゃないか?
146:デフォルトの名無しさん
06/04/18 19:22:14
>>145は>>143へのレス
147:デフォルトの名無しさん
06/04/18 20:35:40
>>144
「ほとんどすべての変数を const」 にすると相当それっぽくなる。
148:デフォルトの名無しさん
06/04/18 20:46:11
>>147
関数内部の一時的な自動変数もだめ?
もちろん副作用は起こさないようにして。
149:デフォルトの名無しさん
06/04/18 21:01:59
処理速度は関数型の方が速いの?
代入行わないからなんとなく速そうなんだけど。
150:デフォルトの名無しさん
06/04/18 21:03:54
>>149
の真ん中あたり
URLリンク(www.unixuser.org)
151:デフォルトの名無しさん
06/04/18 21:09:21
>>148
お遊びだから自分が満足できるだけやればいいんじゃない?
とりあえず for (int i = 0; i < 10; ++i) が禁止になるだけでも結構楽しいよ。
152:デフォルトの名無しさん
06/04/18 21:11:26
>>148
>関数内部の一時的な自動変数もだめ?
関数型の特徴(利点・欠点)はそういう小規模なレベルで特に顕著だと思う。
153:デフォルトの名無しさん
06/04/18 21:13:21
>>151
それくらいだと、末尾再帰の最適化を期待して書くのと
あんまり変わらないかな
154:デフォルトの名無しさん
06/04/18 21:36:18
(define true (lambda (x y) x)))
(define false (lambda (x y) y)))
(define if (lambda (x y z) (x y z)))
155:デフォルトの名無しさん
06/04/18 23:07:44
>>154
はいはい、λ式があれば条件分岐もできるってことね。
156:デフォルトの名無しさん
06/04/19 00:41:05
Smalltalkもifがないよね。
157:デフォルトの名無しさん
06/04/19 00:44:11
参照透明性(同じのを渡せばいつも同じ答えが返ってくる性質)が保たれていると,コンパイル時の最適化がしやすいから,速くできる。
その分,代入があるといつも同じ状況に応じ答えが違うから,コンパイル時にコードを書き換えたりするような最適化がしにくい。あまり速くできない。
158:デフォルトの名無しさん
06/04/19 01:20:41
巨大配列を扱うような数値計算って
純粋関数型で扱えるの?
159:デフォルトの名無しさん
06/04/19 01:41:58
>>158
苦手かもしれないけど、出来ないことはない。
基本的に、手続き型言語で表現できることは
(破壊的代入も含めて)純粋関数型言語でも表現できる。
例えばHaskellでは、普段使う変数は変更不可だし、普段使う関数に副作用はないけど、
効率よく変更可能な「変数もどき」や副作用つきの「関数もどき」がある。
160:デフォルトの名無しさん
06/04/19 03:50:11
>>159
なるほど。
やっぱそのあたりは
如何に純粋関数型言語と言えども
使えるようにはなってるんだ。
ただ、一工夫してあるということやね?
161:デフォルトの名無しさん
06/04/19 17:34:28
>>159
:.:.:.:.:.:.:.:./ / 丶、
:.:.:.:.:.:/,/ \ ヽ 、 \
:.:.:.:/ / \ ___ ヽ \ i
:.:.// l , ヽ-弋 ヽ ヽ \ l
V/ l l ,-A-、 ハ lヽ l l l.
/ l l ,r Ti l ヽ l ヽl ヽ l / /
l l / / l l ヽ l l / / ,l /.
! l、 / l! l / ,rー 、l/| れ /l/
| '、 / ,ィ‐-、 l/ '´ k´/ /:.:|
、_ \', / / /// 'i \:.:| もうだめだー
:.:l' - 、_ \ / } ヽ|
:.:|: :| ( ( ̄´ /// _ , -ァ ノl ||
、.|: :ゝ、__ -ヽ、 l´ ノ /l l. ||
. || l: :'ー ' ' - 、 'ー ' , イ : : l l. ||
/|| . :l: : : : : : : : : ィー' ェ、 -----r ' l´ ヽl.、: :! l ||
. ||. : l: : : : : :, -‐‐' ノ  ̄ 7、 /ヽ lヽ:.:.:.:.´ ヽl ヽ||
: ||: :l: : : :r' ´:.:.:.:.:.:.:.:.:\ / Y┐ヽl |:.:.:.:.:.:.:.:.:.:´'、.||
: || l: : ,ィ':.:.:.:.:.:.:.:.:.:..:.:.:.:.:.:ヽ/ l l /:.:.:.:.:.:. _ /', ||ヽヽ
: ||l: : : >、_:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.ヽ、 l l /, -ー 'i ´._,ノ' ||: :|ヽゝ
: ||: : : :ト、 / ー t---y--ーi‐‐‐i\/ヽ,-'ー ' ´ / lヽ、
誰かHaskellを2次元化してください。
162:デフォルトの名無しさん
06/04/19 22:16:31
>>161
URLリンク(pggirls.asukaze.net)
163:デフォルトの名無しさん
06/04/19 22:48:25
神さまありがとう
ぼくに友達をくれて
Haskell に会わせてくれて
Haskell に会わせてくれて
ありがとうぼくの友達
Haskell に会わせてくれて
164:デフォルトの名無しさん
06/04/19 22:57:37
Haskellたんはツンデレですか?
165:デフォルトの名無しさん
06/04/19 22:58:14
Haskell で射精した。
166:デフォルトの名無しさん
06/04/20 21:46:32
>>163
元ネタの悪党が友達ってのもすげぇ詩だよな
167:デフォルトの名無しさん
06/04/20 23:49:33
保守の都合でここにカメムシ置いときますね
,.
.._ / プ〜ン
\ __,!
〕-`ー;、
」`;{ヾ ̄.} l'_
_/~| \l }=、
<ヽ/ `i/ \._
_)
168:デフォルトの名無しさん
06/04/21 10:40:15
何でカメムシなんだよ?
169:デフォルトの名無しさん
06/04/21 11:36:55
カメムシってなんとなくラムダに見えなくない?
170:デフォルトの名無しさん
06/04/21 11:50:14
岩手の喧嘩祭といえば、六尺褌一丁の男達が、神輿を担いでぶつかり合う、
勇壮な祭として、この地方に知られている。
祭のあと、男達は集会所に集まり、普段着に着替え、飲み合う。
六尺は、激しい祭でドロドロボロボロになるから、使い捨てで、ゴミとして出される。
俺はいつもそれが狙いだ。
捨てられている六尺の、できるだけ汚れてる奴を10数本ほど、
こっそりさらって家に持ち帰る。
そして、深夜、俺一人の祭が始まる。
俺はもう一度汚れた六尺のみ身に付け、部屋中にかっさらってきた六尺をばら撒き、
ウォーッと叫びながら、六尺の海の中を転げ回る。
汚れた六尺は、雄の臭いがムンムン強烈で、俺の性感を刺激する。
前袋の中のマラは、もうすでに痛いほど勃起している。
六尺の中に顔を埋める。臭ぇ。
汗臭、アンモニア臭や、股ぐら独特の酸っぱい臭を、胸一杯に吸い込む。溜まんねえ。
臭ぇぜ、ワッショイ! 雄野郎ワッショイ!と叫びながら、前袋ごとマラを扱く。
嗅ぎ比べ、一番雄臭がキツイやつを主食に選ぶ。
その六尺には、我慢汁の染みまでくっきりとあり、ツーンと臭って臭って堪らない。
その六尺を締めてた奴は、祭で一番威勢が良かった、五分刈りで髭の、40代の、
ガチムチ野郎だろうと、勝手に想像して、鼻と口に一番臭い部分を押し当て、
思いきり嗅ぎながら、ガチムチ野郎臭ぇぜ!俺が行かせてやるぜ!と絶叫し、
マラをいっそう激しく扱く。
他の六尺は、ミイラのように頭や身体に巻き付け、
ガチムチ野郎の六尺を口に銜えながら、ウオッ!ウオッ!と唸りながらマラを扱きまくる。
そろそろ限界だ。
俺は前袋からマラを引き出し、ガチムチ野郎の六尺の中に、思いっきり種付けする。
どうだ!気持良いか!俺も良いぜ!と叫びながら発射し続ける。
本当にガチムチ野郎を犯してる気分で、ムチャクチャ気持ち良い。
ガチムチ野郎の六尺は、俺の雄汁でベトベトに汚される。
ガチムチ野郎、貴様はもう俺のもんだぜ!
俺の祭が済んだあと、他の六尺とまとめて、ビニール袋に入れ押し入れにしまい込む。
また来年、祭で六尺を手に入れるまで、オカズに使う。
押し入れにはそんなビニール袋がいくつも仕舞ってあるんだぜ。
171:デフォルトの名無しさん
06/04/21 14:32:14
(´・ω・`)誤爆
(´・ω・`)ぶち殺すぞ
172:デフォルトの名無しさん
06/04/21 19:00:46
,,、 - ー― ー- 、
、- ' ~::::::::: ;;;;;;;; ~''-、
おいお前! , ''~; ; ;;;;;;;::::::::::::::::::::::;;;;;;;;;;;; ;;;;ヽ
,、 r";; ; ;;;; ;;;; z;;;;;;;;:::::::::::::::;;;;;;;;;;;;;;;; ;;; ヽ
i;;| r';;;;;; ;;;;rr'((t"t、;;;、 - ーー 、;;;;;_;;;;;;、;;;;;;;; t
スレの名を言ってみろ! |;;;| ';;;;;;;;r';(;;ヽ,、-;;'''";;、、、;;;;;;;;r'"ii 」ー 、)'yヽ、i
|;;; | i;;;;、i~t''o't;;;;;;;;≪,,,。,~'ヽ;;ノ ;ii i;;、、,;;~',、'ソ )
|;;;;; | i ;;;t'、、o「"`'ー ''"~~~~~~,,,,、::-';;; ~'-ゝ;;ヽ。ソ
. |;;;;;; | | ;;'t、ァo)ー- ''"r'' ,、":::: r'、~~~;;; ~'';;- 、''"*i/
|;;; t, |;;;;;;;; |. | ;;;;t,ュア;;;;::://',, i;;i ::::: i;;;i ::;;;リ~i :: ::~'ア,,ノ
、、 ,,,,,,, |;;;; t |;;;;;;;; | | ;;;;;;;t't;;:/;;/;、 ', i;;i :::: |z;i ; リ;;i :::リリ : 〉j
;;;;;;;;;;;;;;;;~~~~~ヽ''''''' 、,,,,|;;;; h:ヽ |;;;;;;;; :: |. | ;; ;;;;;;i/;;; /i;;;t,、. i;;i ::: |ニ| ;;;;/ョリ :/;/::/::/
""""""""""''ヽ;;;;;ヽ;;;;~ '' ー`、 ,,,,,,,,,|;;;;;;;;;;;; | i,,;;;;;;/;;;;:::/::t/リi |;;i :: |;;;i ;; /;;/ ://:::/ /
,,,,,,,,,,,,,;;;;;;;;;;;;:::::::::::t;;;;;;;t;;;;;;;;;;;;;;;;;;~' 、二、,,~~~::''''ー- 、,,ノ;;;/;;;;:::: /ー'"'' ,イi |;;;t__i;;t ;;/;;/: //::/ i,r'| /i
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;|;;;;;;;;i ::::::::::::;;;;;;ヽ;:::::~'' ,,z、::,,,:::::;>'";;;;;::::: /、、;;;;/:: ̄::::::::::::::~":::ヽ''〈::/ ''" ,/ /; |
173:デフォルトの名無しさん
06/04/21 21:35:24
今、lispを少し勉強したけど、たいして違いがわからん。
関数形式で表すだけで、やっていることは同じように感じる。
174:デフォルトの名無しさん
06/04/21 21:51:06
>>173
ははは、奇遇だな
俺もFortranとCの違いがわからないんだよー
175:デフォルトの名無しさん
06/04/22 00:05:38
俺もvbとjavaの違いが分からん
176:デフォルトの名無しさん
06/04/22 00:56:46
おらはC#とJavaの違いがわからん
177:デフォルトの名無しさん
06/04/22 02:40:55
俺はひまわりとなでしこの違いが分からん。
178:デフォルトの名無しさん
06/04/22 03:16:22
>>173
Common Lisp はマルチパラダイムな言語だからね。
違いを感じたいなら Scheme やった方が良いかと。
179:デフォルトの名無しさん
06/04/22 03:17:00
ネスカフェとマキシムの違いが分からんが、言語は処理系の違いにもうるさい(やかましいだけ)
180:173
06/04/22 10:19:36
もしかして、何を皮肉ってるか理解されてない?
181:デフォルトの名無しさん
06/04/22 12:13:28
>>180
もしかして、何を皮肉ってるか理解されてない?
182:デフォルトの名無しさん
06/04/22 12:18:03
みんな、きもちいいことしてる?
183:デフォルトの名無しさん
06/04/22 12:34:28
まあ、俺が言いたいことはだな、Python最高
184:デフォルトの名無しさん
06/04/22 14:19:43
Python は関数型と手続き型のいいとこ取り?
185:デフォルトの名無しさん
06/04/22 14:25:10
>>184
全然違う
186:デフォルトの名無しさん
06/04/22 15:08:49
>>185
お前が全然違う
187:デフォルトの名無しさん
06/04/22 17:03:12
pythonはなにげにぼくらの期待の星
188:デフォルトの名無しさん
06/04/22 17:06:29
ここで空気を読まずにHSP!HSP!HSP!
189:デフォルトの名無しさん
06/04/22 18:14:13
戯言を皮肉とは言いませんね。
190:デフォルトの名無しさん
06/04/22 19:00:43
関数型言語はたしかにアルゴリズムを簡潔に表現できる。
が、パフォーマンスを気にしてチューニングすると
プログラムが手続き型言語っぽくなってしまう。
機械語自体が手続き型言語だから。
ならはじめから手続き型言語でいいじゃんって思う今日このごろ。
191:デフォルトの名無しさん
06/04/22 19:05:34
ラムダ計算を効率よくできるラムダコンピュータを作ってください
192:デフォルトの名無しさん
06/04/22 19:18:34
>>190
それって disassemble とかして検証してるの?
193:デフォルトの名無しさん
06/04/22 19:29:00
完璧な処理系が作れることを前提とした言語
194:デフォルトの名無しさん
06/04/22 19:50:15
>>191
関数型言語の歴史=如何にλ式を現行マシンで効果的にコンパイルするか
じゃないの。
195:デフォルトの名無しさん
06/04/22 20:04:43
>>194
関数型言語の歴史
ではなくて、
関数型言語の実装の歴史
でしょ。
196:デフォルトの名無しさん
06/04/22 22:57:29
>>184
それはRubyの話。
197:デフォルトの名無しさん
06/04/22 23:03:38
>>178
Schemeですか。
了解。
198:デフォルトの名無しさん
06/04/22 23:13:58
純粋じゃない関数的プログラミングについて書いてるいい本って何かない?
とりあえず onlisp は読んだ。
199:デフォルトの名無しさん
06/04/22 23:23:46
関数型言語と関数言語ってくべつして呼称すべきですよね?
200:デフォルトの名無しさん
06/04/23 01:38:42
>関数言語
はつみみです
201:デフォルトの名無しさん
06/04/23 07:35:52
関数言語って何ですか?
202:デフォルトの名無しさん
06/04/23 10:26:42
俺が最初にC言語の勉強をしたとき(もう15年以上前だけど)
「C言語は関数型言語だよ、関数言語じゃないよ、
あくまで「関数型」だよ。関数の形をしているけど、
同じ引数を与えたからといって同じ結果が得られるとは
限らないでしょ?だから関数じゃない。関数の形をしているだけ。
これに対して、世の中には本当の関数言語というのがある。」
と説明してあった本がありました。
203:デフォルトの名無しさん
06/04/23 10:37:53
>>202
晒しキボン
204:デフォルトの名無しさん
06/04/23 14:32:20
その基準で言うと、Haskellみたいなのが「関数言語」っつー事?
205:デフォルトの名無しさん
06/04/23 15:48:13
「C言語」と言ってる時点で駄目本決定。
206:デフォルトの名無しさん
06/04/23 15:56:08
>>202
つーことは関数型言語には現在の時刻を返す関数はないんだな?
207:デフォルトの名無しさん
06/04/23 15:58:48
確かに昔はそんな本がゴロゴロしていたな。
さすがに今はそんな本は見かけなくなった。
google で検索をかければ、それが嘘か本当かすぐ分かるもんな。
いい時代になったもんだ。
208:デフォルトの名無しさん
06/04/23 16:01:21
あるよ。
f(x) = x
209:デフォルトの名無しさん
06/04/23 16:02:00
>>205
void乙
210:デフォルトの名無しさん
06/04/23 16:45:41
作って分かるCプログラミングは隠れた名著
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5387日前に更新/127 KB
担当:undef