関数型言語

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
Lisp Scheme ML Haskell FP Mirranda など
関数型言語について話し合いましょう
2デフォルトの名無しさん:2001/04/23(月) 00:48
関数型言語の定義って何ですか?
3デフォルトの名無しさん:2001/04/23(月) 00:56
>2
関数の組合せによって形成していく言語
変数への代入が無い。
でもLISPやSchemeなどでは見かけ上、ローカル変数が使えます。
4デフォルトの名無しさん:2001/04/23(月) 01:39
ここに関数型言語の説明がある
ttp://www.icsd2.tj.chiba-u.ac.jp/oldmember/shimoda/node1.html
5デフォルトの名無しさん:2001/04/23(月) 18:24
Haskellに期待age
6デフォルトの名無しさん:2001/04/23(月) 21:05
状態を持つ Schemeや Lispなんて関数型じゃねえ、っていいたいんだね?
Ocamlも論外。
7デフォルトの名無しさん:2001/04/23(月) 21:48
>6 俺はschemeやML系の副作用のあるものも、関数型言語として認めるよ。
基本的にプログラムって状態を変化させるものでしょ。Haskellみたいに
purityを保ちながら、今っぽいGUIとかネットワークのプログラムを書く
のは少しこじつけが必要になってくる。

でも、Haskell大好きよ。GHC-5.0リリース万歳!
8デフォルトの名無しさん:2001/04/23(月) 22:41
関数型言語だと並列化が容易って聞きますが本当ですか?
9デフォルトの名無しさん:2001/04/23(月) 23:05
HaskellはSchemeのような美しさに欠けますが、現実的な機能
を盛り込んでいて、大規模な開発にも使えそうだと思っている
のですが、実際にはどうなんでしょうか。Haskellで大きなプロ
グラムを組んだことがある人、意外な欠点などがあったら教えて
ください。
10デフォルトの名無しさん:2001/04/24(火) 00:41
関数型言語でRDB読み書きってできるの?
まあ、やりゃぁできんだろけど、向いてる?
11デフォルトの名無しさん:2001/04/24(火) 00:47
RDB読み書きに向き不向きなんてあるんですか?>10
12デフォルトの名無しさん:2001/04/24(火) 02:38
代入がないってのは、もしかして状態がないんでしょうか?
状態のかたまりであるOOPばっかりやってきたもんで、
ものすごくカルチャーショックです。
どういう風になってるんだろう???
13デフォルトの名無しさん:2001/04/24(火) 03:57
set!
14>12:2001/04/24(火) 04:11
いや、関数の引数に対しての代入はある。
なので状態は作れる。
15>12:2001/04/24(火) 04:33
ループも再帰で作る。
16デフォルトの名無しさん:2001/04/24(火) 09:04
手続き型であるC言語でglobal, static使わないと
関数型プログラミングになるってこと?
単に手続き型を制限しただけ?

いまいち利点がわからないな
17デフォルトの名無しさん:2001/04/24(火) 13:03
>>16
俺もよくわかってないけど
君の言ってる事はなんか違うと思う。

つか、いっぺん触ってみれ。
したら利点がわかるよ。
18デフォルトの名無しさん:2001/04/24(火) 15:11
>>16

純粋に関数型な部分については、引数と関数が定まると、出力(戻り値)が
定まるので、たとえば遅延評価(webで牽いてね)なんかができる。
そうして遅延評価をベースにして、ほかの言語ではコルーチンを使う
ような処理が、ごく自然なアルゴリズムとして記述できるようになったりする。
19デフォルトの名無しさん:2001/04/24(火) 16:15
あそこらへんってアルゴリズムなのか? って気もするけどな。
無限リストをかえす関数なんてのは、それだけじゃ停止性も
ないわけだし。
まあ、制御構造を書かなくていいので、自然に記述できる(こともある)
ってのがうりだね。
&& の shortcutが言語のすべてに行き渡ったような。
20デフォルトの名無しさん:2001/04/25(水) 00:35
スレ伸びないね。とりあえずage
21デフォルトの名無しさん:2001/04/25(水) 01:44
型推論萌えage
22デフォルトの名無しさん:2001/04/25(水) 01:57
やっぱりlambdaは基本でしょうか。
インターナルイテレーターが自然に書けるのも利点?
2312:2001/04/25(水) 02:32
>>14
うう。そういや「リスト遊び」も読んだんだっけか。
でも表面的なことはさとえき
やっぱり関数型言語のキモって奴は全然判れなかった(T_T)

>関数の引数に対しての代入

うーむ。わからぬー(T_T)

状態の純粋な器としての変数、が無いということでしょうか?
#だとすると、状態の安息地を求めてOOPに至った俺としては、ちょっと…
24デフォルトの名無しさん:2001/04/25(水) 04:47
関数型言語は順次処理とかをするためのものじゃないから
状態とかはあまり関係ない話なんでは?
25デフォルトの名無しさん:2001/04/25(水) 12:21
>12 純粋な関数型言語(Haskell等)には代入がない。つまり状態はありません。
ではどうしているかというと、mainルーチンを現在の計算機の状態をうけとり
新しい計算機の状態を返す関数だと考えることで回避しています。

>23 正解です。

>24 でも、現実のプログラムでは状態を扱うと考えた方が自然な問題もあると思う。
26デフォルトの名無しさん:2001/04/25(水) 15:56
関数型の肝がわかる入門書ねえ...
R.バード、P.ワドラー共著、武市正人訳「関数プログラミング」
か?
http://www.sampou.org/haskell/ にある易しい Haskell入門はどうかな。

27デフォルトの名無しさん:2001/04/25(水) 22:39
>26
日本語でおねがいします
2812:2001/04/25(水) 23:00
>>25
ココでいうのもなんなんですが、
ガッコで習った算数/数学でピンとこなくて
一方プログラミング(といっても手続き系言語ばかり)で
ピンと来たのが、「状態」の有無なんですよね…。

ところでさらに。自分も使ったことがあるわけじゃない
んですが(笑)、もしかして関数型言語って
アナログコンピュータに似ていますか?
アナログだとデジタルと違って状態の記憶はプリミティブにやれないし、
たしか微分とか発振とかの演算をする部品を
FunctionGeneratorとか呼ぶんでしたよね。
で、あるFunctionの出力を別のFunctionに(配線で)突っ込むことで
計算を行うわけで。似てませんか?

Haskellの日本語な頁はどっかで見たような記憶が。
全然判らなかったのは相変わらずですが(T_T)。
検索したら出てくるんじゃないかなあ。
#最近はGoogleかな…
29デフォルトの名無しさん:2001/04/26(木) 03:03
そろそろ具体的な例でも出してみようや。
誰かなんか関数型言語で解く問題きぼんぬ。
30デフォルトの名無しさん:2001/04/26(木) 04:10
>>29
関数型言語ならでは、ってやつですか?
自分はちょっと思いつかないです。
とりあえず違う切り口で。

・平均値を求める関数
(average 1 2 3 4 5)
=> 3

(define (average . l)
 [define list-plus
  (lambda (y l)
   (if (null? l) y
    (list-plus (+ y (car l)) (cdr l)]
 ([lambda (x) (if (zero? x) 0 (/ x (length l)]
  (list-plus 0 l)))
Schemeですが、ローカル変数は使ってないです。
このコードは関数型言語に乗っ取った記述と言えるでしょうか?
3130:2001/04/26(木) 04:32
こういう書き方もあります。(本質的に同じですが)
(define (average2 . l)
 (let loop ;named let
  ((y 0) (c 0) (z l)) ;仮引数
  (if (null? z)
   [if (zero? y) 0 (/ y c)]
    (loop (+ y (car z)) (+ c 1) (cdr z))]
3230:2001/04/26(木) 04:49
>>30のaverageをlengthを使わないで記述するとこうなります。
(define (average3 . l)
 [define list-plus
  (lambda (y c l)
   (if (null? l) (list y c) ;リストを返す(合計 個数)
    (list-plus (+ y (car l)) (+ c 1) (cdr l)]
 ([lambda (x) (if (zero? (car x)) 0 (/ (car x) (cadr x)]
  (list-plus 0 0 l)))
無理矢理っぽいかな
Cでも書けるし。しかも短くなるじゃん(鬱
int average_rec(int var, int len, int *list) {
  if (!len)
    return var;
  return average_rec(var + *list, len - 1, list + 1);
}
int average(int *list int len) {
  return average_rec(0, len, list) / len;
}
3330:2001/04/26(木) 04:54
こっちでした
int average(int *list int len) {
  if (!len) return 0;
  return average_rec(0, len, list) / len;
}
34デフォルトの名無しさん:2001/04/26(木) 05:00
(define (average . l)
 (/ (apply + l) (length l)))
反則?
3530:2001/04/26(木) 05:05
Cならreturn文だけでも書けますね。
int average_rec(int var, int len, int *list) {
  return (!len) ? var : average_rec(var + *list, len - 1, list + 1);
}
int average(int *list int len) {
  return (!len) ? 0 : average_rec(0, len, list) / len;
}
・・何が言いたかったのか判らなくなってきた。もう寝ます。
36デフォルトの名無しさん:2001/04/26(木) 05:12
関数型言語って無理矢理副作用が無い理由を作ってるけど、
あまり意味無いよね。
副作用の例外を認めてもいいんじゃないかな。
3730:2001/04/26(木) 05:13
>>34
あああそういう方法があったんですか。
applyあんまり使った事ないんで。(汗
(+ 1 2 3 ...)って風に書けるのはlisp/scheme独特の利点ですね
38デフォルトの名無しさん:2001/04/26(木) 10:50
(defun average (l)
  (/ (apply '+ l) (length l)))

(average '(1 2 3 4))
=>5/2
39デフォルトの名無しさん:2001/04/26(木) 19:14
>>12
逆にOOPはすべてが「振る舞う」ものとして考えることも出来るようだよ。
Behaviorismというらしい。
40デフォルトの名無しさん:2001/04/26(木) 21:59
>>36 副作用をなくす利点って、遅延評価ができるようになること以外
のメリットはなんなのかなぁ−。わかるひと教えて。

あと、OcamlやSML,Schemeとかは副作用を認めてるよね。
ホントに副作用がないようにしてるのはHaskellとCleanだけ。

全てを関数としてみるのも不自然だし、全てを手続きとしてみるのも
不自然だと思う。

でも, Haskellまんせ−
41デフォルトの名無しさん:2001/04/26(木) 22:05
>>39
つーか、振舞うだけなら他の言語形態でもたいてい
(語弊?)出来るんで、それはまたちょっと傍論かと。

OOPの味噌は細胞膜を作ったことでしょう。
ソレの内部と外部を規定するという。

どうなんでしょう?
関数って、それ自体には内も外もないんじゃないでしょうか?

ところでLispってListProcessorでしたよね。
List自体は変数と大差無いものであるように
思えたんですが、それでも関数型というのでしょうか?

42デフォルトの名無しさん:2001/04/26(木) 22:30
>41 関数の外と内という表現はよく分からんが、スコープはある。
あと、Haskellなんかはグローバルな(手続き型言語のような)変数
はない。

Listは変数とも見れるが、Lisperは基本的には破壊的代入をあまり
しないでプログラムを書くので関数型とも見れる。
43デフォルトの名無しさん:2001/04/26(木) 23:12
話はずれますが、
MLでは型推論という方法でgc起動回数を抑えてるらしいんですが、
LISP/Schemeで、その型推論は可能でしょうか。
appendやreverseなんかで大量にセル消費するけど、
gcに(あまり)頼らずにセルを還元する様なアルゴリズムにならないかな。
44デフォルトの名無しさん:2001/04/26(木) 23:43
>43 型推論でGCを回避?なんじゃそりは?初耳です。

Lisp, Schemeには型がないので型推論はできません。
45デフォルトの名無しさん:2001/04/26(木) 23:44
>>43
よくわからんが(君の言ってることのせいじゃなく俺が馬鹿だからね)
MLの型推論は処理系がコンパイル時にって話で
LISP/Schemeじゃ無理なんじゃないでしょか。
4643>44-45:2001/04/27(金) 00:17
やっぱり型無いと無理ですか。
地道に関数の呼出し時にプロファイリングして不要になるセルを
チェックしていけば還元は結構できるかもしれないですね。
47デフォルトの名無しさん:2001/04/27(金) 00:36
>Lisp, Schemeには型がない
初耳だな。
48デフォルトの名無しさん:2001/04/27(金) 00:57
それは例の「形なし言語逝ってよし」のスレでの
変数の型と値の型の話かい?

ここでは変数の型についていっているよん。
49デフォルトの名無しさん:2001/04/27(金) 00:57
引数の型チェックが無い

という言いかたが正しいかな?
50本論とは外れるが:2001/04/27(金) 01:16
「LISP Scheme」と「関数型言語」のスレの住人は同じに違いないのにスレだけが別れていてキモイなあ。
51デフォルトの名無しさん:2001/04/27(金) 01:28
俺はこっちしかかきこんでないぞ!
でも、しょぼ関数型プログラマよりグレートなlisper
の方が多そうなのでいろいろ聞きたいです。
52デフォルトの名無しさん:2001/04/27(金) 02:07
>>43 Region Based Memory Managementのことかしらん?
http://www.itu.dk/research/mlkit/kit2/readme.html
型推論じゃなくて effect inferenceとかいったような...
萌える理論である事はたしか。

53デフォルトの名無しさん:2001/04/27(金) 15:10
>>51
厨房Lisp信者発見。
54デフォルトの名無しさん:2001/04/27(金) 23:35
別にいいじゃないかage>50
55デフォルトの名無しさん:2001/04/28(土) 20:40
>Lisp, Schemeには型がない
これは曖昧な表現だと思います。
「変数にはどんな型のデータも入る」の方が良いかと。
つまりデータについての型は存在します。
(a . b) =>pair型(dot対)
(a) =>list型 (=> (a . '()))
a=>symbol型
#\a=>character型
"a"=>string型
#(〜)=>vector型
#t #f =>boolean型
(lambda ()〜)=>closure型
(call/cc 〜)=>継続型
など
変数として使えるのはsymbol型とpair,list型だけですが。
56デフォルトの名無しさん:2001/04/29(日) 16:08
そういうのも昔は型がないといったもんだが...まあ弱い型って
いうのが最近の呼び方かな。
57デフォルトの名無しさん:2001/04/29(日) 19:56
>>56
もしかして昔は、データ(今風にいえばObject)に
(実行時)型情報も持たせるのは、コスト的に重いんで
メジャーな戦略ではなかった、のでしょうか?

つーても、卑近な意味でのジツヨー言語のことだけ考えても
この場合ショウガナイだろうしなあ。
58デフォルトの名無しさん:2001/04/29(日) 19:59
>>55
>変数として使えるのはsymbol型とpair,list型だけですが。
vector型も追加だ(゚Д゚)
59デフォルトの名無しさん:2001/04/30(月) 02:52
いやー、Lisp1.5のころ (Fortranと同じぐらい) からだから、
そうともいえないだろうが >>57
そのころの Lispは、汎用言語とは考えられてなかったかも知れぬが。
型なし言語(BCPLとか?) はそもそも「型なし」と形容する必要さえ
認識されてなかった、というのが俺の邪推。
60デフォルトの名無しさん:2001/04/30(月) 02:54
>>58 変数として使える、って意味はなんだ??
55にあがってるのはみんな一級の値(First class value)だから
代入とかはできるはずだが。
後 number型がないな >>55
6155:2001/04/30(月) 04:58
defineとか〜set!ができるって意味です>>60
number型だったら
(define 1 'a)
とかできないでしょ?
62デフォルトの名無しさん:2001/04/30(月) 16:51
>>40
OCamlとかSMLは副作用を認めてると言うより(多少は認めてるけど)
型推論を可能にしつつreferenceを表せるような
強力な型理論を頑張って作ったんだよね。
だからwhileループなんかが関数型の枠組みのなかで表現できる。
6360:2001/05/01(火) 03:42
>>61 vector型を変数として使えるのか?
(define #(a) 1) なんてできないよな?
(define (a b) ...) だって
(define a (lambda (b) ...)) のsyntactic sugarに過ぎないし。
∴変数として使えるのは symbolにきまっとる。
64>63:2001/05/01(火) 04:27
あの〜、
vector-set!とか忘れてません?
(define vec (vector 'a 'b)) ;=> vec
(vector-set! vec 0 'c) ;=> #(c b)
vec
=> #(c b)
65>63:2001/05/01(火) 04:32
listも
(define lis (list 'a 'b)) ;=> lis
(set-car! lis 'c) ;=> (c b)
lis
=>(c b)
66>63:2001/05/01(火) 04:34
あ、defineができないって意味ですか。
失礼しました。
67デフォルトの名無しさん:2001/05/01(火) 04:47
defineは「何かを」人間が判りやすいように、
「名前で参照」可能にするための物で、
変数としても見れるけど、意味が少し異なる。
6867:2001/05/01(火) 04:52
あ、>67
変数→入れ物のまちがい。
変数って用語は「名前」を前提にしないと意味不明なので。
よってsymbolは変数、
list/vector/pairなどは入れ物。
って解釈で良い?
6967:2001/05/01(火) 04:53
または無名変数とか。>入れ物
7067:2001/05/01(火) 05:00
てことは、
(lambda〜
(let〜
なんかも入れ物の内に入るのか。
(lambda〜) ;=>closueの入れ物
(let〜) ;=>環境の入れ物
7167:2001/05/01(火) 05:30
ということは、
(define s
 (let ((x 300))
  (lambda (param)
   (list-ref (current-environment) param))))
とした時、
(s 0)
=> ((param . 0))
(s 1)
=> ((x . 300))
が返るわけだ。
7267:2001/05/01(火) 05:35
(set-cdr! (car (s 1)) 100)
(s 1)
=> ((x . 100))
だんだんわかってきました。
7367:2001/05/01(火) 05:57
>>71-72 を応用すればローカルスコープの変数を増やしたりもできる。

結論:Schemeは自由度がかなり高い。
なんであんまり普及しないんだろう?
・・括弧だらけだからか。
74デフォルトの名無しさん:2001/05/01(火) 08:42
頭のなかをリカーシブにしなくちゃいけないから。
リスト構造の物を扱うときは、Cでもリカーシブで
プログラムつくるけど、そうすると引き継いだやつから
こんなプログラム書いていいんですか、といわれる。
理解できないだって。
75デフォルトの名無しさん:2001/05/01(火) 10:40
>>68 mutable data typeじゃダメか?
変数はどうやっても defineで定義するか lambdaで導入するもの。
76デフォルトの名無しさん:2001/05/01(火) 10:44
>>74 本来、再帰のほうが自然な構造だと思うけどな。
数学でも再帰のほうがよく使われるし。
Fortranからの悪しき伝統だと思いたい。
#でもやぱり末尾再帰できる形にコードを変換するのは
#面倒だったり
77デフォルトの名無しさん:2001/05/01(火) 14:24
>>74 >>76

再帰を難しいと思って(思い込んで)いるかどうか?が、
そいつの頭悪い度&プログラマ不向き度(笑)を計る
1つのバロメータだと思われ。

でも
>#でもやぱり末尾再帰できる形にコードを変換するのは

なんかそんなことをわざわざする(しないとならない)
ってのは本末転倒だなとも思う。

78デフォルトの名無しさん:2001/05/02(水) 00:13
再帰は慣れだと思うけど。
末尾再帰はテンプレートとして覚えれば良いと思う。
↓は末尾再帰
末尾再帰でスタックフレームを生成しない処理系ならばwhile(rest)と同じ。
func(rest) {
return (rest) func(rest - 1) : rest; }
こっちは普通の再帰。+restのせいでスタックフレームが生成される。
func(rest) {
return (rest) func(rest - 1) + rest : rest; }
79デフォルトの名無しさん:2001/05/02(水) 04:15
再帰を普通のループに直す方法で参考になるサイトありませんか?
80デフォルトの名無しさん:2001/05/03(木) 16:42
副作用について教えてください。
代入は副作用だそうですが、なぜ関数型言語での代入に相当するような
動作は副作用ではないとされているのですか?
81デフォルトの名無しさん:2001/05/03(木) 16:48
>関数型言語での代入に相当するような動作
どの事いってるの?
もうちょっと具体的に。
8280:2001/05/03(木) 17:04
>>81
例えば、a=1;という文があったとき、これはどう見ても代入に
しか見えないのですが、なぜこれは関数型言語では副作用では
ないのですか?
常に新しい変数を作るからという解説は良く見かけますが、
それだとなぜ副作用にならないんですか?
83デフォルトの名無しさん:2001/05/03(木) 22:52
あげ。
どの言語ですか?>82
84デフォルトの名無しさん:2001/05/04(金) 00:04
>>83
だから代入の無い関数型言語だろ。
85デフォルトの名無しさん:2001/05/04(金) 00:32
>>82
代入じゃなくって定義だと思えば?
86デフォルトの名無しさん:2001/05/04(金) 14:16
時間軸に沿って見た場合、aの値がずっと同じなら定義。で、変化するなら
代入。って感じかな。Pascalの = と := の違いを思い出す。
ああ、スコープが別な aはもちろん別物として扱ってな。

っていうか、時間軸なんかなくて、本来すべて静的な定義として書くのが
関数型言語の理想。数学にも時間軸はないように。
でも対話的処理とか時間がからむものを書こうとすると
monadとかいって苦労するんだな、これが..
87デフォルトの名無しさん:2001/05/04(金) 14:56
>>86
ふーん。
ってことは、UMLでいう状態図とシーケンス図は
最も遠い存在ってことか…。

うーん。「数学に時間軸がない」こと自体が既に
(数学を)嫌なんで、やっぱりパスかな俺にとっては。

#でも、ほんとうに数学に時間軸無いの?
#時間軸ある数学だって当然だが構築可能だよね?だよね?
8880:2001/05/04(金) 18:56
>>85-86
そういう違いはわかるんだけど、だったら、
なんで定義の方は副作用じゃないんですか?
環境に新しい物を加えるのだから副作用じゃない
のですか?
89デフォルトの名無しさん:2001/05/04(金) 21:15
object的 identityはない世界だからねえ。
まあ、それがゆえに実世界の問題のモデリングは面倒じゃ、
とは思えなくもない。

数学 (つーか論理学) にも時間が入ったのはあって、
様相論理ってのはその一つだな。◇や□が出てくる。
monadと様相論理が関係あったかどうかは忘れた。
monadと線形論理をからめた論文は見た気がするがな。
見ただけで読んでない。
90>88:2001/05/04(金) 21:52
「加えた」のではなくて「定義が記述されている」といえば?
9180:2001/05/04(金) 23:47
>>90
状況によっては、動的に変数が増えていくことになりますよね?
だから、静的なあらかじめ記述された定義とは根本的に違うような
気がするんです。
9280:2001/05/04(金) 23:50
定義にしろなんにしろ、動的にオブジェクトが増えていく場合、これを
副作用と言わないのはなぜでしょうか?
環境は変化していると思いますし、値を返す以上のことを行っている
ように思えます。
93某スレの1:2001/05/05(土) 00:13
よくわかりませんが、
Scheme流に言えば、「定義」を「破壊」した時点で、
それはもはや「定義」とは見なせないとは思います。
(define a 1) => aは1、という定義。
(set! a 2) => aは1、という定義を破壊(消滅)し、
新たにaは2、という定義を作る。
=>これが変数。
const-defineなんて構文があったら都合がいいのかな?
94デフォルトの名無しさん:2001/05/05(土) 00:57
>>89
実世界のモデリングという言い方にはいつも
ひっかかりを覚えるんだけど(^^;、
OOの立場(?)から言えば、
イデアだってメタクラスのインスタンス
でしかないんだよね。
形而上だからってOOのモデルで扱えない
って言いきることは無理なんで、まぁ…
9562:2001/05/05(土) 02:15
>>80
>>82
62に書いたことが理論的には答えなんだけど,
論文が見つかったのでもう少し詳しく説明してみるね.

MLでのx=1というのは,既に存在する環境
(変数名と値の対の集まり)を明示するコマンドであり,
式を評価するときに自由変数xの値を使えるように明示すると思えばいい.
これを変えるような操作を代入というわけだけど,
これは時間軸にそって環境が変化することを意味するから
状態を持つことになるので関数型では許されない.

でもやっぱり代入に相当することは欲しいので状態の変化を何とかして表したい.
そこでどうするかというと,ポインタのようなもので
それは単なる値を指しているのではなく
次の状態の環境込みのもの(クロージャ)を指していると考える.
すると,そのクロージャの中の環境にその変数名がまた現れている可能性があるので
ここでぐるぐる回る自己参照のような問題が起こる.
よって,こういうデータを扱えるようにMLの型システムを拡張してやれば
見かけ上代入可能な変数が使えることになる.

これの理論的な意味付けを行った論文が

R. Milner(MLを作った人ね) and M. Tofte
Co-induction in relational semantics
Theoretical Computer Science 87 (1991) 209--200.

であり,例えばOCamlではmutableな変数とimmutableな変数は
理論的には違うものなのでわざわざ区別しているし,
SMLでも代入に見える:=(だっけ?最近書いてないもんで)が
関数型の枠組みで正当化できる.

こういう変数があれば手続き型言語での
ループのカウンタ(ループを回る度に状態が変化する)に使えるので、
そういったループが関数型の枠組みで自然にかけるようになる.
こんなとこかな?
9662:2001/05/05(土) 02:48
>>87
時間がない、というのは要するにコンパイル時の静的な(つまり実行する前の)
プログラム解析(型チェックとか型推論とか)に意味を見いだしているから。
時間が入っているような動作も、95のようになんとかして
静的な解析が可能なように理論づけをしようとするわけ。

だから元々実行時のチェックが本質的な応用とはあまり相性がよくない。
それでも継続とかmonadとか使って頑張るわけだが、各monadの定義は
理論上メタレベルで行われる(論理で様相を自分で定義するようなもの)
のでまあ一種の反則ともいえる。
97デフォルトの名無しさん:2001/05/05(土) 02:54
Schemeの話です。
破壊的代入も環境モデルを使えば素直に理解できると思うが。
9862:2001/05/05(土) 03:28
>>97
80-84は副作用のない純粋な関数型言語の話だと思ったけど、違った?
MLは例に過ぎなくて、代入らしきことを副作用のない関数型の枠組みに
どのように取り込むかという話だと思って頂ければ幸いなり。
9962:2001/05/05(土) 21:22
>>95
ちょこっと修正.

> こういうデータを扱えるように

こういうモデルで意味が与えられるように

> Theoretical Computer Science 87 (1991) 209--200.

209--220

> SMLでも代入に見える:=(だっけ?最近書いてないもんで)が
> 関数型の枠組みで正当化できる.

SMLでは参照型を導入してそれを:=の左に持ってくることにより実現している.
真面目に調べたい物好きな人向けには

Mads Tofte
Type Inference for Polymorphic References
Information and Computation 89 (1990) 1--34.

に具体的な型システムが載っているので参考までに.

>>88
プログラムの静的な解析が可能ということから
使用する値は最初からどこかの領域に格納されていると考えることができます.
終了しないプログラムもあるので領域は無限にあることもあります.
val x = 1;などで1が格納されたある領域がxという名前で
アクセスできるようになりますが,
その領域は作られたのではなく以前からあったと考えるわけです.
val x = 2;とすると別の場所にある2というデータを
xという名前でアクセスするということになります.
これは以前のxと領域を共有していないので
必要ならば適切に変数の変換をしてやることにより
以前のxとは別の名前と考えることができることが保証されています.
よって本質的には代入ではないわけです.
100>99:2001/05/06(日) 01:37
本質的には代入じゃないけど、実装は変数とあんま変わらないんだよなあ。
へ理屈というか、考え方が違うって事なんだろうけど。
とりあえずage
101デフォルトの名無しさん:2001/05/06(日) 02:35
切り番おめあげ
10262:2001/05/07(月) 03:04
>>100
そうですね,上の話でも現実には領域は有限だから,
実装では使わなくなった領域をせっせとGCで集めて再利用しています.
このように実装は理論の与える直観そのものでなくても
それと矛盾してなければよいわけですが,一方で良い実装が可能であることは
理論を考えるときでも重要なポイントになります.

あとユーザが理論をそれほどよく知らなくても使えることも重要です
(call/ccなんかはその点でちょっと苦しい).
ですからOCamlやMLの動作をユーザが代入による副作用と理解することが
おかしいと主張しているわけではありません.
ML系の場合,型推論という旨味も失いたくないので
副作用でない新たな理屈付けが必要だったわけですが,
それをユーザの方には参照型とかmutable/immutable(可変/不変)という
比較的理解しやすいと思われる見かけで提示しているわけです.

連休も終わったしそろそろこの話もおしまいかな.
103デフォルトの名無しさん:2001/05/07(月) 04:31
>>102
代入を許すと型推論が出来なくなるのか?
104デフォルトの名無しさん:2001/05/07(月) 11:27
>>62 MLみたいな副作用がある片端関数型言語を
正統的理論みたいに宣伝するなゴルァ!
強い型付けと代入の有無は本来直交した概念。
弱い型で代入がない純粋関数型言語ってのもありうるだろう。

まあ、実際代入があると型推論あたりで面倒なことが
起こった気はするがね。それの解決法が [62]だったような。
変数定義時よりも一般的な型が代入される可能性もあるわけだし。
10562:2001/05/07(月) 14:03
>> 103
単に代入だけならいくらでも意味は付くけど,
静的で複雑な型が絡むと色々難しいねえ.
MLの型理論の場合は高階型や多相型などの豊かな型と
停止する型推論などの便利さが巧妙にバランスしているので,
なんとかそこから大きく外れずに解決したいというとこかな.

>> 104
おう、好きな言語をどんどん語ってくれぃ.
MLは適度にいい加減で汚いところがいいっす.
SML/NJは好きじゃないけど.

> 弱い型で代入がない純粋関数型言語ってのもありうるだろう。

もちろんっす.その場合も99後半の考え方は使える.
でもそういう言語はドメイン理論を使う方が説明しやすいな.
話の都合上,代入の話と型付きの話が混じってしまったのはスマソ.

さあ仕事仕事。
106デフォルトの名無しさん:2001/05/07(月) 18:16
>>104
純粋な関数型言語と言っても代入を屁理屈で代入じゃないと
強弁してるだけじゃないの?
型推論のしやすさ等で実質的違いは無いと思うけど。
107デフォルトの名無しさん:2001/05/08(火) 17:06
ってか、もうちょっと簡単な日本語しゃべりやがれ。
さっぱりわからん(鬱
10880:2001/05/08(火) 18:28
>>95
型システムを改良することでどうして代入が扱えるようになるんでしょうか?
さっぱりわかりません。
>Co-induction in relational semantics
この論文はネット上では公開されていないですね。
大学で探してみることにします。

>>99
でもxという名前と値のつながりを変更したことになりますよね?
名前と値のつながりは環境ではないのでしょうか?
109デフォルトの名無しさん:2001/05/08(火) 19:00
関数型言語の originalである、Backusの FPにはそもそも
変数がないぞ!!
αとか意味不明の記号が出てきてわけわかだけどな。
こっから辿れば、関数型言語における変数なんて、sytactic sugarに
すぎないと思えるもの。
110デフォルトの名無しさん:2001/05/08(火) 19:46
>>109
syntax sugarのことか?
ま、へ理屈だろ。
111デフォルトの名無しさん:2001/05/08(火) 21:25
>>108
>でもxという名前と値のつながりを変更したことになりますよね?
変更じゃなくて、定義のスコープが変化して見掛け上、
上書きされたということでは?
(ちょっと違うかもしれないけど、考え方として)
静的なschemeのプログラムの継続をlambdaで表現すると
こんな感じになると思います。
ちなみにschemeの継続はプログラムが終るまで無限に続きます。
(lambda (x1 x)
      ...
 (lambda (x2 y)
      ...
  (lambda (x3 z x)
      ...
      (lambda (xn) )))....)
で、x1x2x3の地点でそれぞれのxの定義は内部のlambdaによって
隠す事ができる。例えばx3のxとx1のxは同じ値を持ってる必要は
無いと。わかりにくいかな?
112デフォルトの名無しさん:2001/05/08(火) 21:49
ついでに、schemeの継続はプログラム終了まで無限に作られるが、
継続がどこからも参照されてないと証明できればその継続はgc時に
回収される。
(define x 'a)
...
(define x ())
の継続の変化を図にすると、

継続→
**************************************//****|プログラム終端
   ↑x=a ↑x=()

xは次回のgcで回収が見込める部分
*********xxxxxxxxxxxxxx**************//****|プログラム終端
   ↑x=a ↑x=()
113デフォルトの名無しさん:2001/05/08(火) 21:49
>>111
正解
114デフォルトの名無しさん:2001/05/08(火) 21:50
ああ、ずれた・・
正しくは↑x=a から↑x=() の間がxxxx..です。
115デフォルトの名無しさん:2001/05/08(火) 23:19
>>111-112
これ、すごくわかりやすい。
関数型言語のイメージが掴めた様な気がします。ありがとう。

まだ型推論の意味が謎ですが。
116デフォルトの名無しさん:2001/05/09(水) 01:59
>>111
新しいxを生成するのは副作用でない?
117デフォルトの名無しさん:2001/05/09(水) 02:26
新しいx=仮引数パラメータだから副作用とは言いません。>116
11862:2001/05/09(水) 02:33
111さんが継続を使って色々説明をしてくださっていますが,
私の書いていたことに関連する日本語での記述がありました.

コンピュータサイエンス入門 --- アルゴリズムとプログラミング言語
大堀淳,ジャック・ガリグ,西村進 著
岩波書店

の14章で,ラムダ計算の操作的意味論として,
コンビネータへのコンパイル,自然意味論,
SECDマシンへのコンパイル,の三つが簡潔に紹介されています.
このうちの前二者が上で話したことと関係しています.

コンビネータ論理というのは,コンビネータと呼ばれる定数項と
その組み合わせの変形規則からなる体系で,変数は現れません.
>>109で紹介されていたBackusのFPはその一種と考えることができます.
コンビネータ論理では変数がないので
その変形を計算と考えると副作用というものも当然ありません.
そして実はコンビネータとラムダ項は
S → λx.λy.λz.(xz)(yz)
K → λx.λy.x
λx.x → SKK
といった具合いにお互いに翻訳が可能です.
>>99 で述べた変数を隠してしまう変換の極端な場合が
ラムダ項からコンビネータへのコンパイルだと思って頂いても構いません.

一方,Milner-Tofteの論文でrelational semanticsと
呼んでいた意味論がここで言う自然意味論です.
>>95 の説明でも触れたようにここでは式に対応する値に環境をくっつけます.
(これは副作用を導入すると言うより環境を値の一部と考えることに近い).
当然ながらクロージャの意味などは自然に付けることができます.

これらはどれもラムダ計算に対する操作的意味論であり,
同じ計算結果を与えますが,見方の違いにより
ラムダ計算を純粋な関数型の変形と見ることもできるし,
環境を取り込んだものと見ることもできるということです.

同じ言語に対する異なる屁理屈なわけですね.

そしてさらに上記のテキストには書いてありませんが,
>>95 で説明したように,Milner-TofteおよびTofteの論文の手法により
自然意味論を使って参照型に意味を与えることができます.
ただしこのとき環境に循環が発生してしまう可能性があり,
ある種の無限対象として必要がでてくるので,
これを最大不動点として意味を考えて余帰納法(coinduction)で
推論することにより解決しています.
(最大不動点と余帰納法は,無限プロセスなどの無限対象の
厳密な意味と同値性を与えるときによく使われる手法です.
無限のものは全部比較して同値判定するわけにはいかないから
普通の帰納法は使えない).

こう書くと多少はすっきりするかなあ。
11962:2001/05/09(水) 03:02
>>118 訂正。

> >>99 で述べた変数を隠してしまう変換の極端な場合が
>>99 で述べた代入を隠してしまう変換の極端な場合が

> ある種の無限対象として必要がでてくるので,
ある種の無限対象として扱う必要がでてくるので,
120デフォルトの名無しさん:2001/05/09(水) 03:06
>>115
型推論
val y = x+1;
+は両辺同じ型でなくてはなら無いのでxは整数型。
よってyも整数型と推論できる。
だから yの型を宣言する必要が無い。
fun z(x) = x;
とすると、xがどの型でも取りうると推論できるから、
関数z(x)は特定の型に捕らわれない関数宣言になる。
fun z(x:int) = x;
とすると、xはint型しか取らないようにできる。
このようにして、状況に応じて、型の限定を利用するのか
型無し言語のような柔軟性を持たせるのか、切り替える
ことができる。
121デフォルトの名無しさん:2001/05/09(水) 03:22
C言語も見方を変えるだけで、代入の無い言語に出来ます。(藁
122デフォルトの名無しさん:2001/05/09(水) 03:25
「新しい x とその値の対応を生成するのは副作用ではない?」
という問いは、実はλ式とはなにか、置き換えとは何か、変数
(仮引数)とはなにか、という本質的問いにつながる大きな質問
なのですが、実際にはそこまで行かずとも通常の言語における
副作用は排除できているので問題なし、という捕らえ方でよい
んだよね?>学術系の人

(変数などの)項書き換え規則の「意味」や「解釈」をさらに後ろから
支える論理体系って、何かあるのだろうか。
123デフォルトの名無しさん:2001/05/09(水) 03:28
いや、バックにくっついている理論によって副作用になったり
ならなかったりするだけで、本当は違いが無いってことだろ?
何が違うのさ?
124デフォルトの名無しさん:2001/05/09(水) 03:35
そりゃ何もかも考え方の違いを除けばすべていっしょ、
なわけだけど、その「考え方の違い」というか記数法の
違いによって、ものごとを考える範囲や考え方が異なって
くる、ってとこに意味があるんじゃないの?

実際、ローマ数字のままで現代数学は発展しえたか、とか。
125デフォルトの名無しさん:2001/05/09(水) 03:39
void*ばかり使ってたらCも型無し言語と同じだがや。
もちろんCのコンパイラは型推論なんてしてくれへんねん。
C++や型推論の使える(可能性がある)型無し言語より分が悪いの。
インライン化やオプチマイヅつーか、そこんとこで。
126デフォルトの名無しさん:2001/05/09(水) 03:40
SMLだと関数を定義するのも変数を定義するのも同じこと。
よって変数を定義するのを副作用というなら
関数の定義も副作用ということになる。
127デフォルトの名無しさん:2001/05/09(水) 03:46
>>125
型推論の使える形無し言語って何だ?
型ありじゃないと型推論なんてありえんぞ。
128デフォルトの名無しさん:2001/05/09(水) 03:48
>>124
そういう意味じゃない。
記数法に実質的違いがないだろ。
関数型言語のx=1だろうがC言語のx=1だろうが、
どれも同じだろ。
129125>127:2001/05/09(水) 03:52
>>120 参照。
データ型が1つでも指定されてれば型推論は可能なのねん。
決まったデータ型を返す関数からも、もちろん可能。
130デフォルトの名無しさん:2001/05/09(水) 03:53
void*ばかり使うってのは実質不可能だろ。
キャストしないと演算子が使えなくないか?
131127:2001/05/09(水) 03:56
>>129
え?変数の型を推論するのが型推論だろ?
132デフォルトの名無しさん:2001/05/09(水) 03:59
>>131
関数の型も推論するよ。
133127:2001/05/09(水) 04:00
つか、120を書いたのは俺なんだが。
134デフォルトの名無しさん:2001/05/09(水) 04:02
>>133
ワラタ
135127:2001/05/09(水) 04:06
>>131
なるほど、確かにそのとおりだ。
しかし、変数に型が無い言語で関数の型を
推論してなんか意味があるのか?
136デフォルトの名無しさん:2001/05/09(水) 04:06
lisp/schemeでもデータ型から辿っていって、
型チェックをするってプログラムを書けます。
関数定義がデータと同義なので、
定義自体をデータとして解析できるのです。
当然文法チェッカや型チェッカも作れます。
Cでいうlintが自分のプログラムと同じ階層で走る様な物です。
さらに、動的に部分コンパイルやインライン展開する事もできます。
Cでいうコンパイラが自分のプログラムと同じ階層で走る様な物です。
まさにlisp/scheme言語は誰もが憧れる夢の言語なのです。
137132:2001/05/09(水) 04:08
>>135
ごめん。ちゃんと読んでなかった。
型無し言語の話だったのね…。
138127:2001/05/09(水) 04:13
>>137
そうなのか。それなら別に良いけど。
139125:2001/05/09(水) 04:17
ちょちねぼけてました。すんません
140デフォルトの名無しさん:2001/05/09(水) 21:30
Haskellマンセー
14162:2001/05/10(木) 00:01
>>136
煽りにマジレスしておくと,夢の言語かどうかは別にして
私もLispの最大の特徴はquoteだと思っています.
これがレスになっていることは分かるよね?>136.

面白いのでこちらに挙げておこう.
http://www.shiro.dreamhost.com/scheme/trans/beating-the-averages-j.html
142デフォルトの名無しさん:2001/05/10(木) 00:54
>>141
確かにquoteが無いと、マクロが書けないし、
シンボルそのものが欲しいときなどにどうしようもないですね。
'(+ - =)
=>(+ - =)
(list + - =)
;=>(#<prim+> #<prim-> #<prim=>)
`( ,+ ,- ,=)
;=>(#<prim+> #<prim-> #<prim=>)
`,`( ,+ ,- ,=)
;=>(#<prim+> #<prim-> #<prim=>)
`(,@`( ,+ ,- ,=))
;=>(#<prim+> #<prim-> #<prim=>)
(define a `(,@`( ,+ ,- ,=)))
;=>a
(eval '`,a)
;=>(#<prim+> #<prim-> #<prim=>)
(eval '`(,@a))
;=>(#<prim+> #<prim-> #<prim=>)
(eval '(eval '(eval '(eval '`(,@a)]
;=>(#<prim+> #<prim-> #<prim=>)
'quoteマンセー
=>quoteマンセー
143デフォルトの名無しさん:2001/05/10(木) 01:16
>>141 のリンクから飛べるけど、これおもろいね。
管理職のためのハッカー FAQ
ttp://www1.neweb.ne.jp/wa/yamdas/column/technique/hackerj.html
ハッカーのための管理職 FAQ
ttp://www1.neweb.ne.jp/wa/yamdas/column/technique/managerj.html
ハッカーのための管理職 FAQ(パロディ)
ttp://hp.vector.co.jp/authors/VA009232/stinger/Hackerfaq.html
144デフォルトの名無しさん:2001/05/10(木) 03:50
evalがある言語なら136の言ってること全部できるじゃん。
145デフォルトの名無しさん:2001/05/10(木) 05:02
あっそ>144
146デフォルトの名無しさん:2001/05/10(木) 18:53
up
147デフォルトの名無しさん:2001/05/10(木) 19:22
Lispの開発効率とHaskellの開発効率ってどっちが高いんだろう。
個人的にはHaskellのような気がする。
148デフォルトの名無しさん:2001/05/10(木) 23:12
ここの人たちって、MLやHaskellをどこで学んだんですか?
マイナーすぎて本とか全く見ないんですが。
149英語わかりましぇん:2001/05/11(金) 00:18
150149:2001/05/11(金) 00:20
下の奴開けない?
Haskellで検索してもないんだよね。
どうやって勉強したのでしょ?
151デフォルトの名無しさん:2001/05/11(金) 01:32
152デフォルトの名無しさん:2001/05/11(金) 14:35
>>151
少し読んでみたが、あんまりやさしい入門じゃない。
SchemeかMLの知識がないとだめだろ。
153149:2001/05/11(金) 18:35
>>151
ありがたう。
154デフォルトの名無しさん:2001/05/11(金) 18:46
age
155デフォルトの名無しさん:2001/05/11(金) 20:06
Lispとschemeって結構近いやん?
haskellってMLに近いの?
>>1であがってるFPやMirrandaって話題出てないけど
どんな感じなの?
156デフォルトの名無しさん:2001/05/11(金) 22:04
http://www.cs.chalmers.se/~augustss/AFP/overview.html

Haskell vs. Ada vs. C++ vs Awk vs. ... An
experiment in Software Prototyping Productivity

compares a number of programming languages in a
prototyping experiment conducted by the US
Advanced Research Project Agency (ARPA) and others.
Among the results: The prototype required 83
lines of code and 10 hours of development time
when coded in Haskell. The figures for Ada were
767 lines / 23 hours, and for C++ 1105 lines.
A graduate student who first got 8 days to learn
Haskell wrote a prototype in 8 hours!

ほんまかいな? 論文へのリンクは切れてる。
157デフォルトの名無しさん:2001/05/11(金) 23:14
>>156
Haskellはすごいって話?
C++は糞ってか?
つーか英語わかんねぇよ。
Haskellでは83行に10時間かかったの?

ああ鬱だ
15862:2001/05/12(土) 00:04
>>147
そういえば理論屋でないHaskellな人に聞きたいんだけど
モナドって分かりやすいと思いますか?どのように理解していますか?
元の理論を知っていればそれなりに納得できるだろうけど,
普通のプログラマにとっては取っ掛かりがなくて分かりにくいと思うんだけど.
個人的にはここが気になるのでちょっと最強の言語とは言えないなあ(あ,スレ違いか).
159デフォルトの名無しさん:2001/05/12(土) 00:33
>>157
つまり、同じ問題出して一斉に解かせたら、
Haskellの場合、たったの83行のコードで問題を解決することができて、
10時間しか問題解決にかからなかったと言うことだろ。
Adaは767行で23時間。C++は1105行もかかったと。

つまりHaskellは凄すぎるってこと。
160デフォルトの名無しさん:2001/05/12(土) 01:03
探したらその論文結構有名なようで、あちこち検索に引っかかった。
論文本体もここにあった。
www.cs.uwa.edu.au/undergraduate/units/230.301/papers/hudak-prototyping.pdf
www.ai.sri.com/~heller/Lisp/jfp.ps.Z

pdfの方は横になって見にくかったので、PostScriptの方を見たが、
Relatinal Lispという言語は3時間で終わってる…(藁
行数はでかくなったようだが。

C++はどうやら時間かかりすぎて計測不能だったようだ。
あと、Haskell初級者の学生が、Haskellで8時間で終わらせてしまったという
結果もある。
161デフォルトの名無しさん:2001/05/12(土) 01:14
>>156
論文のpsファイルをここからダウンロードできる。

http://www.ai.sri.com/~heller/Lisp/

アメリカ海軍が問題を提供し評価をしたようだが、論文の著者は
2人とも関数型言語の研究者で、特にPaul HudakはHaskell
コミュニティーの中心的な人物です。かなり眉唾か?
162デフォルトの名無しさん:2001/05/12(土) 01:17
prototypeが関数型言語で書きやすい物だったに一票
163デフォルトの名無しさん:2001/05/12(土) 01:20
>>161
つーか、その二人目のやつが実際に問題解いたそうだ。
しかし、中心的な人物が学生に負けるとは…
164163:2001/05/12(土) 01:23
ん?Paulはファーストアーサーか。
問題解いたのはMarkの方だ。
165デフォルトの名無しさん :2001/05/12(土) 03:34
>>136
>型チェックをするってプログラムを書けます。

わざわざ書かなあかんの?
166デフォルトの名無しさん:2001/05/12(土) 05:57
わざわざって、そんなに難しい事か?>165
167デフォルトの名無しさん:2001/05/12(土) 12:07
それなりに面倒だと思うけど。
それにコンパイラがチェックしてくれるわけでもないなら
あまり意味が無い。
168デフォルトの名無しさん:2001/05/12(土) 13:37
意味ないわけないだろ。作りようによっては推測・自動修正して
結果を報告する様にもできるぞ。>167
結局、環境リストと定義リストの探索だから、そんなに難しくはない。
変数(バインドされたシンボル)の使われ方を辿っていって、
外部データ表現(または構造)に辿り着く様であれば、それで変数の
型が特定する。
169デフォルトの名無しさん:2001/05/12(土) 13:44
168によって型が特定したら、イリーガルな操作を行なっている部分
を列挙できる。
ちなみに型の特定は、処理系が用意している基本プリミティブや、
入出力の型が確定しているclosureからもできる。
170デフォルトの名無しさん:2001/05/12(土) 14:06
Haskellって人の名前なのね。
ML知ってる人はこのスレに何人かいる様だけど、
Haskellって皆無なんじゃ?
171デフォルトの名無しさん:2001/05/12(土) 17:26
Haskellマンセーとか言ってた人は、使ってんの?
172デフォルトの名無しさん:2001/05/13(日) 04:22
Haskellマンセーとか言ってた人は、使ってんの?
17362:2001/05/13(日) 04:39
型チェックと型推論は区別してくれい.

型チェックは変数や対象の型が整合しているかどうかチェックすること.
型推論は型宣言が省かれた変数や対象の型を導くこと.
例えばCには型チェックはあるが型推論はない.
すべて明示的に型が宣言されているから.

それで単純な型だけならいいんだが,型システムを多相型に拡張しだすと
どちらについてもコンパイル時に行うには困ることが起こる.
例えば,ある種の多相型に部分型を導入すると
型チェックが止まらないケースが出てくるとか,
MLの型システムに普通にレコード型を導入したら
MLの型推論の意味での単一の型が決定できないケースが出てくるとか.

だから,もしオブジェクト指向のようなことができるように
型システムを拡張しようとするなら,そいつは全然簡単じゃない.
174デフォルトの名無しさん:2001/05/13(日) 08:14
つかったことあるよHaskell
モナドはわかりずらいよね。
Introduction to functional programming using Haskell 2nd ed.
でべんきょした
175デフォルトの名無しさん:2001/05/13(日) 12:41
すみません。もう1つ猿な話させてください。

関数型なる概念の定義の概略はここの皆さんの発言で
なんとなく判った気はします。

で、Lispって関数型言語だということになっているんですよねえ?

でも書籍「List遊び」を読んだ感じでは、(Emacs)Lispは
Listという「データ構造」をいじる言語である、という風に
読めちゃいました。それは明示的な状態(の一種)だと思う
のですが、すると関数型言語っぽくないということに
なるような気が…?
関数云々というよりも、関数もデータも全部Listと見なしてから
全てを考え始める、というノリに思えました。

(Emacs)Lispはたまたまそういう(関数型としては不純な)
言語であり、それは関数型の本質とは無関係だ、
ということでしょうか?
それともそれ以外のなんらかの意味なんでしょうか?
176デフォルトの名無しさん:2001/05/13(日) 14:02
>>175
listを弄るとは言っても、入力されたlistを
直接書き換える事では無いって事。
出力するリストはconsで生成するでしょ。
lispは破壊操作を行なわなければ関数型言語と同じ。
177デフォルトの名無しさん:2001/05/14(月) 00:11
>>168
意味ねぇよ。
その間違った所が実行されきゃ間違った所がわからないだろ。
実行する前に、どこがおかしいか一目瞭然でわかる方が
遥かに良い。
178デフォルトの名無しさん:2001/05/14(月) 13:33
このスレを眺めて思い浮かんだ言葉。
「象牙の塔」
「砂上の楼閣」
179デフォルトの名無しさん:2001/05/14(月) 17:13
熱く語っている方々へ。

○○ってすごいぜ。
□□できるし、
△△はあるし。

と各言語をまとめるとどんな感じになります?

例えば、
C++ってすごいぜ。
オブジェクト指向言語だし、
STLはあるし。
180デフォルトの名無しさん:2001/05/14(月) 17:36
>>178
君のレスを眺めて思い浮かんだ言葉。
「食わず嫌い」

>>179
それぐらいのこと自分で勉強しろ。
181デフォルトの名無しさん:2001/05/14(月) 17:44
>>178
http://www.shiro.dreamhost.com/scheme/trans/beating-the-averages-j.html
とか読んでみそ。
使える人が少ないから業務で使われたりしないだけで
ほんとは十分実用的。
182デフォルトの名無しさん:2001/05/14(月) 17:58
>>181
VB厨はほっといたほうが良いかと思われ。
183デフォルトの名無しさん:2001/05/14(月) 18:12
仕事で必要だったので、Schemeを勉強し、今業務で使っています。
仕事以外でもSchemeやHaskellをいじって遊ぶのはほんとに楽
しい。それだけで十分だと思います。
184デフォルトの名無しさん:2001/05/14(月) 18:19
>>50とか>>178ってなんなんだろ?
VB厨かな?C++厨?
185178=179:2001/05/14(月) 19:13
えーと、このスレで話されてることに非常に惹かれるのですが、
読んでもさっぱりわからないし、一体何故そんなに熱く語れるのか
是非知りたいので質問して見ました。

ちなみに>>107も僕です(鬱
186デフォルトの名無しさん:2001/05/14(月) 22:07
>>185
とりあえずSICPの第1章だけでも読んでみてください。
http://sicp.arsdigita.org/text/sicp/
1章で関数型プログラミングの基礎を説明しています。言語はSchemeです。
187182:2001/05/15(火) 08:15
>>185
VB厨なんていってごめんなさい。
死んでおわびします。
がんばって関数型言語勉強してちょ。
188178=179:2001/05/15(火) 12:53
>>186-187
さんきう。
紹介していただいたページのタイトル
'Building Abstractions with Procedures'
のうまい訳がわからずいきなり鬱に入ってますが、
とりあえず読みすすめてみます。
189178=179:2001/05/15(火) 12:56
ぬぅ、この分量だと、俺の英語力だと一ヶ月くらいかかりそうだ。
早く、'Satori'を体験して見たいなぁ。
では、またROMに戻るナリ。
190デフォルトの名無しさん:2001/05/16(水) 01:41
そんなに英語力が無いなら、素直に日本語のSchemeや
ML書籍読めば?
191>189:2001/05/16(水) 02:06
SICP(計算機プログラムの構造と解釈)は外せないと、思った。
ちょっと古いせいか、マクロや継続の説明は無かったけど。
サンプルコードはMITのサイトにあった様な。
192デフォルトの名無しさん:2001/05/16(水) 09:19
>>191
SICPはプログラミングの教科書であって、Schemeの解説書では
ないので、使っているSchemeの機能は限定されてますね。ちなみ
に第2版は1996年出版なのでそれほど古くはないと思います。
193デフォルトの名無しさん:2001/05/16(水) 22:16
age
194デフォルトの名無しさん:2001/05/17(木) 04:32
下がってきたので、皆で関数型でのプログラミング経験を書いてみよう。
俺、Haskell5000行くらい。
195デフォルトの名無しさん:2001/05/17(木) 07:19
行数?
lisp 昔は結構書いた(今はあんまり)
SML ちょびっと
scheme10kステップぐらい。
関数型言語として書いたのはその半分以下に落ち込むでしょう。
196デフォルトの名無しさん:2001/05/17(木) 08:52
Scheme 仕事で3000行ぐらい。遊びでは2万行ぐらい。
>>194
Haskellに憧れているのですが、どんなプログラムを作ったの
ですか。差し支えない程度に教えてください。
197デフォルトの名無しさん:2001/05/17(木) 15:16
HaskellよりMLの方がわかりやすい。
ところで、MLってOOPはどうやるの?
クラスのかわりにモジュール使うの?
198デフォルトの名無しさん:2001/05/17(木) 15:22
>>197
OOやる必要あるのか?
とりあえず Objective caml とかありますぞ。
199デフォルトの名無しさん:2001/05/17(木) 15:49
http://www.linuxdoc.org/HOWTO/mini/Programming-Languages-2.html
に関数型プログラミングはOOPのスーパーセットだと書いてあります。

Functional languages (Lisp for example) are a bit
different breed - among other things, functional
programming is a superset of OOP.

MLはわからないですが、SICPではSchemeでのOOPがでてきますね。
200デフォルトの名無しさん:2001/05/17(木) 16:04
>>197
モジュールをクラスにしてファンクタを継承がわりに
するんじゃないか?
201デフォルトの名無しさん:2001/05/17(木) 22:05
>196 Haskellで書いたのはコンパイラもどき。

>197 関数型言語がOOPのスーパーセットだっていうのはきつくないか。
OCamlとかはやってるみたいだけど、俺は使ったことない。
俺の友達はやっぱり、関数型とオブジェクト指向って馴染まないと
言っていた。
202デフォルトの名無しさん:2001/05/17(木) 22:56
馴染まないって事はないんじゃないか?
HaskellやO'Camlにはクラスはちゃんとあるし。
何を根拠にそんなことを?
203デフォルトの名無しさん:2001/05/17(木) 23:30
Haskellのクラスはタイプクラスと言うもので
オブジェクト指向のクラスとは異なる。
どっちかと言うとJavaのinterfaceみたいなもの。

Ocamlはオブジェクト指向の要素をとりいれているが
これをつかった友達がしっくり来ないと言っていた。
(自分は使ったことがない)

少なくともHaskellでは状態がないのでOOPでのオブジェクト
は実現が苦しいし、皆が認識しているOOPのプログラミング
スタイルをHaskellのプログラミングスタイルに取り込むの
はきついと思ってるけど。

うーん。説明しづらい。
204デフォルトの名無しさん:2001/05/18(金) 00:53
そういう所は適度に副作用を許しているMLやLISPが都合がいいのかもしれないね。
205デフォルトの名無しさん:2001/05/18(金) 04:36
Haskellって数学好きの人が使うもの?
難しくない?
CとかRubyとかとは、好む人が本質的に違うような雰囲気。
206デフォルトの名無しさん:2001/05/18(金) 06:40
誰かhaskellの特徴的なサンプルコード教えてください。
どこかからのコピペでもいいです。
207デフォルトの名無しさん:2001/05/18(金) 07:01
副作用が無いってことは、作った関数群は恒久的に使いまわせる(再利用できる)
と考えていいですか?
208デフォルトの名無しさん:2001/05/18(金) 09:53
じゃあ、Haskellでのクイックソート

qsort [] = []
qsort (x:xs) = qsort small ++ [x] ++ qsort large
where
small = [y | y <- xs, y < x]
large = [y | y <- xs, y >= x]

small,largeのとこで使ってるのがList Comprehensionという
Haskellにしかない構文
209デフォルトの名無しさん:2001/05/18(金) 09:57
>205 確かに、少し難しいとは思う。かなりプログラムに対する
考え方を変えなければいけないので、Cとかになれてしまっている
人で固執してしまっている人は嫌うんじゃないかな。

>207 そうです。そういった部品(関数)をつなぎ合わせてやっていく
のが関数型のプログラミングともいえるかなぁ。
210デフォルトの名無しさん:2001/05/18(金) 10:03
>>206
Haskellでのクイックソート

qsort [] = []
qsort (x:xs) = qsort [a|a<-xs,a<=x] ++ [x] ++ qsort [a|a<-xs,a>x]

>>207
引数が同一なら必ず同じ値が関数から返される、というのが
参照透明性といって関数型プログラミングの基本です。Cでも
関数の使いまわしをしたい場合はそうするでしょう。
211210:2001/05/18(金) 10:05
考えていたらかぶってしまった。スマソ。
212デフォルトの名無しさん:2001/05/18(金) 11:23
>>207
一瞬ネタかとも思ったが、
そう言われてみれば、状態を変化させないなら
状態を変化させる手続きより使いまわしが数段楽つーか安全
なのは確かなんですね。うーむ。

まぁ、だからといってその見かえりに
状態そのモノを放棄する度胸は、ちょっと…(^^;
OOPは状態を捨てずに救った言語スタイル。
213デフォルトの名無しさん:2001/05/18(金) 14:59
「状態がない」ってのは理屈をつけてごねてるだけで、
実際は状態があるのと大差ない。
214デフォルトの名無しさん:2001/05/18(金) 17:43
無礼と知っててここに書き込みます。
haskellの質問スレが見つからなかったので。すみません。
実は今学校の課題でhaskellつかっているのですが、
さっぱりわかりません。

課題というのは、
有理数aから区間列{(a-(1/(2^n)),a+(1/(2^n)}を表示するというものです。
それで、

list::Int->[Integer]
list n= let f x = (x*2):(f(x*2)) in take n (f 1)

で2のn乗が計算でき、

list2::Rational->[(Rational,Rational)]
list2 a=[(a-1%(n+1),a+1%(n+1)) | n<- [1..]]

で有理数aから区間列{(a-(1/(n+1)),a+(1/(n+1)}を表示できたのですが、
どうしても2のn乗を表示できません。
どなたか教えていただけませんか?
21562:2001/05/18(金) 19:07
>>213
だーかーらー、理屈をこねるのはそれだけの見返りがあるからだってば。
216デフォルトの名無しさん:2001/05/18(金) 20:21
見返りが無いとは誰も言ってない気が…
217デフォルトの名無しさん:2001/05/18(金) 21:33
>216
文章である以上ちゃんと書かないと伝わらないよ。
で、アンチ的な発言なんですか?
218デフォルトの名無しさん:2001/05/18(金) 23:21
ちゃんと伝わらないってどういうこと?
アンチ的なのかどうか分類できない発言を、勝手に
間違えてアンチに分類されるってことか?(藁
219デフォルトの名無しさん:2001/05/19(土) 00:14
>>213はあれだけだとこのスレでさんざん出没した
アンチ側の意見に見えるけど>>218
220名無しさん:2001/05/19(土) 00:17
age
221名無しさん:2001/05/19(土) 00:17
age
222名無しさん:2001/05/19(土) 00:17
age
223名無しさん:2001/05/19(土) 00:18
age
224名無しさん:2001/05/19(土) 00:18
age
225デフォルトの名無しさん:2001/05/19(土) 00:41
荒らされてる?
226デフォルトの名無しさん:2001/05/19(土) 00:41
ありゃりゃ、なんなの?中身のあるカキコしてん>>220-224
227デフォルトの名無しさん:2001/05/19(土) 00:45
荒らしです>226
00:15〜00:19頃に上位20のスレが狙われた模様
228デフォルトの名無しさん:2001/05/19(土) 01:07
>>219
そのさんざんあらわれたアンチは、本当にアンチだったんでしょうかね?(藁
229デフォルトの名無しさん:2001/05/19(土) 02:40
さんざん現れたアンチってどこら辺のこといってるの?
230デフォルトの名無しさん:2001/05/19(土) 02:51
>>185さんはアンチ発言らしきものをしたがアンチじゃないらしいし。
231デフォルトの名無しさん:2001/05/19(土) 04:40
めんどっちいから、もうアンチ発言らしきものをした人はアンチでいいじゃん。(w
232デフォルトの名無しさん:2001/05/20(日) 17:26
比べてもしょうがないかもしれないけど、
副作用がないってことは関数型のほうがOOよりさらに再利用性が高いのかな?

OOPのライブラリとかって、結局大きい塊としてしか扱えないような気がするし。
233デフォルトの名無しさん:2001/05/20(日) 18:58
細かい使い回しはいろいろ聞くと思うよ。
高階関数もあるし。
234デフォルトの名無しさん:2001/05/20(日) 19:05
ていうか、副作用が無いことにしたって、プログラムの
考え方が解析しやすくなっただけだろ。
それはプログラムの見方の問題であって、言語の文法
は何ら変わってないだろ?
235デフォルトの名無しさん:2001/05/20(日) 19:11
再利用もそうだけど、加工が容易な気がする。
見通しが良いからかな?

>>234
基本的に制御構文の考え方ははほとんど変わりないです。
236デフォルトの名無しさん:2001/05/20(日) 22:30
>>234 なんで文法の話しになったんだかわかんないけど、
Haskellじゃ ifは組み込み構文じゃなくて、
単なる関数になってるよ。
237デフォルトの名無しさん:2001/05/20(日) 22:38
pow2 = 1 : map (2 *) pow2
series a = [(a - 1%n, a + 1%n) | n <- pow2]
じゃだめ? >>214
先頭 nコが欲しいときは take n (series a)
238デフォルトの名無しさん:2001/05/20(日) 22:40
>>231 アンチかどうかは call-by-needで評価しようよ
239デフォルトの名無しさん:2001/05/20(日) 23:26
>>236
関数だったらifの要である、分岐ロジックってどうやってるの?
240デフォルトの名無しさん:2001/05/20(日) 23:51
そもそもifって副作用とか状態とか関係ないでしょ。
241デフォルトの名無しさん:2001/05/21(月) 00:03
>>240
いや、だから
if a then b else c

bやcには関数でどうやって分岐してるのか聞きたいんだけど。
242デフォルトの名無しさん:2001/05/21(月) 00:14
ifが関数ならば、if自身の関数定義はどうなってんの?って事か。
243デフォルトの名無しさん:2001/05/21(月) 00:29
ちなみにschemeやMLでのifは関数ではなくて、syntax
244デフォルトの名無しさん:2001/05/21(月) 00:37
>>239
パターンとかかなぁ。知らないけど。
245デフォルトの名無しさん:2001/05/21(月) 00:57
>>241
Cでいうところの関数ポインタ渡すんだよ。
246デフォルトの名無しさん:2001/05/21(月) 01:05
>>245
んだんだ。Cで、

IF(int, (void*)(), (void*()));

って関数が書けるもんな。あれの延長だ。
あとは無名つーかInlineな関数(?)を書く機能が
Cにもし有れば、ノリも完全同じなことができたんだが…
247デフォルトの名無しさん:2001/05/21(月) 01:16
>>246
> IF(int, (void*)(), (void*()));

これって、内部でif文使うだろ?
248デフォルトの名無しさん:2001/05/21(月) 01:35
なんでここでCの話が出てくるんだよ>>245-246
関数のポインタの話なんてしてねえだろ。
249デフォルトの名無しさん:2001/05/21(月) 01:40
>>248
話の流れ読めてるか?
250デフォルトの名無しさん:2001/05/21(月) 01:46
haskellの「if関数」の定義の話じゃないの?>249
251デフォルトの名無しさん:2001/05/21(月) 01:50
>>247 Cプログラマに説明するなら
「 A ? B : C の三項演算子を関数化したようなもの」
といえばすんなり納得してくれると思う。
252デフォルトの名無しさん:2001/05/21(月) 01:52
>>249
理解してないのはキミ。
↓これ。

>236 名前:デフォルトの名無しさん 投稿日:2001/05/20(日) 22:30
>>>234 なんで文法の話しになったんだかわかんないけど、
>Haskellじゃ ifは組み込み構文じゃなくて、
>単なる関数になってるよ。

「単なる関数」なら、どうやって定義してんだって話。
253デフォルトの名無しさん:2001/05/21(月) 01:57
>251
だから今、Cの話なんてしてないだろ。

haskellのifは>>236が言うには「単なる関数」らしいので、
それをhaskell自身でどうやって定義してるのか示せって言ってるの。

問題
if = [?]
[?]を埋めよ。
254デフォルトの名無しさん:2001/05/21(月) 02:00
だからHaskellの話にCを持ち出して比較することで
話をわかりやすくしようという意図だろ?
そういう目的なら別にCの話を持ち出したっていいだろ。
255デフォルトの名無しさん:2001/05/21(月) 02:03
全然理解してないな。寝てしまえ>254
256デフォルトの名無しさん:2001/05/21(月) 02:04
[?]は外部呼出しなんじゃ?
でもhaskellはパターンマッチがあるんだからifなんて必要なのか?
#Haskellはちょっとかじっただけなのでまったく自信無し
257デフォルトの名無しさん:2001/05/21(月) 02:04
>>254
なんでここで、「Cを持ち出して比較する」必要があるわけ?
258デフォルトの名無しさん:2001/05/21(月) 02:14
矛盾してる。
haskellのifは関数だという。
でもその関数の定義は示せないらしい。
(示そうとする人が現れない)

>>256
>[?]は外部呼出しなんじゃ?
外部呼出しを「単なる関数」とはいいませんよ。

>ifなんて必要なのか?
そんなこと議論してません。
259デフォルトの名無しさん:2001/05/21(月) 02:17
>>257
例えば、「関数である」ということを聞いて、「ほう、Cのあれと同じだな」と
思った人がいて、「CのIF()と同じようなもんさ」と発言する場合など。
その人は間違ってるかもしれないけどね。
260デフォルトの名無しさん:2001/05/21(月) 02:18
つーか>>236 解答おねがいします。
261デフォルトの名無しさん:2001/05/21(月) 02:21
だからC言語の例はあくまでも「喩え話」だから関係無いだろ。>259
haskellでどう定義するかって話。
262デフォルトの名無しさん:2001/05/21(月) 02:22
>>261
例え話を発言しちゃいかんのか?
263問題:2001/05/21(月) 02:24
haskellでの関数定義

if = [?]

[?]を埋めよ。
264デフォルトの名無しさん:2001/05/21(月) 02:25
いくら喩え話をした所で問題は解決しないって事>262
265デフォルトの名無しさん:2001/05/21(月) 02:26
>外部呼出しを「単なる関数」とはいいませんよ。
なじぇ?WindowsAPIは単なる関数呼び出しでしょ?

>ifなんて必要なのか?
>そんなこと議論してません。
まあそうだけど、パターンマッチてのはswitch見たいなもんだから、
・・・ってヨーク考えればパターンマッチ使えばifも実装できるね。
#しつこいようだが自信無し
266デフォルトの名無しさん:2001/05/21(月) 02:29
>>265
>パターンマッチ使えばifも実装できるね。
だったらそれを示してくれ。
267デフォルトの名無しさん:2001/05/21(月) 02:32
>>265
>なじぇ?WindowsAPIは単なる関数呼び出しでしょ?
なんでWindowsAPIの話になる。
WindowsAPIでif関数が定義できるのか?
268デフォルトの名無しさん:2001/05/21(月) 02:34
問題

if = [?]

haskellの言語機能のみを使って、関数ifの定義[?]を埋めよ。
269デフォルトの名無しさん:2001/05/21(月) 02:39
>>234-268
270デフォルトの名無しさん:2001/05/21(月) 02:39
>>264
でも話にはなってるだろ?
本人はC言語の例えで解決になってると思って発言してるのかもしれないし。
もう一回ログを読んで、話の流れを読めよ。
271デフォルトの名無しさん:2001/05/21(月) 02:40
手続き型言語しかしらない人に
関数型言語を布教するのによい説明方法を話し合うのも
それなりに生産的な議論だとおもうんだけどな、、、、
果てしなく脱線する可能性が高いけど。
272デフォルトの名無しさん:2001/05/21(月) 02:44
>>268の問題を解いてくれる人を待ってます。
if自身の定義にifを使うのはナシね
273デフォルトの名無しさん:2001/05/21(月) 02:48
if b funcA funcB | b == true    = funcA
         | b == false    = funcB
見たいな感じかなぁ。
#自信無し
274デフォルトの名無しさん:2001/05/21(月) 02:50
lisp schemeスレで、ループを3つのlambdaで表現した人が
いたけど、これもそんな解答になって欲しいなあ。
275デフォルトの名無しさん:2001/05/21(月) 02:53
>haskellの言語機能のみを使って
この思い込みはどこからくるの?
ifが外部関数もしくはビルトイン関数であっても、制御構造ではなくて
関数であることには変わりはないと思うのだが。
276デフォルトの名無しさん:2001/05/21(月) 03:02
>>273
ありがとう。パターンってそういうことなのね。
でも結局if相当の事は行なうわけか・・
277デフォルトの名無しさん:2001/05/21(月) 03:06
それ、制御構造じゃん>275
278デフォルトの名無しさん:2001/05/21(月) 03:12
>>275
>外部関数もしくはビルトイン関数
0点。
279デフォルトの名無しさん:2001/05/21(月) 09:51
if p then else = case p of
True -> then
False -> else
280デフォルトの名無しさん:2001/05/21(月) 15:36
>>278
なんで?
281デフォルトの名無しさん:2001/05/21(月) 17:09
<<Haskell
でも実際はthen elseは構文として間に入るから出来ないよ。
あくまでも概念
282281:2001/05/21(月) 17:14
Haskellのif "cond" then A else Bは
case "cond" of | True = A
| False = B
のシンタックスシュガーでしょ?
283244:2001/05/21(月) 19:58
SMLだと(ifって識別子は使えないけど)
fun if(true,a,b) = a
| if(false,a,b) = b;
で出来るなぁ。
284デフォルトの名無しさん:2001/05/21(月) 20:00
なんか見たことない言語がいっぱい(笑
285244:2001/05/21(月) 20:03
>>276
僕の言ったパターンてのは>>283ね。
>>273はパターンっぽいけど違うかと。
286デフォルトの名無しさん:2001/05/21(月) 20:13
>>279
iF :: Bool -> a -> a -> a
iF = \p -> \tHen -> \eLse -> case p of {True -> tHen; False -> eLse}
287244:2001/05/21(月) 20:37
>>283
でも遅いし、副作用が無いのが前提か……
288214:2001/05/22(火) 02:15
237番のかた、どうもありがとうございました!!
本当にたすかりました。

ていうか、先生が小声で早口でわかりにくいうえに
参考書も英語なんでかなりてこずってます・・・あう。
289デフォルトの名無しさん:2001/05/22(火) 02:21
>288
化石レスには引用付けて欲しいなあ・・
>>214 >>237 みたいに。
290デフォルトの名無しさん:2001/05/22(火) 02:22
それにしても学校の授業でhaskell使うなんて恵まれてるね。
291デフォルトの名無しさん:2001/05/22(火) 02:25
>>290
どーい。
292デフォルトの名無しさん:2001/05/22(火) 02:54
どこの大学?
相当偏差値高くない?
293デフォルトの名無しさん:2001/05/22(火) 07:22
Haskellでforやwhileループのようなことをやるには
どうしたら良いの?
294デフォルトの名無しさん:2001/05/22(火) 11:12
>>293
ループでやるようなことをするのなら
takeWhile や dropWhile なんかを使うかなあ。
ループをリスト上の再帰にしてしまう。そういうことじゃない?
295デフォルトの名無しさん:2001/05/22(火) 16:05
Haskellのやさしい入門っていうの、どこかのHPの私訳を一通り読んだけど

はっきりいってむずかしすぎて分からん。
相当頭のいい人が使うものと感じた。
そもそも型の再帰的定義からしてかなり難解。
ひとまずMLの資料を探してみることにします。
ていうか、言語よりはもっと本質的な理論が重要なように感じる。
296デフォルトの名無しさん:2001/05/22(火) 16:25
あれはMLを多少知ってた俺でも難しいと思ったからな。
297デフォルトの名無しさん:2001/05/22(火) 16:40
単に慣れや覚えた順番の問題じゃないかなあ。
Haskell より ML 方が難しいと思う人もいたりする。
298デフォルトの名無しさん:2001/05/22(火) 17:08
先にSchemeやったら、HaskellもMLもみんな
構文が複雑すぎるように感じられる。
299デフォルトの名無しさん:2001/05/22(火) 17:40
御意
でも、Scheme に比べれば大抵の言語は複雑な構文だよね。
300デフォルトの名無しさん:2001/05/22(火) 18:01
Lispの文法もかなり凄いことになってるよね…
301デフォルトの名無しさん:2001/05/22(火) 18:11
SMLはストラクチャ辺りが複雑だと思う。
302デフォルトの名無しさん:2001/05/22(火) 18:33
HaskellやMLの場合言語の構文が複雑というよりも、主に
研究者が使ってる言語だからドキュメントがやたら難しい
言葉で書かれている。
複数の文を書く方法やfor、while相当の機能の説明が
ずいぶん後の方でちょろっとだけ出てきたりする。
その辺が必要以上に複雑だと思わせているんだと思う。

複雑なところと言ってもルールの組み合わせ方が複雑なん
じゃなくて、機能が豊富だから複雑になってる所がいい。
303デフォルトの名無しさん:2001/05/23(水) 00:45
for, while相当のものなんて教えてもらう必要あるのか?
再帰を使うって事だけ知ってりゃ簡単だと思うが。
304デフォルトの名無しさん:2001/05/23(水) 01:18
知ってりゃ簡単なんです。てりゃそりゃ。
悩んだ後で、「あっそうか」に辿りつけるかどうか。
ちょこっと、アドバイス、記述があればなんてことないのだが、
それがないと敷居が高いと感じるひともいるかな。
305デフォルトの名無しさん:2001/05/23(水) 11:12
再帰を使うってことはなにか?
いちいちfor、while相当のことをさせるのに関数を作らなきゃ
ならんってことか?
なんて不便な言語だ。
306デフォルトの名無しさん:2001/05/23(水) 11:20
>>305
おいおい。
関数型言語なんだし、関数作らなきゃ何もはじまりませんよ。
そもそも関数つくるのなんてそんな大変じゃないだろ?
むしろfor,whileよりすっきり、早く書けることのほうが多いんじゃないかな。
307デフォルトの名無しさん:2001/05/23(水) 11:41
>>306
いちいちfor使うたびに新しい関数の名前考えなきゃならんのか?
そんな面倒なことやら無くちゃいけないぐらいなら、forが
はじめから定義してあった方が良いに決まってる。
俺だったら結局自分でfor関数定義して使うよ。
つーか、再帰すらわからないやつがいるというのに、
再帰の説明だけでforの代用に気付けといわんばかりの説明は
敷居が高いのは明らかだろ。
308デフォルトの名無しさん:2001/05/23(水) 14:01
>>307
一々関数を定義するじゃなくて、
map とか foldr とかのリスト上の標準関数使うだけだと思うけど。
309デフォルトの名無しさん:2001/05/23(水) 14:09
>>308
mapやfoldrは引数に関数を取る。
310デフォルトの名無しさん:2001/05/23(水) 14:10
Schemeでちょろっと末尾再帰するときはたいていloopという関数名にしている
おれってドキュン?
311デフォルトの名無しさん:2001/05/23(水) 14:15
forループを関数にしたら、スコープが変わってしまうだろ。
312デフォルトの名無しさん:2001/05/23(水) 14:21
>>311
スコープが変わるとだめですか?
なにのスコープがどう変わると、どうだめなんでしょう。
簡単な例題はないですか。
313デフォルトの名無しさん:2001/05/23(水) 14:35
>>312
外側の変数が簡単につかえない。
314デフォルトの名無しさん:2001/05/23(水) 14:48
>>313
純関数型なら assignment がないので問題ないような気がします。
315デフォルトの名無しさん:2001/05/23(水) 15:08
>>314
ハァ?なんで問題ないの?
316デフォルトの名無しさん:2001/05/23(水) 15:23
外側の変数の値を内側で変更するのが問題だということかと思っていました。
私は 313 の意味を勘違いしてるみたい。
どういう意味なんでしょう。
317315:2001/05/23(水) 15:40
いや、関数型言語って外側の変数を参照したり変更したりすることって
出来るの?
318315:2001/05/23(水) 15:42
それだと、全部の変数がグローバルなのと同じような感じで
ものすごく使いにくいと思うけど。
319デフォルトの名無しさん:2001/05/23(水) 15:58
>>317
Haskell なら
変数の参照については外側のスコープのものは参照可能
変数の値についてはいかなる場合も変更は不可能
です。
320デフォルトの名無しさん:2001/05/23(水) 18:33
315は、[ごめんこの例はSchemeだけど]
(define (for min max proc) …minからmaxまでカウンタ値を変えて手続きprocを適用する…)
のような関数を使ったときにproc内のスコープがどうなるか
わかってないんだろう。「関数型言語」でひとくくりにしている
ところも痛い。
321デフォルトの名無しさん:2001/05/23(水) 19:09
誰かstatic scopeとdynamic scopeの違いをスカっと説明してやれよ
322デフォルトの名無しさん:2001/05/23(水) 20:02
>>302
そうそう、そういう所が本質的な議論をしているっていう感じがする。
HelloWorldから始まったりは決してしない、みたいな。
323某スレの226:2001/05/23(水) 20:22
>>305 >>310-312
(もしschemeを使用してるならば、ですが。)
lisp schemeスレにforとwhileのサンプルがありますので参考にどうぞ。
324デフォルトの名無しさん:2001/05/23(水) 21:59
>>322
関数型言語の枠組で
Hello World を説明するのはあまりに難しいからじゃないかな。
325某スレの226:2001/05/23(水) 22:37
do〜whileも置いておきました。
あの様に、(マクロとしてですが)継続の部分を除けば、
C言語のfor/while/do〜whileも関数型言語の枠組みだけで実現できます。
用意されていないだけで、相当する処理は書ける事がお分かりになったでしょうか。
(break/continue/returnは継続の様な特殊な物が無いと難しいですけど。)
326デフォルトの名無しさん:2001/05/24(木) 01:04
副作用を起こさなければ、正体不明のバグってかなり減るような気がする。
そこが関数型言語の良い所?
327デフォルトの名無しさん:2001/05/24(木) 01:17
関数型言語ではこういうのはどうするんですか?

(defvar x 10)

(defun f (y)
(setq x (- x y)))

(f 3) => 7
(f 4) => 3
328デフォルトの名無しさん:2001/05/24(木) 01:57
setq使ってる時点でアウト。>327
考え方が関数型になってない。
>(f 3) => 7
>(f 4) => 3
;以後、これはキモイと考えること。
329デフォルトの名無しさん:2001/05/24(木) 02:09
Rubyのまつもとは、文字列において、副作用を起こす参照が良くて
複製を作る代入(宣言なら副作用は起こらない)はダサいとか
言ってたよ。(藁
330デフォルトの名無しさん:2001/05/24(木) 02:14
>>320
> (define (for min max proc) …minからmaxまでカウンタ値を変えて手続きprocを適用する…)
> のような関数を使ったときにproc内のスコープがどうなるか
> わかってないのだろう

C言語とは違うのか?
331デフォルトの名無しさん:2001/05/24(木) 02:16
>>324
モナドってやつですね。
332デフォルトの名無しさん:2001/05/24(木) 05:12
MLならforやwhileもあるし、代入もできるYO!
333デフォルトの名無しさん:2001/05/24(木) 05:20
代入があるのは逃げ道。本来意図した使い方じゃないんだよ。>332
関数型言語として使いたければ今すぐ代入の使用をやめなさい。
334デフォルトの名無しさん:2001/05/24(木) 06:53
なんか、どっかの宗教が輸血拒否したりするのと
同じぐらい愚かだな。
335デフォルトの名無しさん:2001/05/24(木) 22:08
信仰とはそういうものだ
336デフォルトの名無しさん:2001/05/24(木) 23:20
じゃあ、Haskellでは代入をどうやって避けるんだ?
代入が必要になるたびに新しい名前の変数を作るのか?
337デフォルトの名無しさん:2001/05/24(木) 23:24
自分で書いてみたら?>336
338デフォルトの名無しさん:2001/05/24(木) 23:35
>>337
わからなかったら書けないだろ。
339デフォルトの名無しさん:2001/05/24(木) 23:37
>>338
マニュアル読め
340デフォルトの名無しさん:2001/05/25(金) 00:50
>>336

Haskell では計算をあまり操作的には考えないです。
プログラムは計算の手順の記述というよりは、値の関係記述の
ように書くという感じです。数学の等式を書くのに似てるかもしれません。

Haskell の変数は値についた名前という意味しかなく。値をいれるいれもので、
値の一時保管庫ではなく、値の出し入れという操作を記述するスタイルの
プログラムとは全然雰囲気の違うプログラムになります。

実行効率の上で代入(assignment)が欲しくなることはあるかも知れませんが、
なにかの値を計算するプログラムを書く上で代入が必要になることは
ないです。
341デフォルトの名無しさん:2001/05/25(金) 00:58
使ってみないと実際の所わからないだろう。
342デフォルトの名無しさん:2001/05/25(金) 02:07
>>340
つうか、何も情報になってねーよ。
結局の所「代入は使わないのです。」と言ってるだけだろ。
現象を説明してるだけで、全然理由になってない。
343デフォルトの名無しさん:2001/05/25(金) 03:36
だから..問題&解法を記述するのに代入は必需品じゃ
ないのです...
なんでそんなに代入操作にこだわるかの理由を述べたほうがいいのでは
344デフォルトの名無しさん:2001/05/25(金) 08:51
代入が良く使われてるのは常識でわ。
345デフォルトの名無しさん:2001/05/25(金) 09:08
前の方で出てきたやつで言うと、

qsort [] = []
qsort (x:xs) = qsort [a|a<-xs,a<=x] ++ [x] ++ qsort [a|a<-xs,a>x]

このaやxって明らかに代入と一緒じゃん。
代入避けろとか言ってるけど、書き方変えてるだけじゃん。
346デフォルトの名無しさん:2001/05/25(金) 09:32
>>345
みかけはともかくこれはλ束縛であって,いわゆる破壊的代入とはちがうよ

qsort(x:xs) = qsort (filter (\a -> a<=x) xs) ++[x]++ qsort (filter (\a -> a>x) xs)
347デフォルトの名無しさん:2001/05/25(金) 10:24
>>342
Haskell では代入(assignment)は使わないではなくて、使えないです。
なので、代入を避ける必要はないです。
で、代入を使わなくて何故プログラムがかけるかは私には謎です。
でも、かなりの範囲(主観的ですけど)のプログラムは Haskell で書けます。
で、何故、何のために代入なしの関数型言語を作った人々がいたかですが
プログラムを実行せずにプログラムが正しいことが分かるような記述法が
欲しかったとかかなあ。
348デフォルトの名無しさん:2001/05/25(金) 11:19
>プログラムを実行せずにプログラムが正しいことが分かるような記述法

蛇足ですが。
OOPは全然違う方向からその問題に取り組んでる、と
妄想したがってる厨房なワタクシ。

実行文脈をObjectの存在とは切り離しちゃったので、
「走れ」というメソッドを呼ばない限り
(つまりそれ以外のメソッドだけを呼ぶ限り)
非破壊に検証できる、
というObject系を作る「ことができる」はず。

まぁ言語によって強制されていなくて
セマンティックなレベルだけの話なんで、
よわよわだけど。

「実行時」ってものは、そんなに忌避されるもんなのかなあ?
どっちかというと、実行時の使いやすさを向上させる仕組みを
考えるほうが良いようなきもするんですが…
349デフォルトの名無しさん:2001/05/25(金) 12:51
350デフォルトの名無しさん:2001/05/25(金) 15:08
>>346
破壊的代入というなら、Haskellの
a // [(i, v)] のような配列の更新はなんなんだ?
破壊的代入じゃないのか?
351デフォルトの名無しさん:2001/05/25(金) 16:25
>>350
破壊的代入ではないです。

a ! 1 の評価結果を 1 であるとして
(a // [(1,2)]) ! 1 の評価結果は 2 ですが、
a ! 1 を評価すると結果は相変わらず 1 です。

let
  a = listArray (1,1) [1]
  b = a // [(1,2)]
in
  (a ! 1) + (b ! 1)

を評価すると結果は 3 です。
352デフォルトの名無しさん:2001/05/25(金) 21:10
ふぇふぇふぇ
353デフォルトの名無しさん:2001/05/25(金) 23:14
>>348
スレ違い。ウザいぞ。
354350:2001/05/26(土) 00:13
>>351
なるほど、要するに、更新された配列が右辺に現れるが、
その変化は長期的には反映されないという感じかな。

しかし、それでは、配列を変更したくなるたびに、新たな
配列を作らなくてはならない。

配列をデータとして蓄え、ユーザーの応答に応じてデータを
更新していくようなプログラムを作る場合、同一の配列に
データを保持しておくことができないから、問題があるのでは
ないか?
少なくとも俺にはこうしたプログラムをどうやって作るのかわ
からない。
例えその問題が解決したとしても、更新するたびに配列全体の
コピーが必要になるのではないか?

>>353
別にスレ違いじゃないと思うぞ。
355346:2001/05/26(土) 00:30
>>354
その通り.ナイーブにやったのではとてもじゃないが実用にならない.
そこでHaskellなどでは,あくまで意味的には参照透明性を保った上で,
「変更前の配列」に見かけ上新たにアクセスできなくなるモナド(monad)
というメカニズムがある.意味的には純粋な関数型言語のまま,コンパ
イル結果は破壊的代入になっているような,そんな処理系が作れる.
実際,HaskellのコンパイラにはHaskell自体で書かれているものがある
が,テーブルや状態の管理にはモナドを用いて効率をよくしている.

モナドは配列や状態の表現の他に,例外処理や環境にも用いることが
できる.
356346:2001/05/26(土) 00:41
ちなみにモナド自体は組み込みの機構ではなく,単に型構成子 M
と2つの関数 unit, bind の組として表現される.unit, bind の
型は以下の通り(a, bは型変数).

unit :: a -> M a
bind :: M a -> (a -> M b) -> Mb

また,unit, bind は以下を満たす.

bind m unit = m
bind (unit x) f = f x
bind (bind m f) g = bind m (\x -> bind (f x) g)

(うろおぼえなので間違ってたらビシバシ指摘しておくれ)
これと等価な定義もいくつかあって,用途によって使い分けること
ができる.

あとは P. Wadler の解説論文でも読んでおいてくれー.
357350:2001/05/26(土) 01:02
>>355-356

「破壊的な代入は持たないです。しかしモナドがあるのです。」

こういうのって、従来の言語と何ら変わっちゃいないように
思えるんだよな。

言語のパラダイムにあわせて、「機能の意味」が変わってる
だけ。機能の実態は変わってない。
関数型言語のパラダイムに合わせてプログラムの仕組みを
語る上では便利なのだろうが、それ以上の意味は無いように
思える。
358デフォルトの名無しさん:2001/05/26(土) 01:47
定性的じゃなくて定量的に見ればいいのかな。
Cに goto文もあるから構造化プログラミングになってない、って
わけでもなくて。
Haskellにモナドがあっても、それなしでもかなりの部分を
くめるわけだし。
35962:2001/05/26(土) 02:32
>>357
同じことの繰り返しだけど、
単に語るだけじゃなくて厳密に解析するのに役立つの。
プログラムを厳密に解析するのに
理論的にクリアでないと困るのはわかるでしょう?
クリアでかつ従来の言語でできることを失わない
というのがまずは重要であって、モナドはその一つの解答。
もちろん従来の言語を超えることができればさらによし。
(個人的にはHaskellのモナドはわかりづらいとは思うけど)。

>>356
Moggiの元々の論文はカテゴリーの定義さえ知っていれば
結構わかりやすいと思う。例も多いし。
Wadlerの論文は理論を避けているせいでかえってわかりにくいと感じた。
Haskellのマニュアルとかではおどかし過ぎだと思うぞ。
360350:2001/05/26(土) 03:46
>>359
思うんだが、やってることは従来と変わらないのならば、
モナドと言わずに破壊的代入だと言ってしまえばいい
じゃないか?

で、理論的に考える時だけ、破壊的代入と考えずに、関数型な
概念で考えればいい。

そういうやり方ならC言語だって関数型な考え方で捕らえる
ことができるわけだろ?

わざわざ理解困難にする必要はないと思うのだが。
361デフォルトの名無しさん:2001/05/26(土) 09:45
>>360
計算機上で実行可能なものなのだから、そういう意味では従来のプログラム
とやっていることは変わらないと思います。
Haskell を使うのなら関数プログラミングの考えかたでプログラミング
するほうがいいと思いますが。。。
362350:2001/05/26(土) 14:14
>>361
例えば、C言語でHaskellの考え方をすればいいんじゃないの?
破壊的代入が出てきたらHaskellのような別の概念だと考えて分析する。
モナドって良く知らないけど。
363デフォルトの名無しさん:2001/05/26(土) 15:09
つっこみですけど、
Haskellの弱点ってありますか?
ちなみに、弱点とは関係ないですけど、
fib n = fib (n-1) + fib (n-2)
って定義してフィボナッチ数列を計算すると、fib 100くらいで
すでに遅すぎなんですね。アルゴリズムの問題ですけど。
でも、漸化式の最適化くらい処理系的には簡単に出来そうですけどねえ。
やってまずい理由無いと思うし。
364デフォルトの名無しさん:2001/05/26(土) 15:14
>>363
どの処理系ですか?
365363:2001/05/26(土) 16:08
>>364
最新のHugs (Windows)です。

あと、便乗質問ですが、対話形式で使っているとき、
プロンプトで関数定義をするにはどうすればいいのでしょうか?

Prelude> f x = x * 2

とか入力しても「unexpected =」とかでて、うまくいきません。
366デフォルトの名無しさん:2001/05/26(土) 17:43
>>364 それはできないです。
Haskellでは実行環境も動的に変更することはできないので、
関数をHugsが立ち上がってからは追加できないのでは。
367デフォルトの名無しさん:2001/05/26(土) 17:50
>>366
ではどうするのですか?
368デフォルトの名無しさん:2001/05/26(土) 18:32
今調べたら
ファイルをエディタで編集して、ドロップするのが定石のようです。
369デフォルトの名無しさん:2001/05/26(土) 18:35
質問ですが、関数型言語だと関数の微分が出来たりしませんか?
ソースを読んで解析とかじゃなくて、もっとセマンティカリー(?)
に解析することは出来ませんか?
370デフォルトの名無しさん:2001/05/26(土) 18:44
>>363
一般論として、アルゴリズムの最適化が処理系にできるわけない。

しかし、その定義でfib 100が「すでに遅すぎ」!?
まともにやったら天文学的な時間がかかりそうですが。
ちょっとCでやってみました。

#include <stdio.h>
#include <stdlib.h>
int fib(int n)
{
return n > 1 ? fib(n - 2) + fib(n - 1) : n;
}
main(int argc, char **argv)
{
if (argc > 1)
printf("%d\n", fib(atoi(argv[1])));
}

上のプログラムを、PIII(800MHZ)+Linux+gccで実行したところ
fib 39で5秒、fib 40で8秒、fib 41で14秒かかます。
Tree Recursionは、指数的に計算時間が増えるので、少なめに
計算してもfib 100の計算には40万年以上必要なはずです。

もしfib 100が計算できたのなら、Haskellは何か最適化をしている
と言わざるをえない。ちなみにfib 100は、
354224848179261915075
です。
371Haskellわからないのですが:2001/05/26(土) 19:02
>>363
> fib n = fib (n-1) + fib (n-2)

この関数って終わるの?
372デフォルトの名無しさん:2001/05/26(土) 20:23
(define (fib n)
(let iter ((a 1) (b 0) (c n))
(if (= c 0) b (iter (+ a b) a (- c 1)))
))
373>>371:2001/05/26(土) 21:09
当然
fib 0 = 0
fib 1 = 1
が必要です。

ちなみに、Haskellを使って線形計算量でFibonacciを計算する方法
(tutorialからのコピペ)
fib 0 = 0
fib 1 = 1
fib (n+2) = flist!!(n+1) + flist!!n
where
flist = map fib [ 0.. ]
374デフォルトの名無しさん:2001/05/27(日) 00:57
>> 373
ちなみに対数ステップで計算する方法

fib n = fib' 1 0 0 1 n

fib' _ b _ _ 0 = b
fib' a b p q c
 = if even c
    then fib' a b (p * p + q * q) (2 * p * q + q * q) (div c 2)
    else fib' (b * q + a * q + a * p) (b * p + a * q) p q (c - 1)
375デフォルトの名無しさん:2001/05/27(日) 01:17
>>374
良かったら C で書いてくれない?
(厳密なプログラムじゃなくていいから)
376デフォルトの名無しさん:2001/05/27(日) 01:38
対数ステップfib
(define (fib n) (fib-iter 1 0 0 1 n))
(define (even? n) (= (% n 2) 0))
(define (fib-iter a b p q count)
(cond ((= count 0) b)
((even? count)
(fib-iter a b
(+ (* q q) (* p p))
(+ (* 2 (* p q)) (* q q))
(/ count 2)))
(else (fib-iter (+ (* b q) (* a q) (* a p))
(+ (* b p) (* a q))
p q (- count 1)))))
377デフォルトの名無しさん:2001/05/27(日) 01:45
厳密じゃないけど

integer fib(integer n) {return _fib (1,0,0,1,n);}

integer _fib(integer a, integer b, integer p, integer q, integer c)
{
if (isEven(c))
return _fib(a,b,(p*p + q*q),(2*p*q + q*q),(c/2));
else
return _fib((b*q + a*q + a*p),(b*p + a*q),p,q,(c-1));
}
378375:2001/05/27(日) 01:50
>>377
サンクス!
379デフォルトの名無しさん:2001/05/27(日) 01:56
_fib の定義のなかの先頭に終了条件をいれわすれてる。
if (c == 0) return b;
380デフォルトの名無しさん:2001/05/27(日) 02:32
関係ないけど、fibで求めた結果って何に使うの?
381375:2001/05/27(日) 02:37
>>378
だよね(^^;
long long の出力の仕方を調べてて気付かなかった。
382デフォルトの名無しさん:2001/05/27(日) 07:13
383デフォルトの名無しさん:2001/05/27(日) 11:34
>>375
#include <stdio.h>
#include <stdlib.h>

int fib2(int a, int b, int p, int q, int c) {
  if (c == 0) {
    //fib' _ b _ _ 0 = b
    return b;
  } else {
    //fib' a b p q c
    // = if even c
    if ((c & 1) == 0) {
      //then fib' a b (p * p + q * q) (2 * p * q + q * q) (div c 2)
      return fib2(a, b, p * p + q * q, 2 * p * q + q * q, c / 2);
    } else {
      //else fib' (b * q + a * q + a * p) (b * p + a * q) p q (c - 1)
      return fib2(b * q + a * q + a * p, b * p + a * q, p, q, c - 1);
    }
  }
}

int fib(int n) {
  // fib n = fib' 1 0 0 1 n
  return fib2(1, 0, 0, 1, n);
}

int main(int argc, char *argv[]) {
  int n = strtoul(argv[1], NULL, 0);
  for (int i = 0; i <= n; i++) {
    int f = fib(i);
    printf("fib(%d) = %d\n", i, f);
  }
  return 0;
}
384デフォルトの名無しさん:2001/05/27(日) 16:18
>>383
関係ないけど、半角スペースが無視されていない
(インデントが崩れていない) のは何故?
385test:2001/05/27(日) 16:24
&sp;hoge
386test:2001/05/27(日) 16:24
 間違った……
387385-386:2001/05/27(日) 16:25
>>384
半角で&nbsp;。
スレ汚してすんまそん。
388384:2001/05/27(日) 17:30
>>385-387
 ス ゲ; ー 。
     サンクス!
389デフォルトの名無しさん:2001/05/28(月) 16:37
age
390デフォルトの名無しさん:2001/05/28(月) 22:51
   a g e
391デフォルトの名無しさん:2001/05/28(月) 22:56
sage
392デフォルトの名無しさん:2001/05/28(月) 23:40
age
393デフォルトの名無しさん:2001/05/29(火) 00:09
a:g:e:[]
394デフォルトの名無しさん:2001/05/30(水) 19:18
LISPでも勉強しようと思って購買にいったらLISPの本なんて売ってなかったヨ。
悲しいヨ。紀伊国屋にもいったけれど、数冊しかないし・・。
というわけで、「プログラミング言語 SCHEME」をかってみました。
395デフォルトの名無しさん:2001/05/30(水) 22:53
>>394
lisp系学習すんならschemeが(・∀・)イイ!ヨ
SICPも参照してね。
396デフォルトの名無しさん:2001/05/30(水) 23:13
ネタ切れ?
397394:2001/05/30(水) 23:29
>>395
>>186で紹介されているやつですね。
とりあえずブックマークへ入れときました。
・・って、これは「計算機プログラムの構造と解釈」ですね。
買おうと思ってたよ。

文法はわかったけれど、いざプログラム書こうと思うと
大変に思える。ま、1日目だからこんなもんか。
398デフォルトの名無しさん:2001/05/30(水) 23:40
>>397
覚えることはCやPascalよりも少ない筈。
前置記法と括弧に慣れるかがカギだな・・
処理系に寄るけど、中置記法使う方法が用意されてるかも。
括弧は慣れるしかない。(慣れても読みにくいとは思うけど。)
399デフォルトの名無しさん:2001/05/31(木) 00:53
SchemeよりLispでしょ。多機能萌え〜
400デフォルトの名無しさん:2001/05/31(木) 01:01
キリ番get
401森田:2001/05/31(木) 01:08
      ,一-、
     / ̄ l |   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    ■■-っ < >>399 んなーこたーない
    ´∀`/    \__________
   __/|Y/\.
 Ё|__ | /  |
     | У..  |
40262:2001/05/31(木) 01:24
>>397
Lisp系のプログラムを書くなら
専用モードを持つEmacsなどのエディタを使うのが吉。
括弧が多いだけに括弧の対応や適切なインデンテーション
を自動的にやってくれるとそれだけで効率がぜんぜん違う。
というかLisp系では適切なインデントはほとんど前提。

>>398
下手に中置記法が混じると構文が崩れて
かえって読みにくいと思うけど。
403デフォルトの名無しさん:2001/05/31(木) 01:32
>>401
(define (森田 n)
(display
"      ,一-、
     / ̄ l |   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    ■■-っ < >>")
(display n)
(display " んなーこたーない
    ´∀`/    \__________
   __/|Y/\.
 Ё|__ | /  |
     | У..  | ")
)

(森田 399)
404デフォルトの名無しさん:2001/05/31(木) 03:09
>>402
こーいうのはあると便利だけど
(infix 2 * a * b * (- 1) * 4 * c + d / e * f)
=>(eval (+ (* 8 a b (- 1) c) (* (/ d e) f)))に展開
=>evalの結果
毎回実行時に前置に展開するのは遅いから、
キャッシュ持っておくとか。
405デフォルトの名無しさん:2001/05/31(木) 03:28
初めから前置で書けばいいだろ。
406デフォルトの名無しさん:2001/05/31(木) 03:34
向上心のかけらも無いやつだなキミは>>405
407397:2001/05/31(木) 10:40
>>398
Schemeのシンプルなところは好きです。
lambdaは気持ちよさげ。(Javaのanonymous classみたいなものですね。)
ただ、まだ括弧にはなれていないれす。

>>402
emacsは好きなんでemacsつこうとります。

Meadow + DrScheme
408デフォルトの名無しさん:2001/05/31(木) 18:20
>>406
Lisp/Schemeではinfixで書くほうが堕落だとおもうぞ
409デフォルトの名無しさん:2001/05/31(木) 23:59
でも普段から前置で書かないと間違えそうだよ。括弧増えるし。
ちなみに
(infix-expand 〜)
みたいなの用意されてるから、必要なら前置で取り出せるけど。
410デフォルトの名無しさん:2001/06/01(金) 00:09
演算子として扱うなら>>404の様な手段はあったほうがいいかな
(infix 〜 (prefix 〜 (infix 〜) 〜) )
とかネストできると良いかも。
411デフォルトの名無しさん:2001/06/01(金) 00:39
だったら Haskell ?
関数も infix にできるでよ。
412デフォルトの名無しさん:2001/06/01(金) 00:54
413デフォルトの名無しさん:2001/06/01(金) 01:05
414デフォルトの名無しさん:2001/06/03(日) 01:01
 
415デフォルトの名無しさん:2001/06/03(日) 08:10
postfix萌え
416qmailユーザ:2001/06/03(日) 10:58
postfixっていうとあっちのpostfixしか思いつかないな〜
417デフォルトの名無しさん:2001/06/10(日) 05:26
age
418デフォルトの名無しさん:2001/06/10(日) 12:40
そういや、なぜか SIGPLAN Noticesにはほぼ
毎号 Functional Programmingと Forthの連載があるよな。
# なぜか今年は POPLも送られてきたのでラッキー
419デフォルトの名無しさん:2001/06/10(日) 22:53
age
420デフォルトの名無しさん:2001/06/11(月) 07:24
Haskellっていい言語だと思うけど、絶対メジャーにならないよね?
型クラスとモナドが難しい。
C++よりも理解不能な言語がメジャーになれるのか疑問。
C++はCとして使えるからまだいいけど。
421デフォルトの名無しさん:2001/06/11(月) 07:25
どちらかというと、SMLの方がメジャーになりそう。
422デフォルトの名無しさん:2001/06/11(月) 10:42
MLは文法が覚えにくくてなあ。
423デフォルトの名無しさん:2001/06/11(月) 14:15
あのさあ、C++の文法って見たことある?無茶苦茶よ。
っていうかちゃんとした式で書いたC/C++の文法なんて存在しないんじゃん?

関数系の文法は綺麗よー。
まず文法デザインしてからコンパイラー書いてるから。
SMLは正式な文法の本があるはずだから興味ある方は読むべし。

でも文法の単純さと使い易さは別物ですねん。
424デフォルトの名無しさん:2001/06/11(月) 14:23
> っていうかちゃんとした式で書いたC/C++の文法なんて存在しないんじゃん?
意味不明
425デフォルトの名無しさん:2001/06/11(月) 14:38
>> っていうかちゃんとした式で書いたC/C++の文法なんて存在しないんじゃん?
>意味不明

言い方悪かったすか?TT
未だかつてC/C++の文法は式で書かれたことがないのでは?
ってことっす。
426422:2001/06/11(月) 14:41
>>423
いや、オレはSchemerなので。C++となんか比べてない。
>>425
それも意味不明。「BNFで書かれた」ということですか?
そんならストラウストラップに載ってる。
427デフォルトの名無しさん:2001/06/11(月) 14:44
>>425
なんか…関数型言語関連のスレって、投稿者の知識にかなりのブレが
ありますよね。とくにC/C++ネタが出てきたときの。
428427:2001/06/11(月) 16:34
ありゃ、一番厨房なのは漏れだ。逝ってきまーす。
429デフォルトの名無しさん:2001/06/11(月) 17:36
>>428
何故そうなる?
430デフォルトの名無しさん:2001/06/12(火) 00:35
C++の文法って汚いけど、簡単に理解できるじゃん。

関数型言語の場合、モナドってなに?
ドットペアって?再帰型?
型構築子?え?え?って感じだよ。

関数型言語は綺麗かもしれないけど、難しいじゃん。
431デフォルトの名無しさん:2001/06/12(火) 01:06
Haskell is fine and dandy for some stuff at
educational level, but build applications in
it? HARH HARH HARH! The complex functions in
Haskell are ludicrus and will never get anyone
who haven't had a course in it anywhere. The
imperative languages are so much easier for
the average programmer, and the task of learning
Haskell properly is too exhausting for it to gain
wider acceptance. The only future I see for Haskell
is as a scripting language used for CGI's -
but I'd like to see it try and compete with
Perl's popularity.
432デフォルトの名無しさん:2001/06/12(火) 01:12
sourceは?
433デフォルトの名無しさん:2001/06/12(火) 01:13
ブル・・・(以下略)
434デフォルトの名無しさん:2001/06/12(火) 01:14
>>431
の機械翻訳
Haskellは教育のレベルにある材料に適しおしゃれ?しかし、その中のアプリケーションを構築してください?HARH HARH HARH!Haskellの中の複雑な機能はludicrusで、コースをそのいかなる場所にも持っていない人は誰も得ないでしょう。命令的な言語は、平均のプログラマにとって非常に容易です。また、Haskellを学習するタスクはそれがより広く認められるために適切にまた消耗しています。ただ一つの将来のIはHaskellのために見ます、スクリプトを書く言語がCGIのために使用するが、私が、それが試みて、パールの人気と競争するのを見たいとともに、あります。
435デフォルトの名無しさん:2001/06/12(火) 01:23
そんなもんいちいち貼るな。ウゼエ。
436デフォルトの名無しさん:2001/06/12(火) 01:28
ゼエゼエ。
437デフォルトの名無しさん:2001/06/12(火) 01:35
431の適当に要約した訳

Haksellは教育的にはいいんだけどよ〜、実際にアプリをつくるって?
ハッハッハッ!
Haskellなんて難しすぎて、教育を受けてない奴にはわからないね。
命令的な言語の方がずっと簡単さ。
こんな言語が広まるわけが無い。
将来はCGIで使われるだけだろ。Perlと競争するのをみてみたいもんだ。
438デフォルトの名無しさん:2001/06/12(火) 02:19
>それも意味不明。「BNFで書かれた」ということですか?
>そんならストラウストラップに載ってる。

ちゃうちゃう、BNFはsyntaxでしょーが。
ここで文法ってのはsemanticsのことですたい。
ちなみにCのsyntaxだったらK&Rに載ってるね。
っていうかsyntaxだったらコンパイラのparserパクればOK?

SMLは操作意味(operational semantics)の文法が存在するのですよ。

>なんか…関数型言語関連のスレって、投稿者の知識にかなりのブレが
>ありますよね。とくにC/C++ネタが出てきたときの。

あり?もしかしてなめられてます?一応言語は研究範囲内なんすけど(涙)
439デフォルトの名無しさん:2001/06/12(火) 02:33
うーん、言語を勉強してるなら「文法ってのは semantics」
なんていえないだろ...
ネタじゃないから痛すぎるから出直してくれ。
440デフォルトの名無しさん:2001/06/12(火) 02:33
うーん、言語を勉強してるなら「文法ってのは semantics」
なんていえないだろ...
ネタじゃないから痛すぎるから出直してくれ。
441デフォルトの名無しさん:2001/06/12(火) 02:44
同意。自己流解釈はやめてほしいよな。
442デフォルトの名無しさん:2001/06/12(火) 05:11
ここまで痛い奴は久々だな。この辺なんか特にツボ。
> SMLは操作意味(operational semantics)の文法が存在するのですよ。
443デフォルトの名無しさん:2001/06/12(火) 08:16
ようするに、mathematical notation ってことか?
444デフォルトの名無しさん:2001/06/12(火) 11:53
>ここまで痛い奴は久々だな。この辺なんか特にツボ。
>> SMLは操作意味(operational semantics)の文法が存在するのですよ。

へー。文法って言わないのか?わりーわりー。なんせ留学10年めだから。
日本語(特に専門用語)分からなくなってますわ。

自分もちょっと変だと思ったんだよね。誰かがHaskellの文法は難しいって
言ったからてっきりsemanticsの方かと思ったぜ。Haskellのsyntaxが
難しいってことだったのね?syntaxって難しいか?

>ようするに、mathematical notation ってことか?
ちょっと違うかも?何をmathかとするかによるけどこっち(米国)の
言語学者たちはmathematical notationだとdenotational semanticsの
方を指すことになる。

やっぱ日本の板に書き込む前にはも少し日本語専門用語習わんとな。
反省-_-
445デフォルトの名無しさん:2001/06/12(火) 13:08
このスレに職業プログラマはいるのか?
446デフォルトの名無しさん:2001/06/12(火) 13:47
>>431の出典を検索したら一発で見つかったわ。
http://www.google.com/search?q=Haskell+HARH+applications&btnG=Google+%8C%9F%8D%F5&hl=ja&lr=
と思ったらHaskellじゃなくMLになってるわね。
どっちがオリジナルなんでしょ?
447427:2001/06/12(火) 17:15
>>438
いえ…僕もsemanticsの形式的な記述(これでいいの?)のことだと思ったんで、
>>424さんに煽りっぽく突っ込み入れてみたんですけど、424さんがBNFのことを
言ってたと>>426でわかったから、これはもう、漏れが厨房なだけだと。
448デフォルトの名無しさん:2001/06/12(火) 17:21
留年10年目?
449デフォルトの名無しさん:2001/06/12(火) 18:32
>>448
3年目か4年目辺りで退学です。
450デフォルトの名無しさん:2001/06/12(火) 18:47
Haskellが難しいのは概念だろ?
つまり、ある決まった規則が、何を意味してるのか
わからないんだよ。

444はsemanticsとやらに形式的な記述が存在して綺麗だとか、
そういう学者的な超越的視点に立ってるから一般人が難しい
という意味がわからないんだろ。
451デフォルトの名無しさん:2001/06/12(火) 19:33
とにかく俺はすごいと言うことを言いたいんだろ
452デフォルトの名無しさん:2001/06/12(火) 20:47
>>444
痛さ100倍だな。
そうじゃないなら英語使っていいから自分の発言を説明してみれ。
>>450
単なる厨房。
453デフォルトの名無しさん:2001/06/14(木) 01:04
確かに monadは俺もわからん!! >>450
でもそれ以外は Cなんかよりずっとわかりやすいとおもうがな..
pointerなんて architecture知らないとわからんし。
数列の合計とかも、loop変数とかぶん回さなくてもできるし。
454デフォルトの名無しさん:2001/06/14(木) 05:35
俺は型もよくわからん。
型に引数とかあるが、あれはなんなんだ。
455デフォルトの名無しさん:2001/06/14(木) 13:41
>>454
Generic
Template
かなあ。
456デフォルトの名無しさん:2001/06/14(木) 23:00
>>455
素直にポリモルフィズムって言ったほうが
最近のオブジェクト指向に慣れた人には通じるかも。
ただしアドホックじゃなくてパラメトリックなポリモルフィズムだから、
C++でいえばOperator OverloadingじゃなくてTemplateみたいなもの
(のもっと一般的な奴)です。
457デフォルトの名無しさん:2001/06/15(金) 03:34
Parametric Polymorphismは CLUで学んだぞ!!
まあ、Javaにも Genericityが入るみたいだし、マンセーって感じ?
458デフォルトの名無しさん:2001/06/15(金) 05:16
monadってライプニッツのモナコ?>453
459デフォルトの名無しさん:2001/06/15(金) 21:22
型推論って他の(変数型無しデータ型有りの様な)スクリプト言語に
応用できないの?
460デフォルトの名無しさん:2001/06/15(金) 23:13
>>459
そういう言語は実行時に型の間違いを発見し、コンパイル時には
発見しないので、型推論をする必要が無い。
461デフォルトの名無しさん:2001/06/16(土) 00:05
>コンパイル時には
>発見しない
だから、型推論がどうかって話じゃないの?
462デフォルトの名無しさん:2001/06/16(土) 00:06
>コンパイル時には
>発見しない
だから、型推論はどうかって話じゃないの?
463デフォルトの名無しさん:2001/06/16(土) 00:18
>>460
実行する前に型推論行なって、MLとかと同様にエラー検出ができれば
十分意味があると思うけど。
464デフォルトの名無しさん:2001/06/16(土) 00:24
>>463
それなら意味あるけど、そうなったらもはや型の無い言語じゃないよね。
465デフォルトの名無しさん:2001/06/16(土) 02:13
型推論ってどんな分野の本参照すればわかりますか?
論理関係の本?
466デフォルトの名無しさん:2001/06/16(土) 02:18
>>465
MLの解説本じゃない?
467デフォルトの名無しさん:2001/06/16(土) 02:36
>>466
MLの本ですか。
どっちにしろ図書館ですね
468デフォルトの名無しさん:2001/06/16(土) 03:01
型推論だけなら、webで十分じゃない?
469デフォルトの名無しさん:2001/06/16(土) 04:22
webって Don Knuthの???
あれってそんなのあったっけ???
うーん、それ以外に webってあったか...
470デフォルトの名無しさん:2001/06/16(土) 04:33
なぜにDon Knuth?
471デフォルトの名無しさん:2001/06/16(土) 05:39
文芸的プログラミングか。
472デフォルトの名無しさん:2001/06/16(土) 08:26
>>463
schemeにMLライクな型推論を実装した、
っていうレポート記事は昔見たことあるよ。(英語)
純粋に型チェックに使うのかな?
473デフォルトの名無しさん:2001/06/16(土) 23:48
>>469
webって、インターネットってことだろ。
googleで検索しろよ。
474デフォルトの名無しさん:2001/06/17(日) 05:54
>>473
> webって、インターネットってことだろ。
この言い方も変だなぁ……。
まあ、>>469が変な勘違いしてるようだからしゃーないか……。
475デフォルトの名無しさん:2001/06/17(日) 08:01
プログラミング言語理論への招待 ISBN4-7561-0317-0 5800円
結構高いし、難しい本だけど、
型付きλとか推論関係の内容があった。
まあ、図書館で見掛けたら。
47662:2001/06/17(日) 15:04
>>475
Mayerさんの本は悪くはないが
どちらかというと広く浅くだし、ちょっと癖が強い。
>>465
基礎理論については
プログラミング言語の基礎理論、大堀淳 著、共立出版
コンピュータサイエンス入門 --- アルゴリズムとプログラミング言語、
大堀淳、ジャック・ガリグ、西村進 著、岩波書店
あたりにはきちんと書いてある。実装まで書いてある本は
日本語ではあんまりないと思う。英語でよければ
Luca Cardelli. Basic polymorphic typechecking
Science of Computer Programming, 8(2): 147-172, 1987.
http://research.microsoft.com/Users/luca/Papers/BasicTypechecking.A4.pdf
にはModula-2だけどコードまで書いてある。
彼も今はMicrosoft Research Labにいるね。
477465:2001/06/20(水) 01:33
「コンピュータサイエンス入門 アルゴリズムとプログラミング言語」

「プログラミング言語ML」
を借りてきました。
ML言語はともかく、型推論の部分はむずかしそうですね。
478デフォルトの名無しさん:2001/06/20(水) 11:39
>465
型理論なら
「モデルと表現」
米沢明憲・柴山悦哉
岩波書店ソフトウェア科学17
http://www.iwanami.co.jp/.BOOKS/01/1/0103570.html
の方が初心者向けで分かりやすいよ。
内容は「コンピュータサイエンス入門」より狭いけど。
479デフォルトの名無しさん:2001/06/21(木) 00:10
>>477
型推論のところなんかちっとも難しくない。
それよりもストラクチャの所が難しい。
480デフォルトの名無しさん:2001/06/21(木) 02:32
MLの考え方を身につけると
JavaやDelphiなどの現実的(?)な言語の
コーディング・設計の仕方が変わってきますか?
またどのように変わりますか?
それとも特に影響される部分はないのでしょうか。
481デフォルトの名無しさん:2001/06/21(木) 03:14
>>480
MLやHaskellに感化され、型推論などの重要性を理解できるようになる
と世界が広がったような気分を満喫できる。それでひとつ目のハードル
がクリアされる。

しかし、それらの言語に特徴的な機能を何とかコーディングで実現しようと
してどつぼにはまって自爆する。

「現実的(?)な言語」では無理してそういうことやらなくて良いんだ、
その分設計に力を入れよ、ということに気が付くようになると
次のハードルをひとつ越したことになる。

型を動的な側面と静的な側面でうまく使い分けることができるように
なれば、更につぎのハードルを越えたといえるんじゃないだろうか。

ちなみに、C++でテンプレートを駆使してどつぼにはまったことがあります。
482デフォルトの名無しさん:2001/06/21(木) 03:30
>>480
一般的な関数型言語は、従来の手続き型言語に比べ
すっきり記述できるので、それに慣れると
ややっこしいコードが理解できなくなります。
483デフォルトの名無しさん:2001/06/22(金) 00:38
MLのおすすめサイト教えて
484デフォルトの名無しさん:2001/06/22(金) 01:25
CやPascalに比べればいろんな概念が取り入れられてるから、
視野はいろいろと広がると思うけど。
別の言語でそれにこだわるとかえってマイナスになるということは
あるよね。郷に入っては郷に従えってことだね。
もちろんプラスとなることもあるだろうけど。
485デフォルトの名無しさん:2001/06/22(金) 01:33
486デフォルトの名無しさん:2001/06/22(金) 02:12
何もわからん初心者に関数型言語を最初に教えたらどうなるのかな?
487デフォルトの名無しさん:2001/06/22(金) 02:24
数学知ってれば、Cなんかよりは判りやすいと思う。>486
488デフォルトの名無しさん:2001/06/22(金) 02:28
>>487
いえてるかも。

a = 4;
a = a + 1;

これって数学じゃないしね。
489デフォルトの名無しさん:2001/06/22(金) 02:58
>>483
http://a414s1.it.nanzan-u.ac.jp/smlbook/smlwww/

http://www.gin.or.jp/users/daikoku/ml/default.htm
ここのML講座、txtで700kb近くある。
分割してhtmlにして欲しいね。
あと、MLの入門というよりプログラミングの入門だそうな。

http://www.gin.or.jp/users/daikoku/lang/func/ml.htm
490デフォルトの名無しさん:2001/06/22(金) 03:27
>>487-488
というか、数学のやりかたとCのやりかたの
どっちが「正しい」のか?という悩みに
ぶつかってしまったのだが…。
491デフォルトの名無しさん:2001/06/22(金) 03:37
>>490
'='この記号を先に使ったのは数学。
492デフォルトの名無しさん:2001/06/22(金) 03:42
>>490
a = a + 1 という式から、
今の数学の公理系と同じくらい広く利用できる公理系が作れるならいいけどね。
1 = 1 + 1 も、二進数で + が AND 演算なら成り立つんだし。

まあ、Pascal のように代入記号に等号を使わなければ回避できる。
a := 4
a := a + 1
493492:2001/06/22(金) 03:49
って成り立たないか。
i.a = 0
0 = 0 & 0
0 = 0 & 1

ii.a = 1
1 = 1 & 1
1 = 1 & 0 ←これがダメだ
494デフォルトの名無しさん:2001/06/22(金) 05:20
>>488-493
安直に考えて
    i = i + 1
とかいうのは、計算のステップごとに添字をつけて、
    i_(n+1) = i_n + 1
とかいうことじゃないだろか。

プログラム上での変数というのは、数学での数列というわけ。
495492:2001/06/22(金) 23:32
>>494
なるほどすっきりした。
やはり同じ記号を使うのが悪いよなあ。
a <- 4 とか a ← 4 なら見た目からも明らかに代入なのにさ。
496デフォルトの名無しさん:2001/06/23(土) 14:12
hage
497デフォルトの名無しさん:2001/06/23(土) 15:42
Pascalの代入は

i := i + 1

じゃなかったっけ?
498デフォルトの名無しさん:2001/06/23(土) 16:24
499デフォルトの名無しさん:2001/06/24(日) 01:09
>>494
でもその考えだと数列の最後の項にどんどん追加することしかできないんじゃない?
500デフォルトの名無しさん:2001/06/24(日) 01:12
ところでConcurrent Cleanって知ってる?
Haskellのように非正格で、さらに優れているのはその名の通りコンカレントってこと。
あとIOはHaskellのモナドに対して
Concurrent Cleanでは、Uniqueness typingというのがサポートしているらしい。
速度も速いってHPには書いてあるけど。

どうよ?
501デフォルトの名無しさん:2001/06/24(日) 01:23
コンカレントって何?
502デフォルトの名無しさん:2001/06/24(日) 01:26
>>500
コンカレントとは並列実行されるっていうことです。
503デフォルトの名無しさん:2001/06/24(日) 01:28
Haskellも並列実行できる気がするんですけどね。どうなんでしょう?
504デフォルトの名無しさん:2001/06/24(日) 01:32
マルチスレッドってこと?
505デフォルトの名無しさん:2001/06/24(日) 01:36
ようは直列されない(?)関数が同時に実行できるって事のようです。
506デフォルトの名無しさん:2001/06/24(日) 02:26
>>500 Uniquness typingの論文読んだことある人いる?
説明してくれ
507500:2001/06/24(日) 02:48
「polymorphicでUniquenessな型付け」っていったいどういうことなんでしょうかね?
508494:2001/06/24(日) 03:00
>>499
単なる思いつきなので、実は全く確信をもって言ったわけではないです…。

ところで「最後の項にどんどん追加することしか」というのは
どういうことのことを言ってるんでしょうか? よくわかりませんでした。
具体的にはどういうのをできないと言っているんでしょうか。
509499:2001/06/24(日) 03:31
>>494>>508
a_2みたいにn番目にアクセスできないという意味で言いました。こちらも深い意味は無いです。

C や Pascal みたいな手続き型言語では変数に数学的意味は無いと思います。
メモリの内容を書き換える、という程度でいいでしょう。
510494,508:2001/06/24(日) 04:18
>>509
なるほどわかりました。
ありがとうございます。

過去の変数の値にアクセスしたい、というなら、
おっしゃるとおりそれはできないですよね。

> C や Pascal みたいな手続き型言語では変数に数学的意味は無いと思います。
> メモリの内容を書き換える、という程度でいいでしょう。
いずれにせよ、計算モデルはチューリングマシンとか
RAMとかにいきつくわけですからね。
数学で使われる式とは、出発点が違ってる気がするし、
それとなく方向性も違ってそうなので、
意味はないというのにはなんとなく同感です。

ただ、それらはλ計算のモデルとも同等だとかいう話もあるみたいなんで、
どっかではどうにかしてつながっているでしょうけど。
511デフォルトの名無しさん:2001/06/24(日) 16:33
512デフォルトの名無しさん:2001/06/25(月) 13:35
513デフォルトの名無しさん:2001/06/29(金) 05:52
>>512
>LispのISO標準規格ISLISPの処理系
って有名なの?
あと、これのソースって何処にあるかしりませんか?
(なぜかバイナリしか置いてない)
514デフォルトの名無しさん:2001/06/29(金) 06:02
http://www.google.com/search?q=islisp&hl=ja&lr=
有名じゃないみたい。
515デフォルトの名無しさん:2001/06/29(金) 19:34
>islisp
非常にすっきりしているけど、
ある程度ライブラリがたまってからでないとキツイかも。
教育用としては非常にいいと思われますが。
516デフォルトの名無しさん:2001/06/29(金) 19:38
HR/HM板で生まれた最強天然電波少年のページ。
http://salami.2ch.net/test/read.cgi?bbs=hrhm&key=991394303

是非とも全部合わせてご覧あれ。
517デフォルトの名無しさん:2001/06/29(金) 23:53
relational lispって知ってます?
言語比較の論文に出てたけど。
518名無しのλ式:2001/06/30(土) 12:44
>>513
> あと、これのソースって何処にあるかしりませんか?

http://www.ito.ecei.tohoku.ac.jp/TISL/index_j.html
「これ」の一例、TISLのソースあり。
519513:2001/07/01(日) 08:20
>>518
ありがとう!
かなり小さいですね。
日本がメインなのが良い感じです。
GUYのCommonLisp->Schemeの縮小思想と似てるかも。
520デフォルトの名無しさん:2001/07/02(月) 02:28
>>519
SchemeはCommonlispよりもだいぶ前だよ.
521デフォルトの名無しさん:2001/07/06(金) 18:11
age
522デフォルトの名無しさん:2001/07/06(金) 23:20
(たしか)最初のSchemeは75年、
CommonLispは80年前半から。
523デフォルトの名無しさん:2001/07/12(木) 19:56
a.g.e.
524:2001/07/20(金) 08:19
age
525デフォルトの名無しさん:2001/07/22(日) 11:56
任意の言語から呼び出せる関数型言語コンポーネントがあればいいのに。
入出力等、副作用を伴う処理は関数型言語の苦手とするところだから、
そういう汚れ仕事は伝統的な言語に任せて、本質的な処理だけを担当す
るライブラリの構築を関数型言語が担当するという役割分担はできない
もんでしょうかね。
526デフォルトの名無しさん:2001/07/22(日) 13:42
libguileがあるじゃん?
527デフォルトの名無しさん:2001/07/23(月) 12:58
libguileか...なるほど、いいですね。ちょっと研究してみます。
528デフォルトの名無しさん:2001/07/24(火) 00:55
何故か、少々気になっているHaskellを勉強してみようかなと
思っておりますが、何か始めるに当たってアドバイスなんぞありますか?
参考サイトURLをぺたっ、でもOKです。
529デフォルトの名無しさん:2001/07/24(火) 01:04
>>528
Programming in Haskell(日本語)
http://www.sampou.org/haskell/
530528:2001/07/24(火) 02:04
どもです。
どうでもいいのでsageますが、
Lispを書くのにvim6がいいと思っておりますがいかがでしょう?
Syntax Highlightあるし、%でカッコジャンプできるし。
まぁemacsでも実現できるのでしょうが。
531デフォルトの名無しさん:2001/07/24(火) 07:40
>>530
vim6とemacsと両方試してみて、気に入った方を継続的に
使えば良いと思います。もっとも、僕ならLISPを書くとき
にはemacsですけどね。
532デフォルトの名無しさん:2001/07/24(火) 13:34
Haskell専用スレがあってもいいと思う方、
挙手をお願いいたします。
533デフォルトの名無しさん:2001/07/24(火) 13:44
はい
534デフォルトの名無しさん:2001/07/24(火) 16:15
けど、今たててもpiza止まっちゃうので、
復旧後にでもたてましょうか。
535名無しさん:2001/07/26(木) 04:49
Haskellの入門的文書で、一番分かりやすいのはこれじゃないかな?
www.teu.ac.jp/kougi/koshida/Prog6/index.html
536石敢當:2001/07/26(木) 15:04
>>532 ハイ、お願い致します。
537デフォルトの名無しさん:2001/07/26(木) 16:11
http://piza2.2ch.net/test/read.cgi?bbs=tech&key=996131288
関数型プログラミング言語Haskell
538デフォルトの名無しさん:2001/07/27(金) 00:08
>>535
良さそうですね。
539デフォルトの名無しさん:2001/07/31(火) 20:03
関数型言語旋風起こるか?age
540デフォルトの名無しさん:2001/08/01(水) 21:50
それが言われたのって5年ぐらい前だった気がする。>539
541名無しさん:2001/08/01(水) 22:25
いま、ナウなヤングの間で関数型言語がひそかなブームだヨ!
542デフォルトの名無しさん:2001/08/01(水) 22:47
イカすね。・¥
543デフォルトの名無しさん:2001/08/01(水) 23:13
イエイ
544デフォルトの名無しさん:2001/08/01(水) 23:28
米国ではMITやら何やらでガンガンLisper育てているせいもあり、
Lispは実用的な土台をもっているらしいですね。
日本は手続き型言語ばかりで関数型言語を習得していない人が多いので
関数型言語は話題になりにくいし、企業でも導入事例は少ないそうで。
hmm... 慣れの問題なのかな?
それだけじゃ無いような気もするけど、よぉわからん。
545デフォルトの名無しさん:2001/08/01(水) 23:39
簡単なlisp勉強中。
ところで、これでFFみたいなゲーム作ってみたいんですけど可能でしょうか?
あと、書けたとしてオブジェクト指向言語より楽になるんでしょうか?
ネタのようですがネタではないです。マジレスお願いします。
>lisperの皆さん
546デフォルトの名無しさん:2001/08/01(水) 23:41
ハガーか。懐かしいな。
547デフォルトの名無しさん:2001/08/01(水) 23:43
FFXだったら動画用意すればVBでも作れそうだね。
548デフォルトの名無しさん:2001/08/01(水) 23:48
lispだけだと遅いんじゃん?
コンパイルでネイティブコード直接吐く様な処理系なら違うだろうけど。
549デフォルトの名無しさん:2001/08/01(水) 23:54
>545
作れるよ
550545:2001/08/02(木) 00:12
わぉ。マジレスさんくすです。
>547 FFXってVBでも作れるんですか…すごいっすねVB
>548 lispは比較的遅い言語らしいですね ネックになるかな
>549 簡潔なレスサンクスです
Cでも書けそうですけどどちらが向いてるんでしょうか…。
551デフォルトの名無しさん:2001/08/02(木) 00:25
>>550
あーいうのは言語そのものよりも、用意された環境とか
ライブラリの質/量が開発期間に影響すると思うけど。
552デフォルトの名無しさん:2001/08/02(木) 00:26
>>550
> Cでも書けそうですけどどちらが向いてるんでしょうか…。

実行速度が要求される所は、C/C++で書いて、
ストーリーを司る所はLispなどのinterpreterで開発せよ。
553550:2001/08/02(木) 01:03
少しだけ読み進みました。dotimes とか…先は長いです。
>551 そうですね。絵や音を出すにも結構苦労しています。
   ちょろっと書いてみてプログラムは動き出すまでが
   難しいと思いました。必要なものが本当に多いですよね。
>552 適材適所ですね! ありがとうございます、
   全体像が見えてきました。おぼろげな感じですが…。
554525:2001/08/08(水) 12:13
自己レスですが、kawaを使うことに決定。javaからkawaで作ったクラスを
呼び出すことも、kawaからjavaで作ったクラスを呼び出すこともできて便
利。ポータブルだしね。
555デフォルトの名無しさん:2001/08/23(木) 23:04
a.g.e.
556デフォルトの名無しさん:2001/08/23(木) 23:25
>>554
javaの上にlisp(scheme)って、とても遅そうなんですけど
実際どうでしょうか。現実的ですか?
557525:2001/08/25(土) 13:20
>>556
起動は遅いけど、実際の動作は別に遅くないです。
バイトコードにコンパイルもできるし。
558デフォルトの名無しさん:01/08/30 13:42 ID:aCGvLkdQ
age
559デフォルトの名無しさん:01/09/01 00:25 ID:8UdnvL3A
参考になりました。
560デフォルトの名無しさん:01/09/07 16:38
C言語とかも、
関数型言語みたいに、デバッガ上でいきなり関数を呼び出して
関数のテストが出来たらいいのに…

デバッグしやすさ的に、
1位:関数型言語
2位:XPのユニットテスト
3位:デバッガでちまちま

かなりボロクソに言われそうな無いようですが、意見求む。
561デフォルトの名無しさん:01/09/07 18:16
C言語の場合、関数は副作用を持つことが多いので、関数単独で
動作テストできない場合が多いんじゃないか、と。
562デフォルトの名無しさん:01/09/07 18:37
UnitTestは非常にテストコードを書きやすかったよ。
setup()で対象クラスを生成して、
各メソッドごとのテストコードを書く。
入力と、望むべき出力を書いて、
一致すればOK、ダメなら何処がダメかが出力される。
一度テストコードを書けば、その後が楽なあたりは
関数型言語の関数を一つ一つテストするのよりは楽かと。
563デフォルトの名無しさん:01/09/07 19:05
UnitTestの有用さは認めるけど(俺も使ってるから)、
エラーになりそうな入力を考えないといけないし、
すべてのパターンを網羅的にチェックできるわけじゃないから、
本当の意味でエラーフリーであることは保証されない。
その点、強い型付けのある関数型言語は、かなり有利じゃないか、
と思いますが。
Smalltallkはデバッガの中でメソッドのテストも変数の中身の変更も
メソッドの定義修正もなんでもできるよ
565デフォルトの名無しさん:01/09/07 23:17
Smalltalkって何かカコイイイメージがあるなぁ。
566デフォルトの名無しさん:01/09/08 01:54
>>565
統合環境型Lisp - 関数型 + 手続き型 + OO → Smalltalk

Xeroxのworkstationは、同じVMの上でsmalltalkとInterlisp-Dのどちらも動きました。
>>562
判ってないね
ちみは
>>567 何だチミは。
569振らんでよい:01/09/08 14:07
開発手法野郎たちってすぐ揉めるよな。関数型言語の話しようぜ。

昔、論理型や関数型は機能推論によるdebugの研究が行なわれた頃があったけど、
ああいう研究って最近はどうなっているの?
// Wordアプリ
main(){ print("Debug me!\n"); }

これ自動デバッグしたらWordになっちゃうのか?
571デフォルトの名無しさん:01/09/09 12:46
今年の ICFP Programming Contest で Haskell を使ったチームが優勝したようだ。

http://cristal.inria.fr/ICFP2001/prog-contest/

課題:
http://cristal.inria.fr/ICFP2001/prog-contest/task.html

1st prize. 使用言語 Haskell, プログラム名 LALR(5000000), チーム名 Haskell Carrot
 http://cristal.inria.fr/ICFP2001/prog-contest/entries/121.tar.gz
 http://www.digitas.harvard.edu/usemod/bin/wiki?IcfpProgrammingContest

2nd prize. 使用言語 Dylan, プログラム名 Dylan Hackers,チーム名 Dylan Hackers
 http://cristal.inria.fr/ICFP2001/prog-contest/entries/249.tgz
 http://www.hoult.org/~bruce/dylan-hackers.html

Judge's special prize.
     使用言語 Erlang, プログラム名 Erlightning, チーム名 Blue Avengers
 http://cristal.inria.fr/ICFP2001/prog-contest/entries/024.tar
 http://www.bluetail.com/~luke/icfp2001/

3rd place. 使用言語 Objective Caml, プログラム名 runme, チーム名 [B8]_clan
 http://cristal.inria.fr/ICFP2001/prog-contest/entries/140.tar.gz
 http://pauillac.inria.fr/b8/

3rd place. 使用言語 C, プログラム名 ElegantBlob, チーム名 BlobMakers
 http://cristal.inria.fr/ICFP2001/prog-contest/entries/177.tar.gz
 http://www.cse.unsw.edu.au/~kchan/icfp/
572デフォルトの名無しさん:01/09/09 15:16
>>571
dylanのソースって読みやすそうだね
573デフォルトの名無しさん:01/09/09 19:47
>>572
Dylanって確かsyntaxが二つあって最初はLisp風だったのが
受けが悪くて普通っぽいのも用意したのではなかったかな?
574デフォルトの名無しさん:01/09/10 02:35
schemeとdylanの構文の対応表みたいなの見つけました
http://www.cs.indiana.edu/hyplan/jsobel/forschemers.html
575デフォルトの名無しさん:01/09/10 13:02
俺もdylanは好きだけど、コンパイル遅すぎ。
コンパイルの早いdylanがあれば、仕事のメインをdylanにしたいけどさー。
576デフォルトの名無しさん:01/09/11 01:59
みんなよくこんなマイナー言語知ってるよなぁ〜て
感心するね
577デフォルトの名無しさん:01/09/13 15:35
>>571
なんでオブジェクト指向も出来ないHaskellが一位なんだ。
きっとRubyやSmalltalkのチームは出場してないんだろう。
Cごときが3位に入ってるし。きっと低レベルなコンテストに違いない。
578 ◆twseXMUg :01/09/13 15:39
>>577
Haskell スレにも居た人っぽいなぁ。

オブジェクト指向言語と関数型言語、
どっちが優れてるかという議論をしたいのだろうなぁ。
579 ◆1sexzLsg :01/09/13 15:42
つーか、オブジェクト指向がどれだけ優れているかを
主張したいのだろうなぁ。
というよりなんでSMLがC言語に負けてるんだ。
581 ◆PaZvSexY :01/09/13 15:55
>>580
だって、言語コンテストじゃないもの。
>>577
じゃあ、RubyやSmalktal使って書いみて、あまりの素晴らしさに驚かしてくれ。
583デフォルトの名無しさん:01/09/13 17:35
ContestでHaskell使った人達はきっとラムダ計算とかモナディックスタイルだ
とかの理論を学んだ頭の良い人たちだったのでは。
>>583の意図がわからん。
585デフォルトの名無しさん:01/09/13 17:52
http://cristal.inria.fr/ICFP2001/prog-contest/
Although the precise task chosen will not be revealed until the
contest begins, correctness, algorithmic cleverness, and performance
will matter. Programming languages that help programmers to build
complex systems quickly may allow contestants to attempt particularly
sophisticated implementations in the 72 hours allotted for
programming.

だから、頭いい方とその分だけ有利ってことじゃないかな?
"correctness, algorithmic cleverness"あたり。
Algorithmのcorrectnessの記述、普段もやる人多いし。
つーか
> ラムダ計算とかモナディックスタイルだとかの理論
などを勉強するのは頭がよい人ってのは偏見だろう。
いや、統計的に見て理論を勉強してる奴の方がしてない奴より頭が良いだろう。
588デフォルトの名無しさん:01/09/13 20:42
>>586
俺は知らないけど、その理論が難しいんでしょ。
589手続き者:01/09/14 16:39
手続き型の発想
1. 器を用意する
2. 器に代入 ← なにか計算した結果
3. 器を引数に手続き呼び出し

関数型の発想
(手続きを呼び出す
 (引数として 計算をここでしちゃう))

非常におおざっぱだけど、こんな感じ?
>>589
君の理解だと、どこが関数型のメリットなの?
591589:01/09/14 17:40
単にコードに表れるうわっつらの特徴を書いてみたんだけど。
>>591
勉強する気あるの? それとも荒らし?
kawaはJavaによるSchemeの実現だけど、
Javaで実現されたMLとかHaskelとかってないかなあ。
SchemeはSchemeで面白いんだけど、型システムのある
関数型言語がほしい場合もあるんで。
594589:01/09/14 18:16
>勉強する気あるの?

それは>>589の比較が的外れだという意味?
うわっつらの特徴を比較することで理解に近付きたいと思ってるんだけど。
>>594
勉強する気があるんだね。
だったら答えるけど、>>589の比較では関数型言語と
手続き型言語の違いが浮かび上がってこないね。

関数型言語の特徴をごくおおざっぱに言えば、
・変数の値が変化しない
・関数を引数として渡せる
ってところだよね。
596デフォルトの名無しさん:01/09/14 19:59
(if (arashi-p situmon)
  (houchi situmon)
  (maji-resu situmon))
(define eval-question
 (lambda (q)
  (cond
   ((null? q) '())
   ((arashi? (car q)) (eval-question (cdr q)))
(else (append (maji-resu (car q)) (eval-question (cdr q))))))))
598デフォルトの名無しさん:01/09/17 09:37
覚えるならMathematicaがいいなと思うんだけどどうよ?
599デフォルトの名無しさん:01/09/17 10:25
>・関数を引数として渡せる
これは違うと思うよ。Cだって関数ポインタ渡せる。
一番違うのは関数型においては関数に対していろいろな演算が出来ること。
>>599
同意。
C でも関数ポインタなら返せるが、既存の関数へのポインタだけだもんな。
601 :01/09/17 14:29
>>577
このページを見てみましょう。
http://cristal.inria.fr/ICFP2001/prog-contest/results-elim/

Smalltalk, Ruby, SML, Java, Tcl, Perl, Python,
Scheme, Common Lisp, C++, Eiffel, Pascal
等を使ったチームも参加していることが分かります。
> The Pain Of C++
チーム名ワラタ
603デフォルトの名無しさん:01/09/17 15:49
>>601
Haskellを使ったチームが11チーム。
それに対してRubyを使ったチームは1チーム。
Smalltalkは2チーム、Schemeは6チーム、SMLは7チーム。
つまり、RubyよりHaskellの方が11倍有利だったということ。
C++は19チームもいるから救いようが無いけど。
Cに関数ポインタがあるのは知っているけど、
あれって実行時性能を確保することを目的と
したトリッキーなテクニックのために存在し
ているのであって、アルゴリズムをより的確
に表現するためのものではない、と思ってい
ます(違っていたらスマン)。

関数型言語における高階関数は本質的で欠く
ことの出来ないものだと理解していますが、
おかしな理解ですかね?
605デフォルトの名無しさん:01/09/17 15:53
>>601
しっかし、これ見るとocamlって言語が多いなあ。
そんなに人気がある言語なのかねぇ。
606g:01/09/17 16:00
>>604
えー、流れ的に、>>595さんですよね?(違ってたらすまん)

あなたの理解で間違ってないだろうけど、
> ・関数を引数として渡せる
って表現が適切じゃなかっただけかと。
>>601
なんか、Shell と Python の成績がいいのか?
>>605
INRIAが主催しているからと思われ。
(CamlはINRIAが開発した言語だからね、授業で使ってるんでしょ)
610デフォルトの名無しさん:01/09/17 22:28
>>608
成績は>>571
611デフォルトの名無しさん:01/09/17 23:06
>>604
Cのqsort()みたいな使い方は、実効性能目的というより
高階関数的だ、というのは理解を間違っているかな?
612デフォルトの名無しさん:01/09/17 23:25
>611
Lispのラムダ式の代わりみたいなもんか。
>>612
ん?違うだろ?

>>611
だな。
Ruby >>>>>>>>>>>>>>>> Java
Ruby >>>>>>>>>>>>>>>> Java
Ruby >>>>>>>>>>>>>>>> Java
Ruby >>>>>>>>>>>>>>>> Java
Ruby >>>>>>>>>>>>>>>> Java
Ruby >>>>>>>>>>>>>>>> Java
Ruby >>>>>>>>>>>>>>>> Java
Ruby >>>>>>>>>>>>>>>> Java
Ruby >>>>>>>>>>>>>>>> Java
Ruby >>>>>>>>>>>>>>>> Java
Ruby >>>>>>>>>>>>>>>> Java
Ruby >>>>>>>>>>>>>>>> Java
Ruby >>>>>>>>>>>>>>>> Java
Ruby >>>>>>>>>>>>>>>> Java
Ruby >>>>>>>>>>>>>>>> Java
Ruby >>>>>>>>>>>>>>>> Java
Ruby >>>>>>>>>>>>>>>> Java
Ruby >>>>>>>>>>>>>>>> Java
Ruby >>>>>>>>>>>>>>>> Java
Ruby >>>>>>>>>>>>>>>> Java
Ruby >>>>>>>>>>>>>>>> Java
Ruby >>>>>>>>>>>>>>>> Java
Ruby >>>>>>>>>>>>>>>> Java
Ruby >>>>>>>>>>>>>>>> Java
Ruby >>>>>>>>>>>>>>>> Java
問.1
>>>>>>>>>>>>>>>>は何演算子でしょう?
Rubyの人はなんでそんなに優れてることを主張したいんだろ。
言語仕様のオタクぶりが売りだけど所詮ひとりのアマチュアが作った言語仕様。
HaskellやOcamlを作った言語研究のプロのオタクぶりに勝てるわけが無い。
617デフォルトの名無しさん:01/09/18 01:00
>>616
って、価値基準はオタク度なのか?そーなのか!?
Rubyの優位性を主張してる人なんてそんなにいるか?
JavaやC++,Cまんせーな人に比べたら遥かに数少ないでしょ。

あと、まつもと氏はRuby関係の仕事をすることで給料をもらっているので
アマチュアではないです。
まぁ、言語研究のプロではないのかもしれないけどね。
619デフォルトの名無しさん:01/09/18 01:57
俺は関数型言語も好きだけど、
Rubyもこよなく愛しているよ。
I/O処理が多いプログラムを作ろうとすると、
慣れのせいなんだろうけど、関数型言語は疲れる。
>>619
俺も。それにrubyは関数型言語的な
処理も得意だしね。
高階関数は、引数に関数をもつ、あるいは値として関数を返す関数

ということで合ってますか?
>>621
yes.
623デフォルトの名無しさん:01/09/18 13:50
Ruby って無名関数あるの?
>>623
あるよ。perlにもある。
>>624
じゃあ、関数合成とかできるのけ?
>>625
できるよ。
627デフォルトの名無しさん:01/09/18 16:13
>>603
>Ruby より Haskell の方が 11 倍有利だった

Dylan チーム、Erlang チーム ( Lightning でエントリー )
も 1 チームしか参加していないが。

Ruby チームは第一ラウンドを通過していない所をみると、
メンバーに恵まれなかったのだろう。
来年あたり Ruby ユーザーに参加をけしかけるのも面白いかも。

>>605
>ocaml 多い

609 の書いているように 今回は INRIA が主催したということに加えて、
他の関数型言語に比べで実行速度が全般的に速いからじゃないだろうか。
既出だと思うが、下のページを見てみると、
仮想マシンコードでもまあまあの速度。
ネイティブコンパイルすると、随分速くなるようだ。
http://www.bagley.org/~doug/shootout/

参考までに、去年は ocaml を使ったチームが 1, 2 位。
( ただし参加チームが 38 と少ない )
http://www.cs.cornell.edu/icfp/contest_results.htm
Haskellの一番の特徴は強力な型システムと、型によるパターンマッチングで
しょう。これにより直接的な表現を可能にする。
一方Rubyは型の無い言語であって、方向性が全く違うと思う。
>>628
rubyに型はない、ってのはちょっと語弊があるんでわ?
変数に型がないので任意のオブジェクトをバインドできる
けど、オブジェクト自体はいずれかのクラスのインスタン
スだから、動的に型チェックすることはできるじゃない。

もっともHaskellの強力な型システムとは比較するべくも
ないので、それには同意。
>>620
rubyは末尾再帰展開してくれたりはしないので、
関数型とはいい難い。
>>630
rubyを関数型言語とは言い難いのは同意だけど、
末尾再起を繰り返しに展開するかどうかは関数型
言語か否かを決定する要因なの?

# 効率上、重大な問題だということは認める。
Cだってtail recursionをloopに展開するづら。
gcc -O4とかやってみれ >>630
>>629
つーか、今時はそういうのを型なしの言語というんだべ。例えばLisp。
>>632
標準仕様じゃねーだろ
ここで処理系依存の機能持ち出されてモナー
635デフォルトの名無しさん:01/09/19 04:28
>>631
関数型はループに相当する処理を再帰で書くのが普通。
言語によってはヘタレな人の為にループ構文を専用に用意したりしてるけど。
OOPするときは、俺の場合、どうしても動的な型付けがほしくなる。
関数型言語のときは、静的な型付けの方がしっくりくる(けど、Schemeも好き)。
なぜかしらん?
>>626
知らないから検索してみたけど関数合成って
ttp://www.teu.ac.jp/kougi/koshida/Prog6/Text08/
みたいなことを言うんでしょ?
Rubyでどうやるの。無理じゃない?
>>637
なるへそ。たしかに無理ですね。結果として同じことが実現できるだけでは
不十分ですね。スマソ。
しかし、だとするとSchemeは関数型言語としてはダメダメってこと?
関数合成できないし...
640デフォルトの名無しさん:01/09/20 18:41
>>639
え?
関数合成はできるだろ?
>>640
how?

>>637で紹介されているドキュメントによれば、
関数合成用の演算子が重要だということになる
んだが。

# もしかして、俺の理解がダメダメなだけ?
>>641
(define (comp f g)
(lambda (x) (f (g x)))

これでいかんのか?
とりあえず、Haskell でもやってることは同じだぞ。

>>637-638
Ruby 知らないのでアレなんだが…
> 結果として同じことが実現できるだけでは不十分ですね。
十分じゃないの?
643デフォルトの名無しさん:01/09/21 01:53
>>634
さらに意味が分からん。
Semanticsにtail jumpが、あたかもschemeのように、入っていたら関数型なのか?
ループ用の構文が全く必要ないって所があるんでは>643
schemeではループ用にdo文を用意してるけど、本当は必要ないし。
(syntax-sugarとしてもあまり意味ない。lispとの互換性?)
645デフォルトの名無しさん:01/09/21 07:08
>>642 の comp を Ruby で書くとするとどうなるの?>識者
def comp(f,g,x)
 f.call(g.call(x))
end
>>643
末尾再帰をループに展開するかどうかは関数型かどうかの判断基準には
ならないけど、関数型言語は再帰を多用するので末尾再帰をループに展
開しないとしたら、誉められた実装とは言えない。

# 末尾再帰になっているかどうかを判断できない処理系があるとすると、
# 関数型言語としては不満の残る実装だということ。

関数型言語ってのは、つまるところ「副作用のない言語」ってところに
尽きると思う。入出力その他のために副作用は完全にはなくせないんだ
けど、副作用を基本にしている手続き型言語とは一線を画しているのは
間違いないところだと思う。
648デフォルトの名無しさん:01/09/21 09:08
Scheme や Ruby の comp の例って、引数や返値の静的な型チェックはできないよね。

あと複数の値を引数にとる関数同士の合成ってできるもの?
CommonLispなんかは多値を返す関数とか書けるみたいだけど。
>>648
>Scheme や Ruby の comp の例って、引数や返値の静的な型チェックはできないよね。

SchemeやRubyは静的な型チェック自体がないからねえ。

>あと複数の値を引数にとる関数同士の合成ってできるもの?

別に引数の個数は問題にならないと思うけど。

>CommonLispなんかは多値を返す関数とか書けるみたいだけど。

SchemeやRubyは多値を返す関数を書ける。
>>649
Schemeは知らんけどRubyにmultiple-valueあったっけ?
>650
多値返すにはarrayを使う。
普通arrayを多値とは言わないけど。
Rubyは関数fがあったとき、a=fとかできないのが嫌だった。
関数fをクロージャとして変数aにバインドするには、rubyでは
次のように書きます。

a = method('f')

ちょっと変だけど、使いにくいほどじゃないでしょ。
654デフォルトの名無しさん:01/09/21 18:50
>>646
それって微妙に違わない?
合成するときに x を渡さず
保留することってできるの?
655654:01/09/21 19:29
スマン、表現がまずかった。

>>654のやつは関数を返すの?
656655:01/09/21 19:29
スマン、>>654じゃなくて>>646
657655:01/09/21 19:31
ていうか、>>646のはそのままだと、関数を返す分けないか…。
すまん。そうか、関数を返すんだっけ。

def comp(f,g)
 lambda{|x| f.call(g.call(x))}
end
def comp(f,g)
 lambda{|x| f.call(g.call(x))}
end

f = lambda{|x| x * 2}

g = lambda{|x| x * x}

p comp(f, g)
p comp(f, g).call(1)

こんなんでどう?
どうってイワレテモナー…
ruby使いがなんでこんなところに?
>>653
しかしそれでは関数fがオブジェクトって感じがしない。
663a:01/09/23 01:51
a
>>661
オブジェクト指向言語を温めて関数型言語を知る
>>661
どうでもいいけど
sicp 読んでる人には ruby もやってる人が多い模様。
http://www.amazon.co.jp/exec/obidos/ASIN/489471163X/ref=sr_aps_d_1_1/249-0272495-6600319
どっちも言語仕様を重視してる点では一緒か。
>>666

Rubyはクソです。ゴミ箱逝きです。

いじょ
この発言をコピペしていただければ幸いです。
#! /usr/bin/env perl
## compound.pl

use strict;

my $f = sub { $_[0] * 2 };
my $g = sub { $_[0] * $_[0] };

sub compound ($$) { my ($f, $g) = @_; sub { $f->( $g->($_[0]) ) } }

my $fg = compound($f, $g);

print $fg->(5) ."\n";
print compound($f, $g)->(5) ."\n";
669デフォルトの名無しさん:01/09/23 23:36
>>650-651
配列と別に多値はあるよ。配列の s-value は m-value に展開されるが。
もちろん m-value を配列で受けたり、配列を複数引数に展開して渡すこともできる。
―――――――――――――――――――――――
それでは次のコーナーです
__  ____________________
    .|/   ‖      ‖ ____   
        ‖      ‖ | ON AIR.|
   ∧ ∧ θ     ‖  ̄ ̄ ̄ ̄
   (,,゚Д゚)__ /[] ̄ ̄θΛ_Λ
  ||(.  つ_/    //(´∀` )/|  
  ┗┳ /      ̄/⊂    ||_/
    ┻| ̄ ̄ ̄ ̄ ̄|  (  ━┳┛      
      |_____| /ヽ」┘┻
____________|\____

「Rubyはクソです。ゴミ箱逝きです。 いじょ 」
この発言をコピペしていただければ幸いです。
irb(main):001:0> def add1(arg1,arg2) return arg1+1, arg2+1 end
nil
irb(main):002:0> p add1( add1(10,10) )
ArgumentError: wrong # of arguments(1 for 2)
(irb):2:in `add1'
(irb):2:in `irb_binding'

だめじゃん。関数合成どころか…
672age:01/09/26 09:47
IBMのdeveloperWorksでPythonでの関数プログラミングっていうのをやってて
http://www-6.ibm.com/jp/developerworks/linux/010615/j_l-prog.html

関数的な echo ループとか例がある

def monadic_print(x):
    print x
    return x

echo_FP = lambda: monadic_print(raw_input("FP -- "))=='quit' or echo_FP()
echo_FP()

おもろい?
今読み始めた。
訳が面白い。

> 関数が最初のクラス (オブジェクト) である。
>>671

えーとですねえ、多値を返すメソッドは、言わば「任意個」の値を返すメソッド
と同義なんですよ。ですから>>671でのメソッド定義では駄目で、

def add(*arg)
 arg.map(){|x| x += 1 }
end

みたいに定義しないと。
675h:01/09/27 16:16
age
>>674
それは多値じゃないねぇ。
>>671-676
rubyでは多値は扱えない。
それでいいじゃん。
元々そんなに多用する機能でもないし。
678デフォルトの名無しさん:01/10/01 22:23
関数が多言語age
679デフォルトの名無しさん:01/10/04 00:06
SMLいれたけど、コンパイルのやり方がわかりません。
コマンドラインでsml、と打つと対話型インタープリタ
が立ち上がってしまうのですが。
680デフォルトの名無しさん:01/10/04 03:27
それはインタプリタではなくインクリメンタルコンパイラです.
ソースを読み込んだらexportMLでダンプして実行可能オブジェクトを作るのです.
681679:01/10/04 18:23
あ、どーも。
- exportML "dmp.obj";
stdIn:1.1-2.4 Error: unbound variable or constructor: exportML

とかなりましたが、ちょいとgoogleで調べた所、

SMLofNJ.exportML
で私の環境ではよさげでした。どうも。
これでちょこちょこ遊んでみます。
682デフォルトの名無しさん:01/10/05 05:58
まとめあげ
683デフォルトの名無しさん:01/10/08 19:51
新しい関数型言語って無いの?
>>683
意味わかんねぇ。
新しいって何?
小学校とかでエクセル教えるくらいなら、関数型言語のどれかを
柔らかい頭に叩き込む方がいいね。小学生に職業訓練したって
しょうがないと思うんだけど。文部省の人間はバカか?
それとも教えられる人間がいないのかな?

そもそもソロバン=計算機と考えて、それじゃあIT革命に乗じて
そろばんの代わりにエクセルを学校で教えようとか考えてるのが、
あほくさい。やっぱり役所ってだめだな。
関数型言語を学ぶには、まず、数学における関数の知識が必須と思われ。
小学生はもちろん、高校生でも怪しいと思われ。
687デフォルトの名無しさん :01/10/13 23:21
sagarisugi!!!
688デフォルトの名無しさん:01/10/13 23:39
小学校で論理学の勉強するの?>686
ソロバンを電卓と同等に考えてる時点で逝ってよし>文部省
役人はコンピュータサイエンスという学問の存在すら知らないと思われ。
暗記試験で良い点とることが勉強だと思っとるからな。
tail recursionでメモリを食うようだと…
非常に多い回数まわるループ(含無限ループ)を書くのに
goto(または同等品)+代入が要ると思われ。
それで関数型言語って呼べるかって事では?
亀レスすまそ
692デフォルトの名無しさん:01/10/16 02:18
>>691
MLのwhileループはtail recursionだが、
メモリを食わないことが保証されてる。

Schemeもtail recursionではメモリを
消費しない。

Haskellもtop-level CAFのような例外
を除けば同じく。

Lispはそうでない。

pure functional…Haskell, Miranda, ...
impure functional…Scheme, ML, ...
Lispはどちらでもない。
693デフォルトの名無しさん:01/10/16 16:05
結構関数型言語に関するスレが建ったね。
ここ、Scheme, Haskell, ML, LISP@マ板
くらいかな。
最近Haskellいぢってないなぁ…
694デフォルトの名無しさん:01/10/24 12:44
O brave new world,
That has such people in't!
695デフォルトの名無しさん:01/10/24 18:25
Zマンセー
696デフォルトの名無しさん:01/10/25 03:19
おお、SML97の解説が日本語で読めるんだね。うれしー。
698デフォルトの名無しさん:01/10/25 11:31
素晴らしい!
http://www.jaist.ac.jp/~ohori/mltext.html

ML スレにもでてたね。
でも、もう一つのML本と比べてなにか違うの?
>>700
比較対象を持って書かれたということ
702名無しさん@XEmacs:01/10/27 13:18
age
703デフォルトの名無しさん:01/10/28 05:55
>>703
なんか誤解されそうな文だな。
そういう題名の本が評判悪いのね。
ML自体は悪くない。
Working Programmerはなんで翻訳されないんだろう?
こんなの読む人は大抵は英語ができるからかな?
706703:01/10/28 07:59
>>704
うわ、さっぱり気づかなかった…
スマソ
707デフォルトの名無しさん:01/10/29 08:29
708デフォルトの名無しさん:01/10/29 13:20
Intelはsuperscalerに見切りをつけたと思ったら、
VLIWの幅を増やすのもさっさと見切って、
これからはマルチスレッドだと逝ってるみたいですね。
マルチスレッド化すると1.3倍速くなるとか(中途半端な)…

もう手続き型言語から抽出できる命令レベルの並列性は
限界に来たのかなという気がします。

関数型言語の利点に、副作用がないので並列化しやすい
というのがあると思うのですが、関数型言語で書くと
並列度はやっぱり上がるんでしょうかね?
その場合、lazyな言語よりMLとかの方が並列化しやすい
気がするんだけど…(だって、前もってやっちゃうと
lazyで無くなるから…)
709デフォルトの名無しさん:01/10/29 15:49
>>708
lazy ってのは
評価されてない部分があっても、
それが評価されている必要が無いのなら
先に進んでよい
って話なので、別に必要が無いものを前もって計算したからって
問題はないと思うが。
711デフォルトの名無しさん:01/10/29 19:44
>>709
そうなのかな。
例えば
myIf :: Bool->a->a->a
myIf True x y = x
myIf False x y = y

で、述語を評価する前にxやyを評価したら、
本来起きないエラーが起きたりしない?
>>710
関数型言語とどういう関係があるの?
713デフォルトの名無しさん:01/10/30 00:08
>>686
U.S.A では12才でScheme おしえてるって知ってた?
それより若い子は、LOGOをやらせてるってしってた?
どうせ関数型も何もないような基礎の基礎やってハイ終りでしょ。
おれも小4クラスにLogo教えたことある。
Schemeは無いが、中学生たちにProlog教えたことならある。
別に問題はなかったよ。
JavaやHTMLを教える中学校の話。即戦力養成って感じだ。
思考の柔軟性を養うには関数型言語がいいと思うね。
http://www.hotwired.co.jp/news/news/culture/story/20010627204.html
>>710
これって関数言語用にILを拡張するっていうものだろ。
直接は関係ないな。
718デフォルトの名無しさん:01/10/30 06:43
>>711
その例に関しては、Haskell ならなんの問題もないと思うが。
というか、ML なんかのほうが副作用とかあるし、並列化しにくいのでは。
719デフォルトの名無しさん:01/10/30 10:03
数学の教科書に行番号BASICを載せてる時点でどうかと思う。
>>686
>小学生はもちろん、高校生でも怪しいと思われ
関数はそれほど高度な概念ではないのではないかと思われ。
数学でいう関数が厳密にどういうものを指すかは知らないけど、関数型言語を使うためのものなら、
その言語を使っているうちに覚えますよ。(schemeしか知りません)
>>714
時間を多めに割かないとそうなって終わりでしょうね。
(lambdaが出ないうちに終わっちゃったりして……それはないか)
>>713
それって、ごく一部の話でしょ。
アメリカって州ごとに教育制度が全然違ってたりするし。
721デフォルトの名無しさん:01/10/30 11:54
>>719
Little Schemerあたりが関数型言語(っちゅうか再帰処理)の入門書としては
もっとも良く書けていると思うけれど、
きっと大学生でもわからん奴
(数学的センスのない奴、抽象化が苦手な奴)は、けっこういると思う。

いわんやHaskelをや。
722_:01/10/30 16:34
俺理系の大学生だけど、その分からんやつかも。
解説読むより先にソース打ち込んで実際実行するか自分で書いてみた方が分かりやすい。
そういうのやった後なら、それ関係の抽象的な話も分かるようになるんだけどなー。
(「ああ、あのこと言ってるのね」って)
数学的センスあるやつって読んだだけで分かるの?
723デフォルトの名無しさん:01/10/30 21:45
アメリカ人の書いた本て、説明がしつこくねちっこく書いてあるよね(藁
偶像崇拝禁止の宗教を信仰している方が
なんとなく抽象的なものを理解するのが
早そうとかいってみる。
725デフォルトの名無しさん:01/10/30 22:21
数学(基礎論)が少し分かるようになった。ウレシー!!
んー、じゃあペアノ算術の完全性あたりから行こうか。
727157:01/10/30 23:20
おお!そんなものがあるのか?それはCOMベース?
ちなみにCMPもそこそこの性能は出るよ。巷で言われるほど悪くはない。
146はどうせ雑誌か何かで読んだ知識を鵜呑みにしているだけだろう。
そうでなければCMPに挑戦して挫折したのか?

いずれにせよスレ違いなのでsageておこう。
728デフォルトの名無しさん :01/10/31 22:14
禿らしく提げ
729719:01/10/31 22:40
>>721
>(数学的センスのない奴、抽象化が苦手な奴)は、けっこういると思う。
やっぱり苦手な人は苦手ですよねぇ……。
それに、高校までの数学とは違うものですし(言ってみれば、必要の無いこと)。
「総合的学習」の選択科目のひとつになるのが精一杯、といったところかも。

>>722
その方法は自分にとって分かりやすい、という方法が自分でわかっているなら、
「分からんやつ」でもないのでは?
自分で何かをしたり(この場合はソースを打ち込んだり)するのは、こういったことを
理解するための効果的な方法の一つではないかと思います。
……少なくとも、本を読んで覚えようとするよりは。

(読んだだけで分かる人がうらやましい)
730名無しさん@XEmacs:01/11/01 13:16
CommonLispでお薦めの本ってなにかありますか?
リスト遊びで終わるような本ではなく、
出来れば実用的なコンソールアプリが作れる程度まで書かれていれば
うれしいのですが。
731デフォルトの名無しさん:01/11/01 13:47
>>730
まだ見てないけど、この本がちょっと気になる。
http://www.amazon.co.jp/exec/obidos/ASIN/4756139264/
関数型言語、密かなブーム到来ですか?w
自分は業務系のJava屋ですが興味があります。
>>730
岩波のCommon Lisp入門はいいと思う。
サンプルではテキストエディタのコードが載ってた。
>>731
それMacの奴だよ。
最初のほうはlisp全般だが、
後ろのほうは、Macのlispプロセッサが必要な奴。
735730:01/11/01 16:58
>>731
面白そうなんですけど、>>734さんの言うとおり
Mac用というのが微妙に気になりますね…
とりあえず、岩波の方を探してみます。
736sage:01/11/01 17:49
>>731のを立ち読みしてみました。
MacCommonLispがうらやましくなりました。
終わり。
737デフォルトの名無しさん:01/11/02 22:43
密かにGCL for Winのインストールに躓いてる。
いちおうREADMEの通りにやっているつもりだけど、
WARNING: No installation directory specified.
Please try: C:\UNIX\cygwin\usr\local\lib\clisp\lisp.exe -B /usr/local/lib/clisp
が出てしまう。
まずはPlease tryとか言われているやつをやってみればいいのかな?

っていうか、やっぱプログラミングするんだったらUNIX系OSじゃないとだるいね。
738デフォルトの名無しさん :01/11/02 22:46
/cygdrive/c/UNIX ... って指定してもだめ?
>>737
ところでGCLはバージョンいくつのつかってますか?
740737:01/11/03 13:27
Cygwin経由ではなく、Winのコンソール上からだと
うまくインストールできました。
lisp.exeへのショートカットを作成し、そこのプロパティに
C:\UNIX\cygwin\usr\local\lib\clisp\lisp.exe -B /usr/local/lib/clisp -M meminit
(-M meminitは前も試した)と書いて実行すればOKでした。
けど、Cygwin経由からはうまくいかず。
ちなみに、バージョンは最新のを持ってきたはずです。
741737:01/11/03 23:07
ごめん、CLISPでした。
逝ってきます。
742無名λ式:01/11/04 14:15
亀レス
>>711
strictな引数だけspeculativeな計算をしてよい。
だから、strictness解析すればやっていいかどうか分かる。

f x ↑ z = ↑である時に、fの第二引数はstrictであるという。
↑は、「停止しない」式とか「副作用のある」式と思ってください。(やりたい解析による)
-- 式というか、semantic domain上のbottomと呼ばれる値。

myIfは第一引数だけstrict。
743デフォルトの名無しさん:01/11/04 14:51
>>742
ですよね。いかにHaskellでも、本来_Lが出てこないものが_Lになるような
投機的実行をしたらまずいですよね。

ところで do if P then putChar 'A' else getChar
なんてのはどうなんでしょ?
744デフォルトの名無しさん :01/11/04 15:06
>>737
どうもCommonLispの一番メジャーな処理系はCLispらしいですね。
gclは古いしcygwinじゃ厳しそうなので諦めました。対応はしてる
みたいだけど。
745デフォルトの名無しさん:01/11/04 16:50
まさみさまマンセーな俺としては、GCLが portableな
なかではいいと思ってたんだが...
CLispは compilerなかったようだし。
Portabilityに欠けるなら CMU CLがよかったような。

でも win環境ならいろんなところの Lispの評価版が
もらえないか? Allegloとか。

MCLはなつかしいねえ.. あの木のアイコン...
>>737
cygwinでコンパイルできた?
おれ、コンパイルエラーが山のようにでるよ。
cygwinは1.3.3です。
747デフォルトの名無しさん:01/11/04 20:07
>>745
> CLispは compilerなかったようだし。
あるよ。Win版でもあるかどうか知らんけど。
http://clisp.sourceforge.net/resources.html

> まさみさまマンセーな俺としては、GCLが portableな
> なかではいいと思ってたんだが...
ISLISPじゃなくていいのか?
746 自己レス
おれのはこれと同じだった
http://sources.redhat.com/ml/cygwin/2001-09/msg01333.html
とりあえず手で書き直してやるかな。
ML2000情報キボーン
立ち消え?
750デフォルトの名無しさん:01/11/06 22:43
GCLよりもCLISPの方がいいのかな?
湯淺先生ファンなので前者を使いたい気分だが。
先生はリアルタイム処理用のGCを開発(完了?)しているらしいね。
751デフォルトの名無しさん:01/11/12 00:48
言語の意味を数学的に記述するための勉強をしたいのですが、
どんな本を読んだらいいんでしょうか?
何かお勧めの本があれば教えて下さい。
752デフォルトの名無しさん:01/11/12 00:54
ソフトウエア科学のための論理学 萩谷昌己 岩波講座ソフトウエア科学11
計算モデルの基礎理論 井田哲雄 岩波講座ソフトウエア科学12
プログラムの基礎理論 佐藤雅彦、桜井貴文 岩波講座ソフトウエア科学13
753デフォルトの名無しさん:01/11/12 01:02
>>752
先生!どれも在庫がないみたいです!w
仕方がないので明日仕事帰りに
明倫書店に言って探してきます。
ありがとうございました。
754デフォルトの名無しさん:01/11/12 01:29
「プログラム意味論」, 横内寛文, 共立出版, 1994
「情報科学における論理」, 小野寛晰, 日本評論社, 1994
「計算論」, 高橋正子, 近代科学社, 1991
755デフォルトの名無しさん:01/11/12 01:51
>>755
ヲイヲイ。
757デフォルトの名無しさん :01/11/12 02:17
>>754
ありがとうございます。
この手の本って最近出版されたもので
いいものってないんですかね。
ヘルプをプリントアウトしたような
ものが今は売れるからマニアックな
本は刷らないのかもしれませんね。
図書館から借りるのがベストかな。

>>755
自然言語ではなくて計算機用の言語に
関する本が読みたいです。
数理論理学の本>757
759デフォルトの名無しさん:01/11/12 02:35
>>757
いいじゃないか、基礎から学ぶんだから、1990年代で十分だよ。
自然演繹とか理論関係の本
>>760
同意。

極端な例だが、幾何学や解析学を基礎から学びたいなら10年や20年
古くてもあまり関係ないだろう。それと同じ。
763デフォルトの名無しさん:01/11/12 02:53
これはまだ売ってるし90年代的でもある良書。
http://www.sra.co.jp/people/katsu/review/intro_theory
この本に挙げられている参考文献は今じゃWebで読めるものも
あるから一冊と言えばこれを薦めるな。
>>763
でもこれ、説明がヘタクソで意味不明。
>>764
この本はいいよ。sraのサイトのやつは分かりにくいけど。

アマゾンにも在庫はあるみたいだから757は
これを買いなさい。年内これ一冊で楽しめると思う。
766751:01/11/12 03:58
みなさんありがとうございます。
教えて頂いた本を書店で探してみます。
767デフォルトの名無しさん:01/11/12 04:52
>>765
俺はその本を少しと、754が言ってる「プログラム意味論」, 横内寛文
を読んだことがあるけど、後者の方が説明がわかりやすい上に、内容
が深いと思った。
ただし、無味乾燥で、扱ってる内容が少々難しくなるが。
768デフォルトの名無しさん:01/11/12 05:35
>>765
その本いい加減な集合論で定義しただけで「数学的」とか
調子こいてて全然ダメ。話にならない。
Meyerなんてしょせんタダの計算機馬鹿。
769デフォルトの名無しさん:01/11/14 00:25
>>768
同意。あまり真面目に読む本じゃない。
独学で、かつ真面目に読もうと思っちゃうと、緩い記述に引っかかって辛いかも。

さらっと読んで、>>767に進むのが良い。
771デフォルトの名無しさん:01/11/17 13:21
M$からLisp処理系出ないかなage
…俺はいらねーけど(wara
Lispじゃないけど昔Turbo Prologってのがあったね。
腐ってたが。
773751:01/11/20 11:50
ありがとうございます。
>>770
それは基礎論の教科書だけどこの話とは関係ないな
775デフォルトの名無しさん:01/11/21 15:27
「プログラム意味論」と同シリーズの、
「プログラム言語の基礎理論」っつーのはどうでしょうか?
>>772
TurboPascalとかと同じでボーランドから?
777デフォルトの名無しさん:01/11/21 22:37
>>776
Borlandが売ってたけど開発元は違った。
今はVisual Prologという名前になってる。
Prologとは呼べないほど変わった言語。

TurboLispってのもあるが、Borlandとは無関係。
778751:01/11/23 00:05
お久しぶりです。
とりあえず、Bertrand Meyerの
「プログラミング言語理論への招待」を買ってきました(それに
しても高かった、、、)。明日からの3連休で読み終えたいです。
教えてくださった方の話だと、どうも横内さんの本は難しそうなので、
とりあえずこれを読んでからにします。

今2章で基本的な概念とその記法を学んでいるんですが、
高校数学すらろくすっぽ覚えていないので記号に馴染むまで時間がかかりそう。
頭が悪いのでノートに書きまくって読んでます(*^o^*;
779デフォルトの名無しさん :01/11/23 09:30
Zってどんな言語??
780仕様書無しさん:01/11/24 09:45
781デフォルトの名無しさん:01/11/24 16:44
C って再帰使えるんだ。今、はじめて知った。
そんなわけで、Cもこのスレに入れてもいいですか?
>>781
ナニが「そんなわけで」だよ。
783仕様書無しさん:01/11/24 19:53
>>781
てゆーか、VBでさえ使えるんですが。再帰。
784デフォルトの名無しさん:01/11/24 21:03
>>775
大堀さんの?いい本だよ.
MLの基礎理論がしっかり書いてある.
785デフォルトの名無しさん:01/11/24 21:36
>>778
あの本を3日で読み終えようなんて傲慢にして無謀。
786デフォルトの名無しさん:01/11/24 22:43
てゆーか、いまどきFortranでさえ使えるんですが。再帰。
逆に言えば再帰を使うようなケースは大抵ライブラリとして用意されているから
そんなに必要性もないということか。。。
788751:01/11/25 21:50
>>785
確かに無謀でした。じっくり読んでるので今まだ4章の初めですw
前にも言われたように年内楽しめそうです(苦笑
お風呂やトイレに行くときも持ち込んで読んでるのに
こんなペースか、、、正直、自分の頭に失望しました。

こういった本を読んでいるとちゃんとした人に教わりたく
なってきますね。自分は高卒なので新たに大学に行きたくなってきました。
といっても4年間の学費を払う余裕もないのでなにか教養講座のような
ものがあればいいなと。どうでしょうかね?一人で本読んでばっかりじゃ
アウトプットがなくて効率が悪いと思うんですよ。
なにかご存知であれば教えて頂けないでしょうか?
>>788
大学にはこういう人に来て欲しいよね。
実際に大学に来てる人って勉強なんてやる気なくて
働かなくてもいいから大学いってるみたいな人がたくさんいる。
>>789
そんな大したものじゃありません。恥かしくなるのでやめてください

今いろいろと検索してみたのですが教養講座みたいなものはなかなか
見当たりません。ある程度の人数が集まるようなものでないと、
授業を開くことができないのは分かりますが残念です。
むしろ一般の講義を切り売りしてるような学校ってないかな?
一単位10万ぐらいで。飛行機の空席を安く売るような感じにw

先生に直接交渉して現金渡すのがいいのでしょうかね?ワラ
教える人とその授業を買う人が自由に売買できるほうが
望ましいと思いますが、現実はそうでもないみたい。

こういうの仲介するのが商売として成り立つかな?とも考えてみたりw

スレ違い、すみませんでした。
791デフォルトの名無しさん:01/11/27 04:02
>>790
> むしろ一般の講義を切り売りしてるような学校ってないかな?

ケンブリッジは、講義のビデオ売ってるよ。
日本の大学でもやっているところないかな?
いずれにせよ、多くの大学がやり始めると思う。

それから、多くの大学には、聴講という制度がある。
勝手にもぐり込んで授業を聞いても、誰も気づきはしないけどね。
# 某板では、思想的に偏った放言を吐く人の授業を聞きに行くツアーがあった。

>>788
>確かに無謀でした。じっくり読んでるので今まだ4章の初めですw

その手の本を読むのが初めてらしいので、遅いという事はないと思う。
おれが500万で数学をみっちり仕込んでやる!
どうだ、やすいだろ。これの方が大学なんてところに4年も行くよりは効率がいいぜ!
>>792
途中解約はできるのか?
お試し期間はあるのか?
月謝制か?
794_:01/11/27 12:22
末尾再帰でループみたいなことが出来るのは分かったけど
結局そのソースが吐き出すコードってループになってるんですよね?
なんのために再帰にこだわるのか私には謎。
別にこだわってないんじゃない?
再帰で書いたほうがきれいにかれるときに再帰を使えばいい。
末尾再帰がないと必ずループで書かなくちゃいけない。

# 他のものとの違いを聞かれると特徴的なことをあげるだろうけど、
# 別にそれがすべてって思ってるわけではないでしょ。
796デフォルトの名無しさん:01/11/27 12:47
>>794
結局そのソースが吐き出すコードって機械語になってるんですよね?
なんのために高級言語にこだわるのか私には謎(w
797_:01/11/27 12:48
>>795
確かに。再帰に対する考え方は一応私も同じスタンスです。
字句解析とか不思議なほどすっきり書けるのは確かですし。
まあ、lispでも普通にループ使ってたらいいですね。
ただ、なんか関数型言語って変なこだわりを感じるんですね。
(変数へ代入は状態がどうのこうのとか)
この辺り馴染めません・・・

#これも気にせず普通にコーディングしてればいいのかな。
798デフォルトの名無しさん:01/11/27 13:22
非手続型、なかんずく関数型は、
基本的には、imperativeに対する批判から出発している。
つまり、imperativeによるアルゴリズムの記述は、
実行順序を細かく論じることに費やされてしまい、
とかく冗長・複雑なものになってしまう。
また、そのアルゴリズムの正当性を論じようとする際には、
その非数学的な記述は、いかにも厄介である。
したがって、数学的でコマンドの羅列になることのないような記述法を
模索しようと言うことから出現してきた背景がある。
従って、別にどうでもいいといわれればどうでもいいのかもしれない。
しかし、まあ一応流れと言うことで。
799デフォルトの名無しさん:01/11/27 13:52
>>794
いや,再帰にはこだわりたい.なぜなら多くのアルゴリズムは
分割統治的な性質があるから,漸化式が導き出せる.すると
再帰はその直接的な表現になる.

逆に,ループは漸化式を開いた形に対応するので,アルゴリズム
の記述という観点からすると間接的な表現と言える.
800デフォルトの名無し :01/11/27 15:53
800get!
801デフォルトの名無しさん:01/11/27 22:27
>>790
その手の分野では日本ソフトウェア科学会が
ときどき短期の集中講座を開いてる.もちろん一般参加可能.
802デフォルトの名無しさん:01/11/28 00:48
再帰にこだわる理由…
・ループは単なる再帰の特殊例なので、再帰さえあればループは不必要。
・ループなんてものは数学的にはあやふやな概念。ループの『意味』を
 厳密に定義するには再帰を使うしかない。
・「ループが基本」とか「ループが分かりやすい」と思うとしたらそれは、
 たまたまそういう言語を先に学んだ人の偏見にすぎない。
803デフォルトの名無しさん:01/11/28 00:50
それと、少なくともHaskellではCのforやwhileにあたるものは
普通の関数として定義できてしまう。LispやSchemeでもマクロ
を使えば可能。基本構文に加える必要は全く無い。
ループのための構文がいらない
代入もいらない
腕立て100回に「再帰」の観念は必要かな?
ループを再帰の特殊例としてのみ捉えるのも、
たまたま数学マンセーに生まれついた人の偏見に思えるけど。
そうそう、歴史的には論理性が自然言語から
切り取られた概念だという事を忘れた言い分だね。
807デフォルトの名無しさん:01/11/28 02:28
再帰のみでfor文を作るのは
面白いけど無意味

みんなもやってみよう
808デフォルトの名無しさん:01/11/28 03:04
手続き型言語にはループと再帰がある。ループ構文を定義する方法がないから。

関数型言語には再帰がある。ループは定義できるから。
表現能力が同じで便利さも同じなら、primitiveは少ない方が良い。
プログラミング言語は形式言語であって自然言語とは無縁のもの。
曖昧さのあるプログラミング言語なんて使いたくない(w
>>808
別に関数型言語にケチつけるわけじゃないが
それは所詮個人的な美意識の問題に過ぎないと思われ。
利用局面において使いやすければそれでいいんだから。
C#なんてそういう美しさという点から言えば話にならないが(以下略)
いや、「ループを使うな」とか「ループは良くない」と言ってるわけじゃ
ないんだよ。「ループなんてライブラリで良いじゃん(ライブラリ化が可
能な言語なら)」と言ってるだけ。

CでもC++でも、「quick sort文」とか「hash table型」なんてのを
primitiveにはしないだろう、ということ。(C♭ならわからんが…)
>>811
確かに、再帰で表現できるループを言語文法にしてしまうのは良くないね
特に、数学的なものを扱う場合にはね
従わねばならない文法が増えれば増えるほど、「前提」も増えるからね
関数型言語においてはループは良くないよ。
代入が必要なんだから。
>>805

(loop 100 '腕立て)

こういう風に使える関数loopを定義することはScheme的にはひどくカンタンですが、それが何か?
>>813
意味不明。

たとえばSchemeの
(do ((i 0 (+ i 1))
   (a 0 b)
   (b 1 (+ a b)))
  ((> i 10) b))
というループに代入など出てこないが?
>>813
個人的にはこういうのがいいけどなぁ。
(define (udetate-ato n)
(udetate-suru)
(udetate-ato (- n 1)))
(udeate-ato 100)

>>814
(i 0 (+ i 1)) とか代入だよね。
実際には代入しない式に変換するかも知れないけど、
そんなこといったら手続き型の代入もすべて変換すればいいし。
817816:01/11/28 11:46
ごめん、ずれてる。
>>814>>815
818814:01/11/28 12:44
>>816
> (define (udetate-ato n)
> (udetate-suru)
> (udetate-ato (- n 1)))
> (udeate-ato 100)

これでは無限ループでは?

; (udetate-ato n)においてnがゼロになろうがマイナスになろうが停止しないでしょ。
819デフォルトの名無しさん:01/11/28 13:14
>>816

代入じゃないよ。

(letrec ((loop (lambda (i a b)
         (if (> i 10)
           b
           (loop (+ i 1) b (+ a b))))))
 (loop 0 0 1))

みたいなただの再帰呼び出しになる。
これを「副作用」と感じるようだとかなり毒されてる。
820813:01/11/28 13:31
>>815
それをループと呼ぶのなら、僕が間違ってます。すみません。
821学生:01/11/28 15:21
おおよそ「自然数」を取り扱う限り、
再帰的に定義されたものを再帰的なプログラムで記述するのが
一番忠実で簡潔な方法なのではないでせうか?

「腕立て伏せを『n回』やるように命令する」なんてまさにそうだと思われ。
「再帰的に定義された問題について」ですね。舌足らずスマソ。
>>819
forループもそういう風に展開できるよね?
再帰に展開したらループ自体の副作用がなくなるのは当然だけど無意味では?
>>821
「腕立て伏せを『n回』やるように命令する」
のどこに再帰があるんだい?
>>823
意味が分からない。

「ループ自体の副作用」って? 「ループ」という概念に副作用は含まれてい
ないと思うが。

「無意味」とは? 別に何か凝った変形操作をしているわけではなくて、同じ
ことを(つまり、ループはすなわち再帰だから、素直に再帰で)書いている
だけなんだが、何が無意味?

forという「文法」「カタチ」の方が好きならば、それを使えば良い。全く
同じ意味だが。
826821:01/11/28 16:03
あ、単純に

n回やるとは
・n>0なら(n-1)回やったあとXXXを1回やれ
・n=0なら何もしない
というふうに書けるということです


ん、関節やら筋肉やらにどういう指令を送って
腕立て伏せの一連の動作を行わせるかっていうこと?
それは関数型の話しとちゃうのでは?
>>824
「n回繰り返す」をどうモデル化しても再帰の概念が出てこざるを得ない。
たとえば「loopというラベルに続くコードからloopへジャンプする」という
のは、「loopという状態に遷移した以降の状態遷移先にまたloop自身が出てく
る」わけだから、遷移規則(オートマトンに対応する言語の導出規則)が再帰的
になる。

もっとストレートに言えば「繰り返し」はすべて「再帰」のサブセット。
>>827
同じ状態に遷移したら無限ループじゃん。816みたく。
829828:01/11/28 16:31
っていうか、827は
「クロージャに1,2,...,nを引数として順次与える」
って事しか言ってないのでは?
引数を与える方法が副作用であるか再帰関数であるかには
触れていない。
>>826
君は腕立て伏せをするとき、「一回やって、あとn-1回だ」って数えてる?
俺は1,2,3,4,...,nと数え上げて、その度に腕立てするよ。
別に「一回やって、あとn-1回だ」でもいいけど、他の方法もあるってこと。
自然数を公理的に定義する場合にも
n∈Nat ⇒ n'∈Nat としても
x≠0 ⇒ ∃y.x=y' としても
どっちでもいいよね。
831821:01/11/28 16:48
>俺は1,2,3,4,...,nと数え上げて、その度に腕立てするよ。
私もそうします。たまに何回目だかわからなくなって
1セット余分にやっちゃったりもします。
>「一回やって、あとn-1回だ」
なんてやってたら、エラー:「あれえ、あと何回だっけハァハァ」が爆発的に発生して
ぶったおれるまで終れないかも・・・

loop(a, n)とは
・もしもa>nならば終了
・そうでなければ loop(a+1, n)へ
>>827
途中に脱出条件が入っても(当然入ることを想定してたが)再帰であることに
かわりはない。

>>828
良くわからんが副作用とループが(必ずしも)関係ないということには同意。

>>829
カウンタを減らしていっても増やしていっても再帰は再帰。>>819 では増やし
てる。
833832:01/11/28 17:04
番号ずれてた。827, 828, 829はそれぞれ828, 829, 830のまちがい。

>>829
オートマトンと逝ったのが悪かったかも知れんが(それでも入力が進んでるか
ら無限ループとは限らないが)チューリングマシンなら意味は通るだろ。
834832:01/11/28 17:05
またまちがえた。>>830ね。欝。
おそらくループを再帰の一種に還元することを嫌う人は、
単純に具象構文が身体感覚に合致するかどうかを問題
にしているんだと思う。

Schemer/Lisperは構文問題に頓着しないので、
ループを再帰に置き換えるし、むしろ積極的にループなど
再帰の一種に過ぎないと「抽象化」する。

しかし、構文問題に頓着する人もいるわけ。
だからSchemeやLispの普及は一定以上のものにならない。

よくC言語はソースコードとマシンコードのギャップが少ない、
という評価のされ方をするね。

関数型言語の場合はソースコードと本質的なアルゴリズムの
ギャップが少ないという評価でいけるんじゃないかな。で、問題
を解決するときに「この問題の本質は何か?」を追求するので
はなく、本質的かどうかは問わず、手作業でやるときの方法を
素直に機械処理化するという方法論の人もいるんだな。そうい
う方法論の人の場合、ソースコードと自分の身体感覚のギャッ
プの少ないことが重要なんだと思う。

Perlなんかは、身体感覚重視で、だから科学的な発想の人か
ら嫌われるんだと思うし、身体感覚派の人からも、身体感覚的に
合わないと嫌われるんだと思う。
836デフォルトの名無しさん:01/11/29 01:10
>>835
なかなか鋭い洞察だと思うが身体感覚派の人もSchemeでdoループでも
forループでも使えば良いじゃん。あるいは身体感覚に合う構文を作っ
ても良いし。
> Schemer/Lisperは構文問題に頓着しないので、

それなら Haskell や ML なんて…
ところでループの定義って何?
>>833
え、チューリングマシンなら、それこそ副作用+ジャンプじゃん。
それを再帰関数に読み替えることができるってのはその通りだよ。
つまり、
>「n回繰り返す」をどうモデル化しても再帰の概念が出てこざるを得ない。
は「どうモデル化しても」じゃなくて「functionalなパラダイムでモデル化すれば」であって、
計算モデルとしてチューリングマシンを選べば「書き込み+ヘッド移動の概念が出てこざるを得ない」でしょ。

繰り返し動作を実装する時に
functionalなパラダイムでは再帰が自然だし
impericalなパラダイムではループが自然だっていう
それだけの話でしょ?なんで普遍的にどっちかに統一せにゃならんの?
840デフォルトの名無しさん:01/11/29 03:13
>>839
>計算モデルとしてチューリングマシンを選べば「書き込み+ヘッド移動の概念が
>出てこざるを得ない」でしょ。
んで、そのチューリングマシンと等価な言語の導出規則はどうなるの?

>繰り返し動作を実装する時に
>functionalなパラダイムでは再帰が自然だし
>impericalなパラダイムではループが自然だっていう

impericalってのはimperativeのことかな。
何でも良いが、再帰の出てこない意味論があったら教えてくれ。

>それだけの話でしょ?なんで普遍的にどっちかに統一せにゃならんの?
別に(形を)統一しろとは言ってない(と何度も言ってる)。
forやdoが好きなら使えばよろしい。
再帰さえあればループという「形」は簡単に作れるからprimitiveからは除
いても差し支えないと言っているだけ。
Cでwhileやdo、forがなくて、末尾再帰しかなかったららかなりうっとうしい
ことになりそうなんだけど。慣れの問題か?漏れはよく分からん。
842デフォルトの名無しさん:01/11/29 05:58
>>839
誰もチューリングマシン上でアルゴリズムの設計などしないのですが。
いろいろな計算モデルがチューリングマシンモデルと等価だというの
は正しいですが、だからといってチューリングマシンモデルが他のモ
デルと同様に有用だと考える人はいないでしょう。

だいたいそんなことを言い始めると言語を研究している人たちの立場
が...
>>840
> impericalってのはimperativeのことかな。
スマソ。その通りです。

> 何でも良いが、再帰の出てこない意味論があったら教えてくれ。
操作的意味論でよければ、いくらでもあると思うが。
例えばアセンブリコードを吐くコンパイラみたいのとか。
さらにそのアセンブリでcallやretをスタック操作+jumpに展開しちゃえば
再帰というよりループに近いシロモノになるよね。
どうでもいいけど末尾再帰って再帰って言ってるけど、
別に自分自身を呼ぶ必要はなくて、
関数などの一番最後のコンテキストで他の関数を呼ぶ時に
余分なスペースを消費しないことだから、
>>843 みたいなのはまさに末尾再帰だと思うのだが。
再帰でループ?
カット無しのPrologみたいなものか、
死ぬほどスタックがいるな。くだらん
>>845
いや、末尾再帰は最適化する環境が多いんだけども。(w
Schemeは言語仕様で最適化すると決まってるな。
なんかチューリングマシン以外に計算機のモデルがあるような
物言いだけど、そんなのあるの?
848デフォルトの名無しさん:01/11/29 08:54
>>847
あるけど、そんな物言い誰もしてないと思うけど?
849デフォルトの名無しさん :01/11/29 10:50
>>848
どんなのか少し説明お願い
850デフォルトの名無しさん:01/11/29 11:08
>>841
Cで再帰使って記述するとなると
return文が冗長だから読みやすくはならない。
Rubyみたいに最後の評価式が関数の値となる仕様ならまだしも。
>>849
脳型計算機とか。
話がずれてないか?
確かにずれてきてるな。
>>849
ラムダ計算+簡約規則でもいいし、ホーン節+推論規則でもいいし。
どっちのモデルもチューリングマシンコンパチだよ。
853835:01/11/29 17:21
>>836
Schemeは構文を拡張できるから、自分の身体感覚に合う構文を作れば良いってのは
ある意味正論だけど、やっぱり詭弁でしょ。アセンブラなら何でも記述できるんだから、
自分の好きなようにコンパイラを書けば良いって話と同じじゃない。(もちろん、Scheme
のマクロが強力かつ安全かつ書きやすいってことは認めるけれど。)

ある言語を評価するとき、個人的な感動の経験が影響するのは否定できないんじゃな
いかな。再帰処理の美しさに感動できれば、再帰処理が基本となっている言語の評価
は甘くなるだろうし、実行効率で感動できる人なら、実行効率に劣る言語はどうしたって
評価が辛くなる。

開発スタイルにもよるよね。上からの指示を淡々とプログラミングするだけの現場なら、
KISSが黄金律だろうし、納品先でカスタマイズしやすいことが大事だとしたらVBとかに
なりがちだろうし。
854836:01/11/29 18:37
>>853
詭弁とはまた厳しいお言葉。

コンパイラを書くのとは全然レベルが違うじゃん。
Schemeでdoループを書くなんてほんの20行かそこらでできちゃうんだから。
855835:01/11/29 19:16
欲しい構文がdoだけならカンタンだけどね。
forもwhileも欲しいし、Pascal風にレコード定義できるようにしたい、とか、
いろいろ始まるでしょ。
自分の身体感覚に合う構文を網羅しようとすると、大事だよね。
当然デバッグも必要なわけだし。
>>855
それでもまだコンパイラを作るのと同等に扱うのはどうかと思うよ。
そっちのほうがよっぽど詭弁ぽい。
857デフォルトの名無しさん:01/11/30 00:41
>>855-856
きみらの会話はさっぱりわからん
何がいいたいんだ?
なんか、やけに構文とかにこだわるなぁ
重要な議題なのかな?
オブジェクト指向派なので逆に関数型にも興味はあるが…
こんなに構文にこだわる言語なの?

繰り返しにも分岐にも、特別な文法を与えていないSmalltalkの方がきれいだなぁ
英語で俳句は書けますかってのと大して変わらないような議論かも
860835:01/11/30 10:41
英語で俳句は書けますし、書いている人もたくさんいますけど、それはおいといて。

その人が言語を選択するときに、あらかじめ用意されている道具(構文や関数、制御構造等)が
「しっくりくる」かどうかを気にするのは当然だと思う。道具を作るための仕掛けが十分に用意さ
れていても、自作しなければならない道具が多すぎると腰が退ける人はいるでしょう。

; あまりにも多くの道具が用意されているので尻込みすることもあるでしょうが。

Schemeが強力だってことは疑いないし、構文など些末な問題ではないってことも
疑いない。構文が身体感覚に合致しなくても、身体感覚に合う構文を定義して利用
できるというSchemeの強力さは、もっと評価されていいと思う。だから個人的には
836は支持できるんだけど。

でも、やっぱり、それが万人に通用するかと言えば無理があると思うんだ。
原理などしらずに道具を使いたい人はいるわけだし。原理が透けて見えると
息苦しい人とかいるわけだし。
861835:01/11/30 17:56
>>860
×構文など些末な問題ではない
○構文など些末な問題だ

スマソ。
862デフォルトの名無しさん:01/11/30 23:58
プロなら構文や言語機構が身体感覚(って何?)にあわなくてもセマンティクス
がわかれば使いこなせるのでは? それができないってことは,つまりプログラ
ミング言語の基礎が理解できてないっていうことだよね.EoPLか,せめてSethi
の本でも読んで勉強してみてはどうだろうか.
>>862
プログラミング言語はプロのためだけにあるわけじゃなかろうに。
ってゆーか、862が言いたいのは
「二進数表記の機械語でも使ってろ。
セマンティクスさえ理解すれば使いこなせるはずだ。
それができないってことは基礎がダメダメってことだ。」
とも読める。
864デフォルトの名無しさん:01/12/01 02:32
>>863
862じゃないが、関数型言語は機械語と全く逆に高水準で使いやすいんでは?
それを機械語と同一視するのはあまりにこじつけが過ぎるような。
865デフォルトの名無しさん:01/12/01 02:38
なんで話がこじれてるのかわからん。
「Cで再帰だけで書け」と言ったヤツはいないように思うが。

関数型言語は末尾再帰がちゃんとループと同一視される。
だから再帰だけあればループも使える。Cはそうでないので、
ループ構文が(再帰と別に)必要。

だから逆だろ。「Cで再帰だけで書け」じゃなくて、「関数型言語には、
(primitiveとしての)ループ構文は不要(ライブラリで良い)。」

forを自分で定義する必要なんてない。SchemeでもMLでも最初から
(ライブラリとして)用意されてるから。それが「身体感覚」に合わなかったら
作れば? Cではできない贅沢だろ。新しいループ構文作るなんて。
>>860
その「身体感覚」なるものを「万人に通用する」とまで一般化して語るのはどうかと思うが。

大部分の人間が手続き型からプログラミングを学んだために、
他のパラダイムの言語を覚えるのに抵抗感を感じるのは良いとして、
例えば中学で一次関数を習うと同時に関数型言語も習ったとしたら、
事態は逆になっていたと思わないかな。

「原理」で言えば、コンピュータの原理(ノイマン型/プログラム内蔵方式/逐次実行)を
知らないと ASM/C/C++ なんかは使えないと思ったり。
>>866
プログラミング知らない中学生クラスにLisp教えたことがあるが、
別に再帰呼び出しに抵抗はないようだった。
やっぱり最初に教えるべき言語は函数型言語だよね。
手続き型は妥協の産物ということで理解するほうが
望ましいと思うんだけど。
869858:01/12/01 05:56
やっと、落ち着いてきたな。
OO派な私にとっては、関数型はある意味ライバル(?)なので
そのスレッドが荒れているのはライバルとしてふがいなく感じるんだよ。
だから、あんな書き方をしたんだ。
(まあ、うちのスレッドはどれも荒れまくりだがw)

SchemeなんかはSmalltalkからヒントを得たアクター理論を用いた
Plasmaを改良して作られたものなのに、関数型の考えになったりしてるけど、
なぜそうなったのかとか気になるしね

そういや、SmalltalkもSchemeも評価方法(インタプリタやコンパイラ)が
同一言語自身で作られているが、それが言語の柔軟性・拡張性を高めている気がする。
これは、まさに、アーキテクチャの再帰構造と言えるかもしれない。
870デフォルトの名無しさん:01/12/01 12:29
HewittのアクターがSmalltalkからヒントを得たってのはホントなの?
本質的に非同期な並列動作だし、継承なんて概念はないし、
全然違うものだと思うが。

似てるのはメッセージ・パッシングというキーワードだけでわ。
>>869
なんで関数型とOOが対立しないといけないのかな?
LispやSchemeはもちろんOOだし、Objecitve Haskellだって
あるのに。
関数型も結局手続きで実装するんだろ
>>872
部分的にはそうなんじゃない?
それがなにか?
手続き型の方がパフォーマンス良く実装できるに決まっている。
ところで関数型っなんだ?内部状態を持たないって事か?
すると、カウンタとかどうするんだ?
外部に記憶空間を持って手続きでやり取りするのか?
大体それじゃ諸機能の実装を副作用に頼る事になるだろ、
なんというか、無駄っぽい。
>>875
ただ単に、制御文だとか、命令だとかが関数で統一的に
表現されてるってだけでは。
877デフォルトの名無しさん:01/12/01 13:28
結局関数型というのは時間概念を無視した
中途半端な代物だということだ。そういう共時律的な概念に
基づいた言語も新しい物理学上のパラダイムシフトが無い限り
時間発展系の操作によって実装せざるを得ないのは、
時間の定義上当然であり、つまり我々の世界においては
今現在知られている限りでは手続きしかあり得ないのであって、
結局どちらが基本的手段であるかといわれれば当然手続きである。
878デフォルトの名無しさん :01/12/01 13:33
>>877
分かっている人だと期待して聞いてみよう。
論理学に時間概念を取り入れることはできるのですか?
879デフォルトの名無しさん:01/12/01 14:00
論理学では命題論理からファジー、様相論理などなど
様々な論理体系が見出されたが、これからも自然言語に含まれる
或は全く未知の論理体系の定式化が進むだろう。
そして時間概念取り入れの手がかりが様相論理にはある。
(今現在の研究がどの程度進んでいるのかは知らないが)

しかし、論理学におけるそのような議論は計算科学に
おいて必要不可欠ということは全く無く、
時間発展系の記述という点について言えば
数学でそれを記述する事は容易である。
確かに数学は論理以上を原理的に含むのではあるが
方法として数学を採用する事を躊躇する理由は何も無い。

実際計算科学は時間発展についてよく考察し、
さらには情報量に関するエレガントな理論を展開し、
その物理学との関連をこれもまた意味深に語っているではないか。
はい、不勉強でした。
逝ってきます
882デフォルトの名無しさん:01/12/01 14:24
>>877
関数型が時間概念を無視したってのはおかしいな。
例えば、リストがあったとしてそれには順番が
ついているのだから、時間的経過を表現してる
とも言える。
それに、あんた物理学上のパラダイムシフトが
必要とかいってるが、なんで物理学が出て来るんだよ。
883.:01/12/01 16:32
「時間」はデータですか?
それともプログラムですか?
LISPやSchemeならそのどちらにでもなりますか?
>>883
そういう議論って意味がわからない。
C言語で
a=1;
a++;
という文があったら、この二つは時間的に前後が決定されてる
から、時間がプログラムってことになるのか?
それならLISPも同じだよな。LISPの場合はプログラムがリスト
だから時間がデータとも言えるってことになるのか?

とりあえず、時間がどうのこうの言いはじめた877は一体
何が言いたかったんだろう。
877はブルーバックスでも読み始めた中学生だろ。
不勉強を認める賢さは持ち合わせてるみたいだから
厨房ではないが。
886デフォルトの名無しさん:01/12/01 18:10
いえいえデータ構造及びデータは少なくとも実在論的には
共時的に存在できるのですよ。
その操作に時間が必要なのです。それはもちろん因果律の
もとで行われるからです。この方向性のある順序尺度としての
時間の元で非可換な操作を並べたものがもちろん手続きです。
もちろん時間には間隔尺度としての側面もありますから
完全に物理概念を利用しているという訳ではありません。

ところで純粋な関数型は写像の合成で記述するという
数学的に非常に綺麗な構文をしていますが、
ここ(構文)にはもちろん時間概念はありません。
言ってみれば恒常的に成立する式を記述する形式で
プログラミングが成立します。

このような共時的実装は我々にとって為すすべも無く
結局手続きで実装する事になりますが、そこで
この形式(関数型)で時間順序を扱うには言語仕様を熟知した上で
副作用を利用する事になります。このことは
実用的プログラミングにおいて大変不利であると考えます。
共時的って・・・ソシュール?w
一般言語学抗議
ブルバキ派ってのもあったな。
レヴィ=ストロースと仲間たち。
あほくさ。
関数型言語の目指しているところを曲解して難癖つけているだけじゃん。

RDBの世界に正規化って概念があるよね。
導出値はフィールドに保持しないとかね。
超整理法でいうところの「ポケットを2つ以上持たない」ってアイデアだよ。

参照透過性を保証することで、デバッグが容易になる、
というアイデアの価値は普遍的なものでしょ。
もちろん、結局入力はどこからか与えられなければならないし、
出力もどこかに保存しなければならないから、そういう意味では
副作用はなくせないし、むしろそれは本質的なものでしょ。
ただ、そのプロセスにおいて、無用な副作用、本質的でない副作用は
排除するに越したことはないんじゃないの。
まあ、そんな小難しいこと考えなくてもさ、制御文も代入もブロックも
普通の関数も、全部関数っていう統一した形式だってだけで便利じゃない。

Lispなんかはそれをうまく利用して変数に何でも代入できたり、引数に
いろんなものを渡せたり、同一のルーチンがいろんなものに作用したり
するよね。
そういうところが利点じゃないかな。
>>891
>変数に何でも代入できたり、
>引数にいろんなものを渡せたり、
>同一のルーチンがいろんなものに作用したり
そこから Smalltalk の型無し変数や、
Eiffel の総称(あるいは STL や GenericJava) という流れに続いてるのだしね。
そのものが*実用的*じゃないにしてもフィードバックは必ずある。
893デフォルトの名無しさん:01/12/01 21:39
ええもちろん向き不向きがあるのは当然です。
人にとってどれだけ使い易いかも重要でしょう。
量子計算機の新しいユニークなアルゴリズムが
なかなか提案されない現状を見ても直感的な概念での
言語構築がその普及の鍵を握っていると言えるでしょう。
手続き型は我々の日常に近いという点でその条件を満たしていると
考えられます。
しかし真の関数型はそもそも実現されないのではないでしょうか?
現在のそのような言語は機能を持たせるのに実装依存の副作用を
利用せざるを得ないため、その動作を覚えるには言語の
実装を知る事が必要不可欠ですし、その結果ほとんどの人は
頭の中で手続きを考えながら関数風に記述しているだけに思えます。
実装したい機能が時間依存するものである以上どうにもならない様に
見えますが、ここをクリアできない限り関数風手続き型の域を
でないでしょう。
これから先のブレークスルーに期待します。
894デフォルトの名無しさん:01/12/01 22:06
話はそれるけどLispかschemeで作られたRDBって無い?
RDBはRDBで理論化されてるんで何で実装されていようが関係なくない?
896デフォルトの名無しさん:01/12/01 23:15
mitのサイトにあったよ>894
897894:01/12/02 01:14
(select (col1 col2) (from table1) (where (eq col1 '逝って良し)))
みたいなSQL構文きぼん
>>896
MITってことはSICP?
898デフォルトの名無しさん:01/12/02 01:16
時間って結局「順序」のことだろ。
monad使えば順序は表現できるのでは。
899858:01/12/02 01:50
>>871
ん〜、対立概念ではないが同一概念でもない
これが、完全な対立概念ならどんなに分かりやすかったことか…
手続型も関数型もOOも同じ土俵で戦うからこそライバルになり得る
また、同一概念でないからこそ名前で区別される
実装として妥協的に共存できるかもしれないが、
概念としての共存は難しい

…ただし、それぞれの概念を完全には理解できていないので
(つまり、定義しろと言われてもできないので)
もしかしたら、共存できる概念なのかもしれない
900858:01/12/02 02:01
>>891
Lispの利点はリスト形式ですべてを表現できること、この1点に尽きると思います
これはあまりに、あまりに強力です
例えば、OOにおけるオブジェクトの重要な要素に
 識別性・状態・操作
があるけど、これを表現するには
 (識別性 状態 操作)
みたいにスペースで区切って、括弧をつけるだけ…
なんとシンプルで強力なのでしょう
901858:01/12/02 02:04
>>900
付け足して言うこともないと思うが、
手続型・関数型・OOの互いの実装言語を用いて
互いの概念を表現する事は可能である
まわりくどいし、概念にまぎれはあるが…
902858:01/12/02 02:20
関数型の時間概念がどうのこうのってのは、SICPで見かけた記述だな
状態変化に関して
The central issue lurking beneath the complexity of state,
sameness, and change is that by introducing assignment
we are forced to admit time into our computational models.
Before we introduced assignment, all our programs were timeless,
in the sense that any expression that has a value always has the same value.
と書かれていて、また、並列性に関して
The basic phenomenon here is that synchronizing different processes,
establishing shared state, or imposing an order on events requires
communication among the processes.
In essence, any notion of time in concurrency control
must be intimately tied to communication.
と書かれてあった
>>893
> 実装を知る事が必要不可欠ですし、その結果ほとんどの人は
> 頭の中で手続きを考えながら関数風に記述しているだけに思えます。

それでいいと思うけど。何が問題なの?
>>893
あと、副作用を持たざるを得ないといってるけど、
副作用を持たない言語もあるよ。
905デフォルトの名無しさん:01/12/02 02:54
ええもちろん向き不向きがあるのは当然です。
人にとってどれだけ使い易いかも重要でしょう。
人工知能の新しいユニークなアルゴリズムが
なかなか提案されない現状を見ても数学的な概念での
言語構築がその普及の鍵を握っていると言えるでしょう。
関数型は数学の概念に近いという点でその条件を満たしていると
考えられます。
しかし真の命令型はそもそも実現されないのではないでしょうか?
現在のそのような言語は機能を持たせるのに実装非依存の関数を
利用せざるを得ないため、その動作を覚えるには言語の
関数概念を知る事が必要不可欠ですし、その結果ほとんどの人は
頭の中で関数作用を考えながら命令風に記述しているだけに思えます。
実装したい機能が正確で複雑なものである以上どうにもならない様に
見えますが、ここをクリアできない限り命令風関数型の域を
でないでしょう。
これから先のブレークスルーに期待します。
906デフォルトの名無しさん:01/12/02 04:23
>>893
手続き型が日常に近いとは全く思わない。そういう発想にはちょっとびっくりだ。
また、いずれにせよプログラミングは日常的な思考とはかなり異なると思う。
「関数」は日常の用語に無いが「手順」はあるな(w
副作用史上主義の究極の手続き型=HSP
作用至上主義の究極の関数型=Haskell

これが全てを物語っているだろう。(w
909デフォルトの名無しさん:01/12/02 04:33
>>907
そもそも手順が関数と相容れないと考えるのが間違ってる。
関数は手順をまとめたものだ。
910中庸な名無しさん:01/12/02 04:34
>908
何事もほどほどに、ということか?(藁
>関数は手順をまとめたものだ。
Cに毒されたか?
912デフォルトの名無しさん :01/12/02 04:36
関数とはオブジェクトなんですか?
関数型言語では。
>>911
そういう一面もある。f(x)=2x+1だとすれば、xに2をかけた後
1を加えるという手順をまとめたものだ。
912です。訂正
オブジェクトといっても狭い意味でのものじゃないです。
>>913
数学知らんのか?
それとも計算機中毒か(w
>>913
それはイコールと代入の区別がついていないような気がするけど。
>>912
オブジェクト指向のオブジェクトとは少し違う
と思うけど、変数に代入したり値と同等に扱う
ことができるということならそういう言語が
多いね。
918デフォルトの名無しさん:01/12/02 04:40
>>915
はあ?何がおかしいのか言ってみろ。
>>916
ついてるぞ。
f(x)=xはどういう手順なんだ?(w
f(x)=1ならどうよ
>>919
言うに事欠いてそれかよ。(プ
数学の定義を持ち出して反論してくるかと思って
身構えた俺がバカだった。(w
レベルが低くて話にならんな。ただの煽りか。
「関数は手順をまとめたもの」は破綻したな(w
>>921
別に破綻してないが?(w
それに今の議論とは関係ないがそういう一面もあるだけだしな。
>>922
自分だけの考えに固執してもしょうがないぞ(w
だいたい、f(x)=xに手順が無いと思ってるのか?
無いとして、例外一つ挙げただけで「そういう
一面もある」が破綻かい?(w
>>923
お前がな。
f(x)=2x+1を手順と思っている時点で痛いんだがな(w
>>926
手順とは思ってないね。手順をまとめたという
側面で捕らえることもできるがね。(w
もうちょっと具体的に反論しろよ。
>>927
手順をまとめたという側面で捕らえる時点で痛いな(w
関数の定義は思い出せたかね(w
誰も厳密に関数=手順だとは言ってない。
関数は手順をまとめたものということも
できると言うことだ。
数学的定義でなく「日常的な感覚」でな。(w
関数は関数で数学という言語を使っているからねえ。

関数→手続き変換(似非言語)
f(x) = x * 2 + 1
f(x) : {|x * 2 + 1| x=[-∞,+∞] }

def f(x); x * 2 + 1; fed
for x in -INFINITY to INIFINITY; f(x); rof

関数は定義であって処理じゃあないんだよね。
C 言語まんせーな俺としては関数型言語で
どこまで C のプログラムなどが置き換え可能か(意味や意義はともかく)興味深い。
>>928
お前は言語障害ありか?
痛いとしか言えんのか。
理由を説明する能力が無いのかね?(w
>関数は手順をまとめたものということも
>できると言うことだ

できない(w
933三村:01/12/02 05:01
おまえら小学生かよ!
>>930
ていうか、関数は処理だとも言ってないし
定義には手順も含まれる。
演算子には適用の優先順位がある。
ま、でも処理とも言えると思うが。
>>932
なんで?(w
>>932
捕らえ方によっては手順と言えるだろ。
他人の捕らえ方をお前がとやかく言えないぞ。
>>935
できるならやってみな(w
>>937
お前やっぱ言語障害だ。
説明がさっぱり出来ないみたいだな。
>>938
まだ分からんのか(w
やってみりゃ分かる(w
>>939
f(x)=2x+1
xに2をかけて1を足した。
手順と言えますな。(プ
>>934
了解。
が、単純に手順をまとめたものじゃあないと思う。
少なくとも文面そのままは手順ではない。

あ、逆にいえば手続きは副作用の許される関数であるといえるのか(w
>>940
それで全部か(w
>>941
まあ誰も単純に「手順をまとめたもの」が関数の全て
を完璧に表すとは言ってないんだけどね。
>>943
>関数は手順をまとめたものだ。
の一行だけだとそう取られてもしかたないような…
「〜ものと言える」 のような表現ならともかく。
>>944
確かにそれは簡単に略して言いすぎたので、913でフォローしたんだけどね。
「そういう一面もある」と。
946デフォルトの名無しさん:01/12/02 06:15
>>907
functionは日常の用語だよ。少なくともprocedureよりはずっと良く使う。
functionって機能やね。procedureは機械の利用手順とか
そんなときに見るね。
948デフォルトの名無しさん:01/12/02 17:46
なんかレベル落ちたな…。
関数型と手続き型のもっとも大きな違いは、
副作用の有無なんだけど。
手続き型では副作用などとは言わない
>>948
関数型とかいいつつ副作用が有る言語が関数型の主流の
くせして良くそんなことが言えるな。
951デフォルトの名無しさん:01/12/02 22:41
関数型の特徴は、
メソッドとデータの区別をなくす方向に行ってることだろう。
ある意味OOと逆。
952デフォルトの名無しさん:01/12/02 23:20
>>949
C言語の前置/後置インクリメントなんかは
「副作用」という概念丸出しですが?
>>952
すべて意図通り
954デフォルトの名無しさん:01/12/03 00:31
?
>>951
逆じゃないよ。C#のデリゲートなんて、メソッド
をデータとして扱う典型例じゃん。
956858:01/12/03 05:01
>>951,955
非常に微妙な問題だが、私の解釈では少し違う。
まず、純粋なオブジェクト指向では、メソッドもデータも単独で存在する事はあり得ない。
 (define オブジェクト '(識別子 データ メソッド))
という感じになるが、この中のデータもまたオブジェクトになっている。
(こういう定義は、難しいねぇ。
 再帰は再帰によって定義されるからね。)

データとメソッドをいっしょにしたオブジェクトを扱うのが、OOで
データとメソッドを区別しつつ扱いが同等なのが、関数型。
逆とも言えないが、同じとも言えない。
微妙な関係だ…。

あと、C#のデリゲートはCで言うところの関数ポインタにあたるが、
主にイベント処理を扱うために考案されているので、
そのメソッドだけを取り出して、どうこうするのはC#らしくないかもしれない。
また、これはデザパタで言うところの、マルチキャストパターンにあたる。
http://objectclub.esm.co.jp/evolutionalDesignWithPatterns/index.html
あほくさ。例えばCLOSでOOが出来る。
それで十分だろ。
実用とかけ離れた抽象的議論はくだらねぇよ。
958.:01/12/03 09:14
CLOSは実用的ですか
>>955,956
- ある意味 - OOと逆。

一応ちゃんと読んでくれよな。
>>959
ある意味ってどういう意味だ?
それは意味のある議論なのか?
>>960
俺としては、お前がちゃんと読んだ上で
回答してくれればそれで良い。
今後は気をつけるように。
963960:01/12/03 13:42
>>962
誰かと人違いしないでくれ。
意味がわから無いかつ説明しないことなら書き込むなよ。
最近このスレでそうやって関数型言語を無理やり批判する人物を見かけるが、
全部同一人物か?
964デフォルトの名無しさん:01/12/03 13:46
えらそうにしてるけど,>>951は「ある意味」などと曖昧なことを書いて
技術的な議論する気はないわけだね.「メソッドとデータの区別をなくす」
という表現も意味不明.
965縞栗鼠(シマリス)の親方:01/12/03 13:48
中央高等学院の従業員「西部」が女子トイレに闖入し
汚物入れを物色して女子生徒の使用済みタンポン・ナプキン等を
個人的に収集しているというのは事実。
中央高等学院 http://chs-f.com/index.html 中央高等学院福岡校
http://www.chuo-school.ac/
966デフォルトの名無しさん:01/12/03 13:55
909とか948で関数型に関する主張がなされており、
それについて色々批判があったので、
他に考えられる関数型の特徴と言えば、
関数を他の関数の引数として使用できる、
つまり、それこそある意味関数が「値」でもあることなのでは
なかろうかと考えレスをしてみた。

>>964
>「メソッドとデータの区別をなくす」
>という表現も意味不明.

むしろえらそうなのはお前。
どの点が意味不明なんですか?
967960:01/12/03 13:58
>>966
まあ、俺はメソッドとデータの区別をなくすとかいう表現は
そんなことだろうと思ってた。
で、それがオブジェクト指向とどういう意味で逆なんだ?
詳しく説明してくれ。
説明しなきゃわからんことはちゃんと説明しないと意味が無い。
968デフォルトの名無しさん:01/12/03 14:33
OO言語では、その機能を十全たるものにするためには
しっかりしたクラス設計が欠かせないとされている。
そして、その際には、属性と方法を適切に弁別する作業が欠かせない。
つまり、「良い」OOからしてみると、
属性と方法が渾然一体となってしまうような状態は好ましいとはいえない。
一方で、関数型は、OO的に言うところの方法が
同時に属性でもあり得ることを奨励し、
そのことによってより抽象的なアルゴリズムを構築でき、
表現力が高まるとしている。
その意味においては、
両者は理想とする方向が逆なのではないかと思った。

>>964
ちゃんと説明しろよ。
どのように意味不明なのか。
>>968
使っている言語仕様において関数が値として扱えるからと
言って、属性と動作を混同するような人がいるとは思えない
んですが。
例えば、2という値とaddという関数を混同する人がいますか?
970デフォルトの名無しさん:01/12/03 14:54
>>969
そのことによって何が言いたいのかが不明。
いるとは思えないからなんですか?
971デフォルトの名無しさん:01/12/03 15:16
>>970
好ましくない状況では無いと言いたいんでは?
972デフォルトの名無しさん:01/12/03 16:20
すまん、益々意味がわからん。
もうちょっと噛み砕いて、というか、全部まとめて説明してくれ。
973デフォルトの名無しさん:01/12/03 16:23
1000
974デフォルトの名無しさん:01/12/03 22:57
そろそろ1000だけど次スレどうするよ
975デフォルトの名無しさん:01/12/03 23:00
次スレ
関数型言語Part2
http://pc.2ch.net/test/read.cgi/tech/1007387924/
976デフォルトの名無しさん:01/12/04 00:19
>>968
>そして、その際には、属性と方法を適切に弁別する作業が欠かせない。
>つまり、「良い」OOからしてみると、
>属性と方法が渾然一体となってしまうような状態は好ましいとはいえない。

EiffelはOOだけど属性と方法を弁別しないぞ〜

foo: INTEGER   -- 変数
foo: INTEGER is 10   -- 定数
foo: INTEGER is do 〜 end   -- 関数

Eiffelは外から変数に代入できないのでクラスの利用者には
どれで実装されていても関係ない。

proc(entity.foo)

entity.foo はクラスの利用者にはどういうふうに実装されているか分からない。

それに proc(f: FUNCTION [ANY, TUPLE, INTEGER]) is do 〜 end

みたいにすると関数を引数として渡せる。

Smalltalk も "block closure" あるし。
>>976
同意。っつーか、
OO言語で「方法」を抽象できないものがあるのなら、
それはOO言語として不完全だとすら言えると思うな。

そもそも関数型とOOは直交している概念だと思うのだがなあ。
>>977
直交する「関数型」軸と「OO」の間に何が来るだろ…
アセとかCOBOLとかになるのかな?
>>972
困らないから別にいいってだけじゃん。
そんなこともわからないなんてバカすぎ。
なるほど、
しかし、お前達の議論は俺の議論を曲解している。
俺は「ある意味」といっている。
ある意味とは、in some senseと言う意味であり、
部分的にそう言える場合があると言う意味だ。
従って読解力の点で馬鹿過ぎるのは>>979

また、直交することが
どうして部分的に逆であることと排他なのかがよく分からない。

ま、他にもいうことはあるが、機会があったらな。
そんなかんじで。
じゃな!
あっ、言いそびれたが、
やはり言語は実用されているものを例とすべきだ。
Eiffel等という正直に言って普及しているとは言いがたい言語を例とするのは、
例示としては頂けない。
現在の普及率などから考えて、C++やJavaなどを例示とすべきだ。
その手の議論は言語的な広がりがなくなる。
982メーテル:01/12/09 00:54
ここは旧スレ。
人は、旧スレになってから粋がる奴を厨房と呼ぶわ。
ghc5入れようとしたらかなりでかくて萎えた。

>>980
お前も下らない書き込みする前になんか使ってみろ
おれはこれからHaskellがどんなもんかやってみる。
それは仕方なかろう。
新スレにそのまま議論を持ちこめなさそうだし。
それにそんな長い内容ではないし、
いくつかレスできる分が空いてたのでここでいいかなと。
>>983
俺は病み上がりなんだよ。
書込みできなかったから今やってるんだよ。
>>985
病み上がりならマターリしてろよ(ワラ
>>979
困らないからいいじゃんなどと言う議論には意味がない。
というより、有害ですらある。
それは、今のプログラミングスタイルでも困らないから
OOはいらないといっている連中と同様の論法にたつものだ。
ソフトウェア工学であれ計算機科学であれ、
少しでもよいもの、望ましいものを目指すべきであり、
そのような延長線の中に関数型なりOOなりは位置付けられるべきだ。
その意味でもお前は明らかに馬鹿だ。
そんなこたぁない
目の前の仕事を片付けるだけのものが好きなら
それ、つかってりゃいいじゃん。なんでこんなところに
くるんだよw。
そんなこたぁない
991仕様書無しさん:01/12/09 01:49
くさかべみたいなやつは逝ってくれ
http://www.bagley.org/~doug/shootout/bench/hello/
こんなのみるとパフォーマンスは悪くないようだ。
>>992
なんで、よりによってHello Worldのページを選んだの?
いや、なんとなく。。
プログラミングはhelloworldからだし。。

ところで、
英語で書かれたよいチュートリアル知りませんか?
>>993
今hello worldコンパイルしてみたけど、
結構時間かかるんだね。ghcのversionは5.02。
>>995
素直にHugs使ったら?
>>996
勉強にはそっちの方がよかったかもね。
ちと、カコつけてしまった。こんな大きな
ものはどうせ使いこなせないだろうし。。

という訳で#apt-get install hugs開始w
hugsは軽くて勉強にはいいかも。

という訳でこのスレも終わりになりそうなので、
続きはHaskellスレにて質問させてください。
どうもありがとう。
Haskell萬歳ヽ(´ー`)ノ
10001000:01/12/09 03:03
Haskellマンセーヽ(`Д´)ノ
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。