関数型言語
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
NGNG関数型言語について話し合いましょう
0002デフォルトの名無しさん
NGNG0003デフォルトの名無しさん
NGNG関数の組合せによって形成していく言語
変数への代入が無い。
でもLISPやSchemeなどでは見かけ上、ローカル変数が使えます。
0004デフォルトの名無しさん
NGNGttp://www.icsd2.tj.chiba-u.ac.jp/oldmember/shimoda/node1.html
0005デフォルトの名無しさん
NGNG0006デフォルトの名無しさん
NGNGOcamlも論外。
0007デフォルトの名無しさん
NGNG基本的にプログラムって状態を変化させるものでしょ。Haskellみたいに
purityを保ちながら、今っぽいGUIとかネットワークのプログラムを書く
のは少しこじつけが必要になってくる。
でも、Haskell大好きよ。GHC-5.0リリース万歳!
0008デフォルトの名無しさん
NGNG0009デフォルトの名無しさん
NGNGを盛り込んでいて、大規模な開発にも使えそうだと思っている
のですが、実際にはどうなんでしょうか。Haskellで大きなプロ
グラムを組んだことがある人、意外な欠点などがあったら教えて
ください。
0010デフォルトの名無しさん
NGNGまあ、やりゃぁできんだろけど、向いてる?
0011デフォルトの名無しさん
NGNG0012デフォルトの名無しさん
NGNG状態のかたまりであるOOPばっかりやってきたもんで、
ものすごくカルチャーショックです。
どういう風になってるんだろう???
0013デフォルトの名無しさん
NGNG0014>12
NGNGなので状態は作れる。
0015>12
NGNG0016デフォルトの名無しさん
NGNG関数型プログラミングになるってこと?
単に手続き型を制限しただけ?
いまいち利点がわからないな
0017デフォルトの名無しさん
NGNG俺もよくわかってないけど
君の言ってる事はなんか違うと思う。
つか、いっぺん触ってみれ。
したら利点がわかるよ。
0018デフォルトの名無しさん
NGNG純粋に関数型な部分については、引数と関数が定まると、出力(戻り値)が
定まるので、たとえば遅延評価(webで牽いてね)なんかができる。
そうして遅延評価をベースにして、ほかの言語ではコルーチンを使う
ような処理が、ごく自然なアルゴリズムとして記述できるようになったりする。
0019デフォルトの名無しさん
NGNG無限リストをかえす関数なんてのは、それだけじゃ停止性も
ないわけだし。
まあ、制御構造を書かなくていいので、自然に記述できる(こともある)
ってのがうりだね。
&& の shortcutが言語のすべてに行き渡ったような。
0020デフォルトの名無しさん
NGNG0021デフォルトの名無しさん
NGNG0022デフォルトの名無しさん
NGNGインターナルイテレーターが自然に書けるのも利点?
002312
NGNGうう。そういや「リスト遊び」も読んだんだっけか。
でも表面的なことはさとえき
やっぱり関数型言語のキモって奴は全然判れなかった(T_T)
>関数の引数に対しての代入
うーむ。わからぬー(T_T)
状態の純粋な器としての変数、が無いということでしょうか?
#だとすると、状態の安息地を求めてOOPに至った俺としては、ちょっと…
0024デフォルトの名無しさん
NGNG状態とかはあまり関係ない話なんでは?
0025デフォルトの名無しさん
NGNGではどうしているかというと、mainルーチンを現在の計算機の状態をうけとり
新しい計算機の状態を返す関数だと考えることで回避しています。
>23 正解です。
>24 でも、現実のプログラムでは状態を扱うと考えた方が自然な問題もあると思う。
0026デフォルトの名無しさん
NGNGR.バード、P.ワドラー共著、武市正人訳「関数プログラミング」
か?
http://www.sampou.org/haskell/ にある易しい Haskell入門はどうかな。
0027デフォルトの名無しさん
NGNG日本語でおねがいします
002812
NGNGココでいうのもなんなんですが、
ガッコで習った算数/数学でピンとこなくて
一方プログラミング(といっても手続き系言語ばかり)で
ピンと来たのが、「状態」の有無なんですよね…。
ところでさらに。自分も使ったことがあるわけじゃない
んですが(笑)、もしかして関数型言語って
アナログコンピュータに似ていますか?
アナログだとデジタルと違って状態の記憶はプリミティブにやれないし、
たしか微分とか発振とかの演算をする部品を
FunctionGeneratorとか呼ぶんでしたよね。
で、あるFunctionの出力を別のFunctionに(配線で)突っ込むことで
計算を行うわけで。似てませんか?
Haskellの日本語な頁はどっかで見たような記憶が。
全然判らなかったのは相変わらずですが(T_T)。
検索したら出てくるんじゃないかなあ。
#最近はGoogleかな…
0029デフォルトの名無しさん
NGNG誰かなんか関数型言語で解く問題きぼんぬ。
0030デフォルトの名無しさん
NGNG関数型言語ならでは、ってやつですか?
自分はちょっと思いつかないです。
とりあえず違う切り口で。
・平均値を求める関数
(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ですが、ローカル変数は使ってないです。
このコードは関数型言語に乗っ取った記述と言えるでしょうか?
003130
NGNG(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))]
003230
NGNG(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;
}
003330
NGNGint average(int *list int len) {
if (!len) return 0;
return average_rec(0, len, list) / len;
}
0034デフォルトの名無しさん
NGNG(/ (apply + l) (length l)))
反則?
003530
NGNGint 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;
}
・・何が言いたかったのか判らなくなってきた。もう寝ます。
0036デフォルトの名無しさん
NGNGあまり意味無いよね。
副作用の例外を認めてもいいんじゃないかな。
0038デフォルトの名無しさん
NGNG(/ (apply '+ l) (length l)))
(average '(1 2 3 4))
=>5/2
0039デフォルトの名無しさん
NGNG逆にOOPはすべてが「振る舞う」ものとして考えることも出来るようだよ。
Behaviorismというらしい。
0040デフォルトの名無しさん
NGNGのメリットはなんなのかなぁ−。わかるひと教えて。
あと、OcamlやSML,Schemeとかは副作用を認めてるよね。
ホントに副作用がないようにしてるのはHaskellとCleanだけ。
全てを関数としてみるのも不自然だし、全てを手続きとしてみるのも
不自然だと思う。
でも, Haskellまんせ−
0041デフォルトの名無しさん
NGNGつーか、振舞うだけなら他の言語形態でもたいてい
(語弊?)出来るんで、それはまたちょっと傍論かと。
OOPの味噌は細胞膜を作ったことでしょう。
ソレの内部と外部を規定するという。
どうなんでしょう?
関数って、それ自体には内も外もないんじゃないでしょうか?
ところでLispってListProcessorでしたよね。
List自体は変数と大差無いものであるように
思えたんですが、それでも関数型というのでしょうか?
0042デフォルトの名無しさん
NGNGあと、Haskellなんかはグローバルな(手続き型言語のような)変数
はない。
Listは変数とも見れるが、Lisperは基本的には破壊的代入をあまり
しないでプログラムを書くので関数型とも見れる。
0043デフォルトの名無しさん
NGNGMLでは型推論という方法でgc起動回数を抑えてるらしいんですが、
LISP/Schemeで、その型推論は可能でしょうか。
appendやreverseなんかで大量にセル消費するけど、
gcに(あまり)頼らずにセルを還元する様なアルゴリズムにならないかな。
0044デフォルトの名無しさん
NGNGLisp, Schemeには型がないので型推論はできません。
0045デフォルトの名無しさん
NGNGよくわからんが(君の言ってることのせいじゃなく俺が馬鹿だからね)
MLの型推論は処理系がコンパイル時にって話で
LISP/Schemeじゃ無理なんじゃないでしょか。
004643>44-45
NGNG地道に関数の呼出し時にプロファイリングして不要になるセルを
チェックしていけば還元は結構できるかもしれないですね。
0047デフォルトの名無しさん
NGNG初耳だな。
0048デフォルトの名無しさん
NGNG変数の型と値の型の話かい?
ここでは変数の型についていっているよん。
0049デフォルトの名無しさん
NGNGという言いかたが正しいかな?
0050本論とは外れるが
NGNG0051デフォルトの名無しさん
NGNGでも、しょぼ関数型プログラマよりグレートなlisper
の方が多そうなのでいろいろ聞きたいです。
0052デフォルトの名無しさん
NGNGhttp://www.itu.dk/research/mlkit/kit2/readme.html
型推論じゃなくて effect inferenceとかいったような...
萌える理論である事はたしか。
0053デフォルトの名無しさん
NGNG厨房Lisp信者発見。
0054デフォルトの名無しさん
NGNG0055デフォルトの名無しさん
NGNGこれは曖昧な表現だと思います。
「変数にはどんな型のデータも入る」の方が良いかと。
つまりデータについての型は存在します。
(a . b) =>pair型(dot対)
(a) =>list型 (=> (a . '()))
a=>symbol型
#\a=>character型
"a"=>string型
#(〜)=>vector型
#t #f =>boolean型
(lambda ()〜)=>closure型
(call/cc 〜)=>継続型
など
変数として使えるのはsymbol型とpair,list型だけですが。
0056デフォルトの名無しさん
NGNGいうのが最近の呼び方かな。
0057デフォルトの名無しさん
NGNGもしかして昔は、データ(今風にいえばObject)に
(実行時)型情報も持たせるのは、コスト的に重いんで
メジャーな戦略ではなかった、のでしょうか?
つーても、卑近な意味でのジツヨー言語のことだけ考えても
この場合ショウガナイだろうしなあ。
0058デフォルトの名無しさん
NGNG>変数として使えるのはsymbol型とpair,list型だけですが。
vector型も追加だ(゚Д゚)
0059デフォルトの名無しさん
NGNGそうともいえないだろうが >>57
そのころの Lispは、汎用言語とは考えられてなかったかも知れぬが。
型なし言語(BCPLとか?) はそもそも「型なし」と形容する必要さえ
認識されてなかった、というのが俺の邪推。
0060デフォルトの名無しさん
NGNG55にあがってるのはみんな一級の値(First class value)だから
代入とかはできるはずだが。
後 number型がないな >>55
0062デフォルトの名無しさん
NGNGOCamlとかSMLは副作用を認めてると言うより(多少は認めてるけど)
型推論を可能にしつつreferenceを表せるような
強力な型理論を頑張って作ったんだよね。
だからwhileループなんかが関数型の枠組みのなかで表現できる。
006360
NGNG(define #(a) 1) なんてできないよな?
(define (a b) ...) だって
(define a (lambda (b) ...)) のsyntactic sugarに過ぎないし。
∴変数として使えるのは symbolにきまっとる。
0064>63
NGNGvector-set!とか忘れてません?
(define vec (vector 'a 'b)) ;=> vec
(vector-set! vec 0 'c) ;=> #(c b)
vec
=> #(c b)
0065>63
NGNG(define lis (list 'a 'b)) ;=> lis
(set-car! lis 'c) ;=> (c b)
lis
=>(c b)
0066>63
NGNG失礼しました。
0067デフォルトの名無しさん
NGNG「名前で参照」可能にするための物で、
変数としても見れるけど、意味が少し異なる。
006867
NGNG変数→入れ物のまちがい。
変数って用語は「名前」を前提にしないと意味不明なので。
よってsymbolは変数、
list/vector/pairなどは入れ物。
って解釈で良い?
006967
NGNG007067
NGNG(lambda〜
(let〜
なんかも入れ物の内に入るのか。
(lambda〜) ;=>closueの入れ物
(let〜) ;=>環境の入れ物
007167
NGNG(define s
(let ((x 300))
(lambda (param)
(list-ref (current-environment) param))))
とした時、
(s 0)
=> ((param . 0))
(s 1)
=> ((x . 300))
が返るわけだ。
007267
NGNG(s 1)
=> ((x . 100))
だんだんわかってきました。
0074デフォルトの名無しさん
NGNGリスト構造の物を扱うときは、Cでもリカーシブで
プログラムつくるけど、そうすると引き継いだやつから
こんなプログラム書いていいんですか、といわれる。
理解できないだって。
0075デフォルトの名無しさん
NGNG変数はどうやっても defineで定義するか lambdaで導入するもの。
0076デフォルトの名無しさん
NGNG数学でも再帰のほうがよく使われるし。
Fortranからの悪しき伝統だと思いたい。
#でもやぱり末尾再帰できる形にコードを変換するのは
#面倒だったり
0077デフォルトの名無しさん
NGNG再帰を難しいと思って(思い込んで)いるかどうか?が、
そいつの頭悪い度&プログラマ不向き度(笑)を計る
1つのバロメータだと思われ。
でも
>#でもやぱり末尾再帰できる形にコードを変換するのは
なんかそんなことをわざわざする(しないとならない)
ってのは本末転倒だなとも思う。
0078デフォルトの名無しさん
NGNG末尾再帰はテンプレートとして覚えれば良いと思う。
↓は末尾再帰
末尾再帰でスタックフレームを生成しない処理系ならばwhile(rest)と同じ。
func(rest) {
return (rest) func(rest - 1) : rest; }
こっちは普通の再帰。+restのせいでスタックフレームが生成される。
func(rest) {
return (rest) func(rest - 1) + rest : rest; }
0079デフォルトの名無しさん
NGNG0080デフォルトの名無しさん
NGNG代入は副作用だそうですが、なぜ関数型言語での代入に相当するような
動作は副作用ではないとされているのですか?
0081デフォルトの名無しさん
NGNGどの事いってるの?
もうちょっと具体的に。
008280
NGNG例えば、a=1;という文があったとき、これはどう見ても代入に
しか見えないのですが、なぜこれは関数型言語では副作用では
ないのですか?
常に新しい変数を作るからという解説は良く見かけますが、
それだとなぜ副作用にならないんですか?
0083デフォルトの名無しさん
NGNGどの言語ですか?>82
0084デフォルトの名無しさん
NGNGだから代入の無い関数型言語だろ。
0085デフォルトの名無しさん
NGNG代入じゃなくって定義だと思えば?
0086デフォルトの名無しさん
NGNG代入。って感じかな。Pascalの = と := の違いを思い出す。
ああ、スコープが別な aはもちろん別物として扱ってな。
っていうか、時間軸なんかなくて、本来すべて静的な定義として書くのが
関数型言語の理想。数学にも時間軸はないように。
でも対話的処理とか時間がからむものを書こうとすると
monadとかいって苦労するんだな、これが..
0087デフォルトの名無しさん
NGNGふーん。
ってことは、UMLでいう状態図とシーケンス図は
最も遠い存在ってことか…。
うーん。「数学に時間軸がない」こと自体が既に
(数学を)嫌なんで、やっぱりパスかな俺にとっては。
#でも、ほんとうに数学に時間軸無いの?
#時間軸ある数学だって当然だが構築可能だよね?だよね?
008880
NGNGそういう違いはわかるんだけど、だったら、
なんで定義の方は副作用じゃないんですか?
環境に新しい物を加えるのだから副作用じゃない
のですか?
0089デフォルトの名無しさん
NGNGまあ、それがゆえに実世界の問題のモデリングは面倒じゃ、
とは思えなくもない。
数学 (つーか論理学) にも時間が入ったのはあって、
様相論理ってのはその一つだな。◇や□が出てくる。
monadと様相論理が関係あったかどうかは忘れた。
monadと線形論理をからめた論文は見た気がするがな。
見ただけで読んでない。
0090>88
NGNG009180
NGNG状況によっては、動的に変数が増えていくことになりますよね?
だから、静的なあらかじめ記述された定義とは根本的に違うような
気がするんです。
009280
NGNG副作用と言わないのはなぜでしょうか?
環境は変化していると思いますし、値を返す以上のことを行っている
ように思えます。
0093某スレの1
NGNGScheme流に言えば、「定義」を「破壊」した時点で、
それはもはや「定義」とは見なせないとは思います。
(define a 1) => aは1、という定義。
(set! a 2) => aは1、という定義を破壊(消滅)し、
新たにaは2、という定義を作る。
=>これが変数。
const-defineなんて構文があったら都合がいいのかな?
0094デフォルトの名無しさん
NGNG実世界のモデリングという言い方にはいつも
ひっかかりを覚えるんだけど(^^;、
OOの立場(?)から言えば、
イデアだってメタクラスのインスタンス
でしかないんだよね。
形而上だからってOOのモデルで扱えない
って言いきることは無理なんで、まぁ…
009562
NGNG>>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でも代入に見える:=(だっけ?最近書いてないもんで)が
関数型の枠組みで正当化できる.
こういう変数があれば手続き型言語での
ループのカウンタ(ループを回る度に状態が変化する)に使えるので、
そういったループが関数型の枠組みで自然にかけるようになる.
こんなとこかな?
009662
NGNG時間がない、というのは要するにコンパイル時の静的な(つまり実行する前の)
プログラム解析(型チェックとか型推論とか)に意味を見いだしているから。
時間が入っているような動作も、95のようになんとかして
静的な解析が可能なように理論づけをしようとするわけ。
だから元々実行時のチェックが本質的な応用とはあまり相性がよくない。
それでも継続とかmonadとか使って頑張るわけだが、各monadの定義は
理論上メタレベルで行われる(論理で様相を自分で定義するようなもの)
のでまあ一種の反則ともいえる。
0097デフォルトの名無しさん
NGNG破壊的代入も環境モデルを使えば素直に理解できると思うが。
009862
NGNG80-84は副作用のない純粋な関数型言語の話だと思ったけど、違った?
MLは例に過ぎなくて、代入らしきことを副作用のない関数型の枠組みに
どのように取り込むかという話だと思って頂ければ幸いなり。
009962
NGNGちょこっと修正.
> こういうデータを扱えるように
こういうモデルで意味が与えられるように
> 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とは別の名前と考えることができることが保証されています.
よって本質的には代入ではないわけです.
0100>99
NGNGへ理屈というか、考え方が違うって事なんだろうけど。
とりあえずage
0101デフォルトの名無しさん
NGNG010262
NGNGそうですね,上の話でも現実には領域は有限だから,
実装では使わなくなった領域をせっせとGCで集めて再利用しています.
このように実装は理論の与える直観そのものでなくても
それと矛盾してなければよいわけですが,一方で良い実装が可能であることは
理論を考えるときでも重要なポイントになります.
あとユーザが理論をそれほどよく知らなくても使えることも重要です
(call/ccなんかはその点でちょっと苦しい).
ですからOCamlやMLの動作をユーザが代入による副作用と理解することが
おかしいと主張しているわけではありません.
ML系の場合,型推論という旨味も失いたくないので
副作用でない新たな理屈付けが必要だったわけですが,
それをユーザの方には参照型とかmutable/immutable(可変/不変)という
比較的理解しやすいと思われる見かけで提示しているわけです.
連休も終わったしそろそろこの話もおしまいかな.
0103デフォルトの名無しさん
NGNG代入を許すと型推論が出来なくなるのか?
0104デフォルトの名無しさん
NGNG正統的理論みたいに宣伝するなゴルァ!
強い型付けと代入の有無は本来直交した概念。
弱い型で代入がない純粋関数型言語ってのもありうるだろう。
まあ、実際代入があると型推論あたりで面倒なことが
起こった気はするがね。それの解決法が [62]だったような。
変数定義時よりも一般的な型が代入される可能性もあるわけだし。
010562
NGNG単に代入だけならいくらでも意味は付くけど,
静的で複雑な型が絡むと色々難しいねえ.
MLの型理論の場合は高階型や多相型などの豊かな型と
停止する型推論などの便利さが巧妙にバランスしているので,
なんとかそこから大きく外れずに解決したいというとこかな.
>> 104
おう、好きな言語をどんどん語ってくれぃ.
MLは適度にいい加減で汚いところがいいっす.
SML/NJは好きじゃないけど.
> 弱い型で代入がない純粋関数型言語ってのもありうるだろう。
もちろんっす.その場合も99後半の考え方は使える.
でもそういう言語はドメイン理論を使う方が説明しやすいな.
話の都合上,代入の話と型付きの話が混じってしまったのはスマソ.
さあ仕事仕事。
0106デフォルトの名無しさん
NGNG純粋な関数型言語と言っても代入を屁理屈で代入じゃないと
強弁してるだけじゃないの?
型推論のしやすさ等で実質的違いは無いと思うけど。
0107デフォルトの名無しさん
NGNGさっぱりわからん(鬱
010880
NGNG型システムを改良することでどうして代入が扱えるようになるんでしょうか?
さっぱりわかりません。
>Co-induction in relational semantics
この論文はネット上では公開されていないですね。
大学で探してみることにします。
>>99
でもxという名前と値のつながりを変更したことになりますよね?
名前と値のつながりは環境ではないのでしょうか?
0109デフォルトの名無しさん
NGNG変数がないぞ!!
αとか意味不明の記号が出てきてわけわかだけどな。
こっから辿れば、関数型言語における変数なんて、sytactic sugarに
すぎないと思えるもの。
0110デフォルトの名無しさん
NGNGsyntax sugarのことか?
ま、へ理屈だろ。
0111デフォルトの名無しさん
NGNG>でもxという名前と値のつながりを変更したことになりますよね?
変更じゃなくて、定義のスコープが変化して見掛け上、
上書きされたということでは?
(ちょっと違うかもしれないけど、考え方として)
静的なschemeのプログラムの継続をlambdaで表現すると
こんな感じになると思います。
ちなみにschemeの継続はプログラムが終るまで無限に続きます。
(lambda (x1 x)
...
(lambda (x2 y)
...
(lambda (x3 z x)
...
(lambda (xn) )))....)
で、x1x2x3の地点でそれぞれのxの定義は内部のlambdaによって
隠す事ができる。例えばx3のxとx1のxは同じ値を持ってる必要は
無いと。わかりにくいかな?
0112デフォルトの名無しさん
NGNG継続がどこからも参照されてないと証明できればその継続はgc時に
回収される。
(define x 'a)
...
(define x ())
の継続の変化を図にすると、
継続→
**************************************//****|プログラム終端
↑x=a ↑x=()
xは次回のgcで回収が見込める部分
*********xxxxxxxxxxxxxx**************//****|プログラム終端
↑x=a ↑x=()
0113デフォルトの名無しさん
NGNG正解
0114デフォルトの名無しさん
NGNG正しくは↑x=a から↑x=() の間がxxxx..です。
0115デフォルトの名無しさん
NGNGこれ、すごくわかりやすい。
関数型言語のイメージが掴めた様な気がします。ありがとう。
まだ型推論の意味が謎ですが。
0116デフォルトの名無しさん
NGNG新しいxを生成するのは副作用でない?
0117デフォルトの名無しさん
NGNG011862
NGNG私の書いていたことに関連する日本語での記述がありました.
コンピュータサイエンス入門 --- アルゴリズムとプログラミング言語
大堀淳,ジャック・ガリグ,西村進 著
岩波書店
の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)で
推論することにより解決しています.
(最大不動点と余帰納法は,無限プロセスなどの無限対象の
厳密な意味と同値性を与えるときによく使われる手法です.
無限のものは全部比較して同値判定するわけにはいかないから
普通の帰納法は使えない).
こう書くと多少はすっきりするかなあ。
011962
NGNG> >>99 で述べた変数を隠してしまう変換の極端な場合が
>>99 で述べた代入を隠してしまう変換の極端な場合が
> ある種の無限対象として必要がでてくるので,
ある種の無限対象として扱う必要がでてくるので,
0120デフォルトの名無しさん
NGNG型推論
val y = x+1;
+は両辺同じ型でなくてはなら無いのでxは整数型。
よってyも整数型と推論できる。
だから yの型を宣言する必要が無い。
fun z(x) = x;
とすると、xがどの型でも取りうると推論できるから、
関数z(x)は特定の型に捕らわれない関数宣言になる。
fun z(x:int) = x;
とすると、xはint型しか取らないようにできる。
このようにして、状況に応じて、型の限定を利用するのか
型無し言語のような柔軟性を持たせるのか、切り替える
ことができる。
0121デフォルトの名無しさん
NGNG0122デフォルトの名無しさん
NGNGという問いは、実はλ式とはなにか、置き換えとは何か、変数
(仮引数)とはなにか、という本質的問いにつながる大きな質問
なのですが、実際にはそこまで行かずとも通常の言語における
副作用は排除できているので問題なし、という捕らえ方でよい
んだよね?>学術系の人
(変数などの)項書き換え規則の「意味」や「解釈」をさらに後ろから
支える論理体系って、何かあるのだろうか。
0123デフォルトの名無しさん
NGNGならなかったりするだけで、本当は違いが無いってことだろ?
何が違うのさ?
0124デフォルトの名無しさん
NGNGなわけだけど、その「考え方の違い」というか記数法の
違いによって、ものごとを考える範囲や考え方が異なって
くる、ってとこに意味があるんじゃないの?
実際、ローマ数字のままで現代数学は発展しえたか、とか。
0125デフォルトの名無しさん
NGNGもちろんCのコンパイラは型推論なんてしてくれへんねん。
C++や型推論の使える(可能性がある)型無し言語より分が悪いの。
インライン化やオプチマイヅつーか、そこんとこで。
0126デフォルトの名無しさん
NGNGよって変数を定義するのを副作用というなら
関数の定義も副作用ということになる。
0127デフォルトの名無しさん
NGNG型推論の使える形無し言語って何だ?
型ありじゃないと型推論なんてありえんぞ。
0128デフォルトの名無しさん
NGNGそういう意味じゃない。
記数法に実質的違いがないだろ。
関数型言語のx=1だろうがC言語のx=1だろうが、
どれも同じだろ。
0129125>127
NGNGデータ型が1つでも指定されてれば型推論は可能なのねん。
決まったデータ型を返す関数からも、もちろん可能。
0130デフォルトの名無しさん
NGNGキャストしないと演算子が使えなくないか?
0131127
NGNGえ?変数の型を推論するのが型推論だろ?
0132デフォルトの名無しさん
NGNG関数の型も推論するよ。
0133127
NGNG0134デフォルトの名無しさん
NGNGワラタ
0136デフォルトの名無しさん
NGNG型チェックをするってプログラムを書けます。
関数定義がデータと同義なので、
定義自体をデータとして解析できるのです。
当然文法チェッカや型チェッカも作れます。
Cでいうlintが自分のプログラムと同じ階層で走る様な物です。
さらに、動的に部分コンパイルやインライン展開する事もできます。
Cでいうコンパイラが自分のプログラムと同じ階層で走る様な物です。
まさにlisp/scheme言語は誰もが憧れる夢の言語なのです。
0139125
NGNG0140デフォルトの名無しさん
NGNG014162
NGNG煽りにマジレスしておくと,夢の言語かどうかは別にして
私もLispの最大の特徴はquoteだと思っています.
これがレスになっていることは分かるよね?>136.
面白いのでこちらに挙げておこう.
http://www.shiro.dreamhost.com/scheme/trans/beating-the-averages-j.html
0142デフォルトの名無しさん
NGNG確かに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マンセー
0143デフォルトの名無しさん
NGNG管理職のためのハッカー 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
0144デフォルトの名無しさん
NGNG0145デフォルトの名無しさん
NGNG0146デフォルトの名無しさん
NGNG0147デフォルトの名無しさん
NGNG個人的にはHaskellのような気がする。
0148デフォルトの名無しさん
NGNGマイナーすぎて本とか全く見ないんですが。
0149英語わかりましぇん
NGNGhttp://www.amazon.co.jp/exec/obidos/ASIN/4756116418/qid%3D989507729/249-3155492-9933113
Haskellはないのかな?
http://www.amazon.co.jp/exec/obidos/search-handle-form/249-3155492-9933113
0150149
NGNGHaskellで検索してもないんだよね。
どうやって勉強したのでしょ?
0151デフォルトの名無しさん
NGNGhttp://www.haskell.org/tutorial
上の日本語訳
http://www.sampou.org/haskell/tutorial-j
0152デフォルトの名無しさん
NGNG少し読んでみたが、あんまりやさしい入門じゃない。
SchemeかMLの知識がないとだめだろ。
0154デフォルトの名無しさん
NGNG0155デフォルトの名無しさん
NGNGhaskellってMLに近いの?
>>1であがってるFPやMirrandaって話題出てないけど
どんな感じなの?
0156デフォルトの名無しさん
NGNGHaskell 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!
ほんまかいな? 論文へのリンクは切れてる。
0157デフォルトの名無しさん
NGNGHaskellはすごいって話?
C++は糞ってか?
つーか英語わかんねぇよ。
Haskellでは83行に10時間かかったの?
ああ鬱だ
015862
NGNGそういえば理論屋でないHaskellな人に聞きたいんだけど
モナドって分かりやすいと思いますか?どのように理解していますか?
元の理論を知っていればそれなりに納得できるだろうけど,
普通のプログラマにとっては取っ掛かりがなくて分かりにくいと思うんだけど.
個人的にはここが気になるのでちょっと最強の言語とは言えないなあ(あ,スレ違いか).
0159デフォルトの名無しさん
NGNGつまり、同じ問題出して一斉に解かせたら、
Haskellの場合、たったの83行のコードで問題を解決することができて、
10時間しか問題解決にかからなかったと言うことだろ。
Adaは767行で23時間。C++は1105行もかかったと。
つまりHaskellは凄すぎるってこと。
0160デフォルトの名無しさん
NGNG論文本体もここにあった。
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時間で終わらせてしまったという
結果もある。
0161デフォルトの名無しさん
NGNG論文のpsファイルをここからダウンロードできる。
http://www.ai.sri.com/~heller/Lisp/
アメリカ海軍が問題を提供し評価をしたようだが、論文の著者は
2人とも関数型言語の研究者で、特にPaul HudakはHaskell
コミュニティーの中心的な人物です。かなり眉唾か?
0162デフォルトの名無しさん
NGNG0163デフォルトの名無しさん
NGNGつーか、その二人目のやつが実際に問題解いたそうだ。
しかし、中心的な人物が学生に負けるとは…
0164163
NGNG問題解いたのはMarkの方だ。
0165デフォルトの名無しさん
NGNG>型チェックをするってプログラムを書けます。
わざわざ書かなあかんの?
0166デフォルトの名無しさん
NGNG0167デフォルトの名無しさん
NGNGそれにコンパイラがチェックしてくれるわけでもないなら
あまり意味が無い。
0168デフォルトの名無しさん
NGNG結果を報告する様にもできるぞ。>167
結局、環境リストと定義リストの探索だから、そんなに難しくはない。
変数(バインドされたシンボル)の使われ方を辿っていって、
外部データ表現(または構造)に辿り着く様であれば、それで変数の
型が特定する。
0169デフォルトの名無しさん
NGNGを列挙できる。
ちなみに型の特定は、処理系が用意している基本プリミティブや、
入出力の型が確定しているclosureからもできる。
0170デフォルトの名無しさん
NGNGML知ってる人はこのスレに何人かいる様だけど、
Haskellって皆無なんじゃ?
0171デフォルトの名無しさん
NGNG0172デフォルトの名無しさん
NGNG017362
NGNG型チェックは変数や対象の型が整合しているかどうかチェックすること.
型推論は型宣言が省かれた変数や対象の型を導くこと.
例えばCには型チェックはあるが型推論はない.
すべて明示的に型が宣言されているから.
それで単純な型だけならいいんだが,型システムを多相型に拡張しだすと
どちらについてもコンパイル時に行うには困ることが起こる.
例えば,ある種の多相型に部分型を導入すると
型チェックが止まらないケースが出てくるとか,
MLの型システムに普通にレコード型を導入したら
MLの型推論の意味での単一の型が決定できないケースが出てくるとか.
だから,もしオブジェクト指向のようなことができるように
型システムを拡張しようとするなら,そいつは全然簡単じゃない.
0174デフォルトの名無しさん
NGNGモナドはわかりずらいよね。
Introduction to functional programming using Haskell 2nd ed.
でべんきょした
0175デフォルトの名無しさん
NGNG関数型なる概念の定義の概略はここの皆さんの発言で
なんとなく判った気はします。
で、Lispって関数型言語だということになっているんですよねえ?
でも書籍「List遊び」を読んだ感じでは、(Emacs)Lispは
Listという「データ構造」をいじる言語である、という風に
読めちゃいました。それは明示的な状態(の一種)だと思う
のですが、すると関数型言語っぽくないということに
なるような気が…?
関数云々というよりも、関数もデータも全部Listと見なしてから
全てを考え始める、というノリに思えました。
(Emacs)Lispはたまたまそういう(関数型としては不純な)
言語であり、それは関数型の本質とは無関係だ、
ということでしょうか?
それともそれ以外のなんらかの意味なんでしょうか?
0176デフォルトの名無しさん
NGNGlistを弄るとは言っても、入力されたlistを
直接書き換える事では無いって事。
出力するリストはconsで生成するでしょ。
lispは破壊操作を行なわなければ関数型言語と同じ。
0177デフォルトの名無しさん
NGNG意味ねぇよ。
その間違った所が実行されきゃ間違った所がわからないだろ。
実行する前に、どこがおかしいか一目瞭然でわかる方が
遥かに良い。
0178デフォルトの名無しさん
NGNG「象牙の塔」
「砂上の楼閣」
0179デフォルトの名無しさん
NGNG○○ってすごいぜ。
□□できるし、
△△はあるし。
と各言語をまとめるとどんな感じになります?
例えば、
C++ってすごいぜ。
オブジェクト指向言語だし、
STLはあるし。
0180デフォルトの名無しさん
NGNG君のレスを眺めて思い浮かんだ言葉。
「食わず嫌い」
>>179
それぐらいのこと自分で勉強しろ。
0181デフォルトの名無しさん
NGNGhttp://www.shiro.dreamhost.com/scheme/trans/beating-the-averages-j.html
とか読んでみそ。
使える人が少ないから業務で使われたりしないだけで
ほんとは十分実用的。
0182デフォルトの名無しさん
NGNGVB厨はほっといたほうが良いかと思われ。
0183デフォルトの名無しさん
NGNG仕事以外でもSchemeやHaskellをいじって遊ぶのはほんとに楽
しい。それだけで十分だと思います。
0184デフォルトの名無しさん
NGNGVB厨かな?C++厨?
0185178=179
NGNG読んでもさっぱりわからないし、一体何故そんなに熱く語れるのか
是非知りたいので質問して見ました。
ちなみに>>107も僕です(鬱
0186デフォルトの名無しさん
NGNGとりあえずSICPの第1章だけでも読んでみてください。
http://sicp.arsdigita.org/text/sicp/
1章で関数型プログラミングの基礎を説明しています。言語はSchemeです。
0188178=179
NGNGさんきう。
紹介していただいたページのタイトル
'Building Abstractions with Procedures'
のうまい訳がわからずいきなり鬱に入ってますが、
とりあえず読みすすめてみます。
0189178=179
NGNG早く、'Satori'を体験して見たいなぁ。
では、またROMに戻るナリ。
0190デフォルトの名無しさん
NGNGML書籍読めば?
0191>189
NGNGちょっと古いせいか、マクロや継続の説明は無かったけど。
サンプルコードはMITのサイトにあった様な。
0192デフォルトの名無しさん
NGNGSICPはプログラミングの教科書であって、Schemeの解説書では
ないので、使っているSchemeの機能は限定されてますね。ちなみ
に第2版は1996年出版なのでそれほど古くはないと思います。
0193デフォルトの名無しさん
NGNG0194デフォルトの名無しさん
NGNG俺、Haskell5000行くらい。
0195デフォルトの名無しさん
NGNGlisp 昔は結構書いた(今はあんまり)
SML ちょびっと
scheme10kステップぐらい。
関数型言語として書いたのはその半分以下に落ち込むでしょう。
0196デフォルトの名無しさん
NGNG>>194
Haskellに憧れているのですが、どんなプログラムを作ったの
ですか。差し支えない程度に教えてください。
0197デフォルトの名無しさん
NGNGところで、MLってOOPはどうやるの?
クラスのかわりにモジュール使うの?
0198デフォルトの名無しさん
NGNGOOやる必要あるのか?
とりあえず Objective caml とかありますぞ。
0199デフォルトの名無しさん
NGNGに関数型プログラミングは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がでてきますね。
0200デフォルトの名無しさん
NGNGモジュールをクラスにしてファンクタを継承がわりに
するんじゃないか?
0201デフォルトの名無しさん
NGNG>197 関数型言語がOOPのスーパーセットだっていうのはきつくないか。
OCamlとかはやってるみたいだけど、俺は使ったことない。
俺の友達はやっぱり、関数型とオブジェクト指向って馴染まないと
言っていた。
0202デフォルトの名無しさん
NGNGHaskellやO'Camlにはクラスはちゃんとあるし。
何を根拠にそんなことを?
0203デフォルトの名無しさん
NGNGオブジェクト指向のクラスとは異なる。
どっちかと言うとJavaのinterfaceみたいなもの。
Ocamlはオブジェクト指向の要素をとりいれているが
これをつかった友達がしっくり来ないと言っていた。
(自分は使ったことがない)
少なくともHaskellでは状態がないのでOOPでのオブジェクト
は実現が苦しいし、皆が認識しているOOPのプログラミング
スタイルをHaskellのプログラミングスタイルに取り込むの
はきついと思ってるけど。
うーん。説明しづらい。
0204デフォルトの名無しさん
NGNG0205デフォルトの名無しさん
NGNG難しくない?
CとかRubyとかとは、好む人が本質的に違うような雰囲気。
0206デフォルトの名無しさん
NGNGどこかからのコピペでもいいです。
0207デフォルトの名無しさん
NGNGと考えていいですか?
0208デフォルトの名無しさん
NGNGqsort [] = []
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にしかない構文
0209デフォルトの名無しさん
NGNG考え方を変えなければいけないので、Cとかになれてしまっている
人で固執してしまっている人は嫌うんじゃないかな。
>207 そうです。そういった部品(関数)をつなぎ合わせてやっていく
のが関数型のプログラミングともいえるかなぁ。
0210デフォルトの名無しさん
NGNGHaskellでのクイックソート
qsort [] = []
qsort (x:xs) = qsort [a|a<-xs,a<=x] ++ [x] ++ qsort [a|a<-xs,a>x]
>>207
引数が同一なら必ず同じ値が関数から返される、というのが
参照透明性といって関数型プログラミングの基本です。Cでも
関数の使いまわしをしたい場合はそうするでしょう。
0211210
NGNG0212デフォルトの名無しさん
NGNG一瞬ネタかとも思ったが、
そう言われてみれば、状態を変化させないなら
状態を変化させる手続きより使いまわしが数段楽つーか安全
なのは確かなんですね。うーむ。
まぁ、だからといってその見かえりに
状態そのモノを放棄する度胸は、ちょっと…(^^;
OOPは状態を捨てずに救った言語スタイル。
0213デフォルトの名無しさん
NGNG実際は状態があるのと大差ない。
0214デフォルトの名無しさん
NGNGhaskellの質問スレが見つからなかったので。すみません。
実は今学校の課題で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乗を表示できません。
どなたか教えていただけませんか?
0216デフォルトの名無しさん
NGNG0217デフォルトの名無しさん
NGNG文章である以上ちゃんと書かないと伝わらないよ。
で、アンチ的な発言なんですか?
0218デフォルトの名無しさん
NGNGアンチ的なのかどうか分類できない発言を、勝手に
間違えてアンチに分類されるってことか?(藁
0220名無しさん
NGNG0221名無しさん
NGNG0222名無しさん
NGNG0223名無しさん
NGNG0224名無しさん
NGNG0225デフォルトの名無しさん
NGNG0226デフォルトの名無しさん
NGNG0227デフォルトの名無しさん
NGNG00:15〜00:19頃に上位20のスレが狙われた模様
0228デフォルトの名無しさん
NGNGそのさんざんあらわれたアンチは、本当にアンチだったんでしょうかね?(藁
0229デフォルトの名無しさん
NGNG0230デフォルトの名無しさん
NGNG0231デフォルトの名無しさん
NGNG0232デフォルトの名無しさん
NGNG副作用がないってことは関数型のほうがOOよりさらに再利用性が高いのかな?
OOPのライブラリとかって、結局大きい塊としてしか扱えないような気がするし。
0233デフォルトの名無しさん
NGNG高階関数もあるし。
0234デフォルトの名無しさん
NGNG考え方が解析しやすくなっただけだろ。
それはプログラムの見方の問題であって、言語の文法
は何ら変わってないだろ?
0235デフォルトの名無しさん
NGNG見通しが良いからかな?
>>234
基本的に制御構文の考え方ははほとんど変わりないです。
0236デフォルトの名無しさん
NGNGHaskellじゃ ifは組み込み構文じゃなくて、
単なる関数になってるよ。
0237デフォルトの名無しさん
NGNGseries a = [(a - 1%n, a + 1%n) | n <- pow2]
じゃだめ? >>214
先頭 nコが欲しいときは take n (series a)
0238デフォルトの名無しさん
NGNG0239デフォルトの名無しさん
NGNG関数だったらifの要である、分岐ロジックってどうやってるの?
0240デフォルトの名無しさん
NGNG0241デフォルトの名無しさん
NGNGいや、だから
if a then b else c
の
bやcには関数でどうやって分岐してるのか聞きたいんだけど。
0242デフォルトの名無しさん
NGNG0243デフォルトの名無しさん
NGNG0244デフォルトの名無しさん
NGNGパターンとかかなぁ。知らないけど。
0245デフォルトの名無しさん
NGNGCでいうところの関数ポインタ渡すんだよ。
0246デフォルトの名無しさん
NGNGんだんだ。Cで、
IF(int, (void*)(), (void*()));
って関数が書けるもんな。あれの延長だ。
あとは無名つーかInlineな関数(?)を書く機能が
Cにもし有れば、ノリも完全同じなことができたんだが…
0247デフォルトの名無しさん
NGNG> IF(int, (void*)(), (void*()));
これって、内部でif文使うだろ?
0248デフォルトの名無しさん
NGNG関数のポインタの話なんてしてねえだろ。
0249デフォルトの名無しさん
NGNG話の流れ読めてるか?
0250デフォルトの名無しさん
NGNG0251デフォルトの名無しさん
NGNG「 A ? B : C の三項演算子を関数化したようなもの」
といえばすんなり納得してくれると思う。
0252デフォルトの名無しさん
NGNG理解してないのはキミ。
↓これ。
>236 名前:デフォルトの名無しさん 投稿日:2001/05/20(日) 22:30
>>>234 なんで文法の話しになったんだかわかんないけど、
>Haskellじゃ ifは組み込み構文じゃなくて、
>単なる関数になってるよ。
「単なる関数」なら、どうやって定義してんだって話。
0253デフォルトの名無しさん
NGNGだから今、Cの話なんてしてないだろ。
haskellのifは>>236が言うには「単なる関数」らしいので、
それをhaskell自身でどうやって定義してるのか示せって言ってるの。
問題
if = [?]
[?]を埋めよ。
0254デフォルトの名無しさん
NGNG話をわかりやすくしようという意図だろ?
そういう目的なら別にCの話を持ち出したっていいだろ。
0255デフォルトの名無しさん
NGNG0256デフォルトの名無しさん
NGNGでもhaskellはパターンマッチがあるんだからifなんて必要なのか?
#Haskellはちょっとかじっただけなのでまったく自信無し
0257デフォルトの名無しさん
NGNGなんでここで、「Cを持ち出して比較する」必要があるわけ?
0258デフォルトの名無しさん
NGNGhaskellのifは関数だという。
でもその関数の定義は示せないらしい。
(示そうとする人が現れない)
>>256
>[?]は外部呼出しなんじゃ?
外部呼出しを「単なる関数」とはいいませんよ。
>ifなんて必要なのか?
そんなこと議論してません。
0259デフォルトの名無しさん
NGNG例えば、「関数である」ということを聞いて、「ほう、Cのあれと同じだな」と
思った人がいて、「CのIF()と同じようなもんさ」と発言する場合など。
その人は間違ってるかもしれないけどね。
0260デフォルトの名無しさん
NGNG0261デフォルトの名無しさん
NGNGhaskellでどう定義するかって話。
0262デフォルトの名無しさん
NGNG例え話を発言しちゃいかんのか?
0263問題
NGNGif = [?]
[?]を埋めよ。
0264デフォルトの名無しさん
NGNG0265デフォルトの名無しさん
NGNGなじぇ?WindowsAPIは単なる関数呼び出しでしょ?
>ifなんて必要なのか?
>そんなこと議論してません。
まあそうだけど、パターンマッチてのはswitch見たいなもんだから、
・・・ってヨーク考えればパターンマッチ使えばifも実装できるね。
#しつこいようだが自信無し
0266デフォルトの名無しさん
NGNG>パターンマッチ使えばifも実装できるね。
だったらそれを示してくれ。
0267デフォルトの名無しさん
NGNG>なじぇ?WindowsAPIは単なる関数呼び出しでしょ?
なんでWindowsAPIの話になる。
WindowsAPIでif関数が定義できるのか?
0268デフォルトの名無しさん
NGNGif = [?]
haskellの言語機能のみを使って、関数ifの定義[?]を埋めよ。
0269デフォルトの名無しさん
NGNG0270デフォルトの名無しさん
NGNGでも話にはなってるだろ?
本人はC言語の例えで解決になってると思って発言してるのかもしれないし。
もう一回ログを読んで、話の流れを読めよ。
0271デフォルトの名無しさん
NGNG関数型言語を布教するのによい説明方法を話し合うのも
それなりに生産的な議論だとおもうんだけどな、、、、
果てしなく脱線する可能性が高いけど。
0272デフォルトの名無しさん
NGNGif自身の定義にifを使うのはナシね
0273デフォルトの名無しさん
NGNG| b == false = funcB
見たいな感じかなぁ。
#自信無し
0274デフォルトの名無しさん
NGNGいたけど、これもそんな解答になって欲しいなあ。
0275デフォルトの名無しさん
NGNGこの思い込みはどこからくるの?
ifが外部関数もしくはビルトイン関数であっても、制御構造ではなくて
関数であることには変わりはないと思うのだが。
0276デフォルトの名無しさん
NGNGありがとう。パターンってそういうことなのね。
でも結局if相当の事は行なうわけか・・
0277デフォルトの名無しさん
NGNG0278デフォルトの名無しさん
NGNG>外部関数もしくはビルトイン関数
0点。
0279デフォルトの名無しさん
NGNGTrue -> then
False -> else
0280デフォルトの名無しさん
NGNGなんで?
0281デフォルトの名無しさん
NGNGでも実際はthen elseは構文として間に入るから出来ないよ。
あくまでも概念
0282281
NGNGcase "cond" of | True = A
| False = B
のシンタックスシュガーでしょ?
0283244
NGNGfun if(true,a,b) = a
| if(false,a,b) = b;
で出来るなぁ。
0284デフォルトの名無しさん
NGNG0286デフォルトの名無しさん
NGNGiF :: Bool -> a -> a -> a
iF = \p -> \tHen -> \eLse -> case p of {True -> tHen; False -> eLse}
0288214
NGNG本当にたすかりました。
ていうか、先生が小声で早口でわかりにくいうえに
参考書も英語なんでかなりてこずってます・・・あう。
0289デフォルトの名無しさん
NGNG化石レスには引用付けて欲しいなあ・・
>>214 >>237 みたいに。
0290デフォルトの名無しさん
NGNG0291デフォルトの名無しさん
NGNGどーい。
0292デフォルトの名無しさん
NGNG相当偏差値高くない?
0293デフォルトの名無しさん
NGNGどうしたら良いの?
0294デフォルトの名無しさん
NGNGループでやるようなことをするのなら
takeWhile や dropWhile なんかを使うかなあ。
ループをリスト上の再帰にしてしまう。そういうことじゃない?
0295デフォルトの名無しさん
NGNGはっきりいってむずかしすぎて分からん。
相当頭のいい人が使うものと感じた。
そもそも型の再帰的定義からしてかなり難解。
ひとまずMLの資料を探してみることにします。
ていうか、言語よりはもっと本質的な理論が重要なように感じる。
0296デフォルトの名無しさん
NGNG0297デフォルトの名無しさん
NGNGHaskell より ML 方が難しいと思う人もいたりする。
0298デフォルトの名無しさん
NGNG構文が複雑すぎるように感じられる。
0299デフォルトの名無しさん
NGNGでも、Scheme に比べれば大抵の言語は複雑な構文だよね。
0300デフォルトの名無しさん
NGNG0301デフォルトの名無しさん
NGNG0302デフォルトの名無しさん
NGNG研究者が使ってる言語だからドキュメントがやたら難しい
言葉で書かれている。
複数の文を書く方法やfor、while相当の機能の説明が
ずいぶん後の方でちょろっとだけ出てきたりする。
その辺が必要以上に複雑だと思わせているんだと思う。
複雑なところと言ってもルールの組み合わせ方が複雑なん
じゃなくて、機能が豊富だから複雑になってる所がいい。
0303デフォルトの名無しさん
NGNG再帰を使うって事だけ知ってりゃ簡単だと思うが。
0304デフォルトの名無しさん
NGNG悩んだ後で、「あっそうか」に辿りつけるかどうか。
ちょこっと、アドバイス、記述があればなんてことないのだが、
それがないと敷居が高いと感じるひともいるかな。
0305デフォルトの名無しさん
NGNGいちいちfor、while相当のことをさせるのに関数を作らなきゃ
ならんってことか?
なんて不便な言語だ。
0306デフォルトの名無しさん
NGNGおいおい。
関数型言語なんだし、関数作らなきゃ何もはじまりませんよ。
そもそも関数つくるのなんてそんな大変じゃないだろ?
むしろfor,whileよりすっきり、早く書けることのほうが多いんじゃないかな。
0307デフォルトの名無しさん
NGNGいちいちfor使うたびに新しい関数の名前考えなきゃならんのか?
そんな面倒なことやら無くちゃいけないぐらいなら、forが
はじめから定義してあった方が良いに決まってる。
俺だったら結局自分でfor関数定義して使うよ。
つーか、再帰すらわからないやつがいるというのに、
再帰の説明だけでforの代用に気付けといわんばかりの説明は
敷居が高いのは明らかだろ。
0308デフォルトの名無しさん
NGNG一々関数を定義するじゃなくて、
map とか foldr とかのリスト上の標準関数使うだけだと思うけど。
0309デフォルトの名無しさん
NGNGmapやfoldrは引数に関数を取る。
0310デフォルトの名無しさん
NGNGおれってドキュン?
0311デフォルトの名無しさん
NGNG0312デフォルトの名無しさん
NGNGスコープが変わるとだめですか?
なにのスコープがどう変わると、どうだめなんでしょう。
簡単な例題はないですか。
0313デフォルトの名無しさん
NGNG外側の変数が簡単につかえない。
0314デフォルトの名無しさん
NGNG純関数型なら assignment がないので問題ないような気がします。
0315デフォルトの名無しさん
NGNGハァ?なんで問題ないの?
0316デフォルトの名無しさん
NGNG私は 313 の意味を勘違いしてるみたい。
どういう意味なんでしょう。
0317315
NGNG出来るの?
0318315
NGNGものすごく使いにくいと思うけど。
0319デフォルトの名無しさん
NGNGHaskell なら
変数の参照については外側のスコープのものは参照可能
変数の値についてはいかなる場合も変更は不可能
です。
0320デフォルトの名無しさん
NGNG(define (for min max proc) …minからmaxまでカウンタ値を変えて手続きprocを適用する…)
のような関数を使ったときにproc内のスコープがどうなるか
わかってないんだろう。「関数型言語」でひとくくりにしている
ところも痛い。
0321デフォルトの名無しさん
NGNG0322デフォルトの名無しさん
NGNGそうそう、そういう所が本質的な議論をしているっていう感じがする。
HelloWorldから始まったりは決してしない、みたいな。
0324デフォルトの名無しさん
NGNG関数型言語の枠組で
Hello World を説明するのはあまりに難しいからじゃないかな。
0325某スレの226
NGNGあの様に、(マクロとしてですが)継続の部分を除けば、
C言語のfor/while/do〜whileも関数型言語の枠組みだけで実現できます。
用意されていないだけで、相当する処理は書ける事がお分かりになったでしょうか。
(break/continue/returnは継続の様な特殊な物が無いと難しいですけど。)
0326デフォルトの名無しさん
NGNGそこが関数型言語の良い所?
0327デフォルトの名無しさん
NGNG(defvar x 10)
(defun f (y)
(setq x (- x y)))
(f 3) => 7
(f 4) => 3
0328デフォルトの名無しさん
NGNG考え方が関数型になってない。
>(f 3) => 7
>(f 4) => 3
;以後、これはキモイと考えること。
0329デフォルトの名無しさん
NGNG複製を作る代入(宣言なら副作用は起こらない)はダサいとか
言ってたよ。(藁
0330デフォルトの名無しさん
NGNG> (define (for min max proc) …minからmaxまでカウンタ値を変えて手続きprocを適用する…)
> のような関数を使ったときにproc内のスコープがどうなるか
> わかってないのだろう
C言語とは違うのか?
0331デフォルトの名無しさん
NGNGモナドってやつですね。
0332デフォルトの名無しさん
NGNG0333デフォルトの名無しさん
NGNG関数型言語として使いたければ今すぐ代入の使用をやめなさい。
0334デフォルトの名無しさん
NGNG同じぐらい愚かだな。
0335デフォルトの名無しさん
NGNG0336デフォルトの名無しさん
NGNG代入が必要になるたびに新しい名前の変数を作るのか?
0337デフォルトの名無しさん
NGNG0338デフォルトの名無しさん
NGNGわからなかったら書けないだろ。
0339デフォルトの名無しさん
NGNGマニュアル読め
0340デフォルトの名無しさん
NGNGHaskell では計算をあまり操作的には考えないです。
プログラムは計算の手順の記述というよりは、値の関係記述の
ように書くという感じです。数学の等式を書くのに似てるかもしれません。
Haskell の変数は値についた名前という意味しかなく。値をいれるいれもので、
値の一時保管庫ではなく、値の出し入れという操作を記述するスタイルの
プログラムとは全然雰囲気の違うプログラムになります。
実行効率の上で代入(assignment)が欲しくなることはあるかも知れませんが、
なにかの値を計算するプログラムを書く上で代入が必要になることは
ないです。
0341デフォルトの名無しさん
NGNG0342デフォルトの名無しさん
NGNGつうか、何も情報になってねーよ。
結局の所「代入は使わないのです。」と言ってるだけだろ。
現象を説明してるだけで、全然理由になってない。
0343デフォルトの名無しさん
NGNGないのです...
なんでそんなに代入操作にこだわるかの理由を述べたほうがいいのでは
0344デフォルトの名無しさん
NGNG0345デフォルトの名無しさん
NGNGqsort [] = []
qsort (x:xs) = qsort [a|a<-xs,a<=x] ++ [x] ++ qsort [a|a<-xs,a>x]
このaやxって明らかに代入と一緒じゃん。
代入避けろとか言ってるけど、書き方変えてるだけじゃん。
0346デフォルトの名無しさん
NGNGみかけはともかくこれはλ束縛であって,いわゆる破壊的代入とはちがうよ
qsort(x:xs) = qsort (filter (\a -> a<=x) xs) ++[x]++ qsort (filter (\a -> a>x) xs)
0347デフォルトの名無しさん
NGNGHaskell では代入(assignment)は使わないではなくて、使えないです。
なので、代入を避ける必要はないです。
で、代入を使わなくて何故プログラムがかけるかは私には謎です。
でも、かなりの範囲(主観的ですけど)のプログラムは Haskell で書けます。
で、何故、何のために代入なしの関数型言語を作った人々がいたかですが
プログラムを実行せずにプログラムが正しいことが分かるような記述法が
欲しかったとかかなあ。
0348デフォルトの名無しさん
NGNG蛇足ですが。
OOPは全然違う方向からその問題に取り組んでる、と
妄想したがってる厨房なワタクシ。
実行文脈をObjectの存在とは切り離しちゃったので、
「走れ」というメソッドを呼ばない限り
(つまりそれ以外のメソッドだけを呼ぶ限り)
非破壊に検証できる、
というObject系を作る「ことができる」はず。
まぁ言語によって強制されていなくて
セマンティックなレベルだけの話なんで、
よわよわだけど。
「実行時」ってものは、そんなに忌避されるもんなのかなあ?
どっちかというと、実行時の使いやすさを向上させる仕組みを
考えるほうが良いようなきもするんですが…
0350デフォルトの名無しさん
NGNG破壊的代入というなら、Haskellの
a // [(i, v)] のような配列の更新はなんなんだ?
破壊的代入じゃないのか?
0351デフォルトの名無しさん
NGNG破壊的代入ではないです。
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 です。
0352デフォルトの名無しさん
NGNG0353デフォルトの名無しさん
NGNGスレ違い。ウザいぞ。
0354350
NGNGなるほど、要するに、更新された配列が右辺に現れるが、
その変化は長期的には反映されないという感じかな。
しかし、それでは、配列を変更したくなるたびに、新たな
配列を作らなくてはならない。
配列をデータとして蓄え、ユーザーの応答に応じてデータを
更新していくようなプログラムを作る場合、同一の配列に
データを保持しておくことができないから、問題があるのでは
ないか?
少なくとも俺にはこうしたプログラムをどうやって作るのかわ
からない。
例えその問題が解決したとしても、更新するたびに配列全体の
コピーが必要になるのではないか?
>>353
別にスレ違いじゃないと思うぞ。
0355346
NGNGその通り.ナイーブにやったのではとてもじゃないが実用にならない.
そこでHaskellなどでは,あくまで意味的には参照透明性を保った上で,
「変更前の配列」に見かけ上新たにアクセスできなくなるモナド(monad)
というメカニズムがある.意味的には純粋な関数型言語のまま,コンパ
イル結果は破壊的代入になっているような,そんな処理系が作れる.
実際,HaskellのコンパイラにはHaskell自体で書かれているものがある
が,テーブルや状態の管理にはモナドを用いて効率をよくしている.
モナドは配列や状態の表現の他に,例外処理や環境にも用いることが
できる.
0356346
NGNGと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 の解説論文でも読んでおいてくれー.
0357350
NGNG「破壊的な代入は持たないです。しかしモナドがあるのです。」
こういうのって、従来の言語と何ら変わっちゃいないように
思えるんだよな。
言語のパラダイムにあわせて、「機能の意味」が変わってる
だけ。機能の実態は変わってない。
関数型言語のパラダイムに合わせてプログラムの仕組みを
語る上では便利なのだろうが、それ以上の意味は無いように
思える。
0358デフォルトの名無しさん
NGNGCに goto文もあるから構造化プログラミングになってない、って
わけでもなくて。
Haskellにモナドがあっても、それなしでもかなりの部分を
くめるわけだし。
035962
NGNG同じことの繰り返しだけど、
単に語るだけじゃなくて厳密に解析するのに役立つの。
プログラムを厳密に解析するのに
理論的にクリアでないと困るのはわかるでしょう?
クリアでかつ従来の言語でできることを失わない
というのがまずは重要であって、モナドはその一つの解答。
もちろん従来の言語を超えることができればさらによし。
(個人的にはHaskellのモナドはわかりづらいとは思うけど)。
>>356
Moggiの元々の論文はカテゴリーの定義さえ知っていれば
結構わかりやすいと思う。例も多いし。
Wadlerの論文は理論を避けているせいでかえってわかりにくいと感じた。
Haskellのマニュアルとかではおどかし過ぎだと思うぞ。
0360350
NGNG思うんだが、やってることは従来と変わらないのならば、
モナドと言わずに破壊的代入だと言ってしまえばいい
じゃないか?
で、理論的に考える時だけ、破壊的代入と考えずに、関数型な
概念で考えればいい。
そういうやり方ならC言語だって関数型な考え方で捕らえる
ことができるわけだろ?
わざわざ理解困難にする必要はないと思うのだが。
0361デフォルトの名無しさん
NGNG計算機上で実行可能なものなのだから、そういう意味では従来のプログラム
とやっていることは変わらないと思います。
Haskell を使うのなら関数プログラミングの考えかたでプログラミング
するほうがいいと思いますが。。。
0362350
NGNG例えば、C言語でHaskellの考え方をすればいいんじゃないの?
破壊的代入が出てきたらHaskellのような別の概念だと考えて分析する。
モナドって良く知らないけど。
0363デフォルトの名無しさん
NGNGHaskellの弱点ってありますか?
ちなみに、弱点とは関係ないですけど、
fib n = fib (n-1) + fib (n-2)
って定義してフィボナッチ数列を計算すると、fib 100くらいで
すでに遅すぎなんですね。アルゴリズムの問題ですけど。
でも、漸化式の最適化くらい処理系的には簡単に出来そうですけどねえ。
やってまずい理由無いと思うし。
0364デフォルトの名無しさん
NGNGどの処理系ですか?
0365363
NGNG最新のHugs (Windows)です。
あと、便乗質問ですが、対話形式で使っているとき、
プロンプトで関数定義をするにはどうすればいいのでしょうか?
Prelude> f x = x * 2
とか入力しても「unexpected =」とかでて、うまくいきません。
0366デフォルトの名無しさん
NGNGHaskellでは実行環境も動的に変更することはできないので、
関数をHugsが立ち上がってからは追加できないのでは。
0367デフォルトの名無しさん
NGNGではどうするのですか?
0368デフォルトの名無しさん
NGNGファイルをエディタで編集して、ドロップするのが定石のようです。
0369デフォルトの名無しさん
NGNGソースを読んで解析とかじゃなくて、もっとセマンティカリー(?)
に解析することは出来ませんか?
0370デフォルトの名無しさん
NGNG一般論として、アルゴリズムの最適化が処理系にできるわけない。
しかし、その定義で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
です。
0371Haskellわからないのですが
NGNG> fib n = fib (n-1) + fib (n-2)
この関数って終わるの?
0372デフォルトの名無しさん
NGNG(let iter ((a 1) (b 0) (c n))
(if (= c 0) b (iter (+ a b) a (- c 1)))
))
0373>>371
NGNGfib 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.. ]
0374デフォルトの名無しさん
NGNGちなみに対数ステップで計算する方法
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)
0375デフォルトの名無しさん
NGNG良かったら C で書いてくれない?
(厳密なプログラムじゃなくていいから)
0376デフォルトの名無しさん
NGNG(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)))))
0377デフォルトの名無しさん
NGNGinteger 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));
}
0379デフォルトの名無しさん
NGNGif (c == 0) return b;
0380デフォルトの名無しさん
NGNG0382デフォルトの名無しさん
NGNGhttp://www.google.com/search?q=%83t%83B%83%7B%83i%83b%83%60%90%94%97%F1&btnG=Google+%8C%9F%8D%F5&hl=ja&lr=
0383デフォルトの名無しさん
NGNG#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;
}
0384デフォルトの名無しさん
NGNG関係ないけど、半角スペースが無視されていない
(インデントが崩れていない) のは何故?
0385test
NGNG0386test
NGNG0389デフォルトの名無しさん
NGNG0390デフォルトの名無しさん
NGNG0391デフォルトの名無しさん
NGNG0392デフォルトの名無しさん
NGNG0393デフォルトの名無しさん
NGNG0394デフォルトの名無しさん
NGNG悲しいヨ。紀伊国屋にもいったけれど、数冊しかないし・・。
というわけで、「プログラミング言語 SCHEME」をかってみました。
0395デフォルトの名無しさん
NGNGlisp系学習すんならschemeが(・∀・)イイ!ヨ
SICPも参照してね。
0396デフォルトの名無しさん
NGNG0397394
NGNG>>186で紹介されているやつですね。
とりあえずブックマークへ入れときました。
・・って、これは「計算機プログラムの構造と解釈」ですね。
買おうと思ってたよ。
文法はわかったけれど、いざプログラム書こうと思うと
大変に思える。ま、1日目だからこんなもんか。
0398デフォルトの名無しさん
NGNG覚えることはCやPascalよりも少ない筈。
前置記法と括弧に慣れるかがカギだな・・
処理系に寄るけど、中置記法使う方法が用意されてるかも。
括弧は慣れるしかない。(慣れても読みにくいとは思うけど。)
0399デフォルトの名無しさん
NGNG0400デフォルトの名無しさん
NGNG0401森田
NGNG/ ̄ l | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
■■-っ < >>399 んなーこたーない
´∀`/ \__________
__/|Y/\.
Ё|__ | / |
| У.. |
040262
NGNGLisp系のプログラムを書くなら
専用モードを持つEmacsなどのエディタを使うのが吉。
括弧が多いだけに括弧の対応や適切なインデンテーション
を自動的にやってくれるとそれだけで効率がぜんぜん違う。
というかLisp系では適切なインデントはほとんど前提。
>>398
下手に中置記法が混じると構文が崩れて
かえって読みにくいと思うけど。
0403デフォルトの名無しさん
NGNG(define (森田 n)
(display
" ,一-、
/ ̄ l | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
■■-っ < >>")
(display n)
(display " んなーこたーない
´∀`/ \__________
__/|Y/\.
Ё|__ | / |
| У.. | ")
)
(森田 399)
0404デフォルトの名無しさん
NGNGこーいうのはあると便利だけど
(infix 2 * a * b * (- 1) * 4 * c + d / e * f)
=>(eval (+ (* 8 a b (- 1) c) (* (/ d e) f)))に展開
=>evalの結果
毎回実行時に前置に展開するのは遅いから、
キャッシュ持っておくとか。
0405デフォルトの名無しさん
NGNG0406デフォルトの名無しさん
NGNG0407397
NGNGSchemeのシンプルなところは好きです。
lambdaは気持ちよさげ。(Javaのanonymous classみたいなものですね。)
ただ、まだ括弧にはなれていないれす。
>>402
emacsは好きなんでemacsつこうとります。
Meadow + DrScheme
0408デフォルトの名無しさん
NGNGLisp/Schemeではinfixで書くほうが堕落だとおもうぞ
0409デフォルトの名無しさん
NGNGちなみに
(infix-expand 〜)
みたいなの用意されてるから、必要なら前置で取り出せるけど。
0410デフォルトの名無しさん
NGNG(infix 〜 (prefix 〜 (infix 〜) 〜) )
とかネストできると良いかも。
0411デフォルトの名無しさん
NGNG関数も infix にできるでよ。
0412デフォルトの名無しさん
NGNG0413デフォルトの名無しさん
NGNG0414デフォルトの名無しさん
NGNG0415デフォルトの名無しさん
NGNG0416qmailユーザ
NGNG0417デフォルトの名無しさん
NGNG0418デフォルトの名無しさん
NGNG毎号 Functional Programmingと Forthの連載があるよな。
# なぜか今年は POPLも送られてきたのでラッキー
0419デフォルトの名無しさん
NGNG0420デフォルトの名無しさん
NGNG型クラスとモナドが難しい。
C++よりも理解不能な言語がメジャーになれるのか疑問。
C++はCとして使えるからまだいいけど。
0421デフォルトの名無しさん
NGNG0422デフォルトの名無しさん
NGNG0423デフォルトの名無しさん
NGNGっていうかちゃんとした式で書いたC/C++の文法なんて存在しないんじゃん?
関数系の文法は綺麗よー。
まず文法デザインしてからコンパイラー書いてるから。
SMLは正式な文法の本があるはずだから興味ある方は読むべし。
でも文法の単純さと使い易さは別物ですねん。
0424デフォルトの名無しさん
NGNG意味不明
0425デフォルトの名無しさん
NGNG>意味不明
言い方悪かったすか?TT
未だかつてC/C++の文法は式で書かれたことがないのでは?
ってことっす。
0426422
NGNGいや、オレはSchemerなので。C++となんか比べてない。
>>425
それも意味不明。「BNFで書かれた」ということですか?
そんならストラウストラップに載ってる。
0427デフォルトの名無しさん
NGNGなんか…関数型言語関連のスレって、投稿者の知識にかなりのブレが
ありますよね。とくにC/C++ネタが出てきたときの。
0428427
NGNG0429デフォルトの名無しさん
NGNG何故そうなる?
0430デフォルトの名無しさん
NGNG関数型言語の場合、モナドってなに?
ドットペアって?再帰型?
型構築子?え?え?って感じだよ。
関数型言語は綺麗かもしれないけど、難しいじゃん。
0431デフォルトの名無しさん
NGNGeducational 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.
0432デフォルトの名無しさん
NGNG0433デフォルトの名無しさん
NGNG0434デフォルトの名無しさん
NGNGの機械翻訳
Haskellは教育のレベルにある材料に適しおしゃれ?しかし、その中のアプリケーションを構築してください?HARH HARH HARH!Haskellの中の複雑な機能はludicrusで、コースをそのいかなる場所にも持っていない人は誰も得ないでしょう。命令的な言語は、平均のプログラマにとって非常に容易です。また、Haskellを学習するタスクはそれがより広く認められるために適切にまた消耗しています。ただ一つの将来のIはHaskellのために見ます、スクリプトを書く言語がCGIのために使用するが、私が、それが試みて、パールの人気と競争するのを見たいとともに、あります。
0435デフォルトの名無しさん
NGNG0436デフォルトの名無しさん
NGNG0437デフォルトの名無しさん
NGNGHaksellは教育的にはいいんだけどよ〜、実際にアプリをつくるって?
ハッハッハッ!
Haskellなんて難しすぎて、教育を受けてない奴にはわからないね。
命令的な言語の方がずっと簡単さ。
こんな言語が広まるわけが無い。
将来はCGIで使われるだけだろ。Perlと競争するのをみてみたいもんだ。
0438デフォルトの名無しさん
NGNG>そんならストラウストラップに載ってる。
ちゃうちゃう、BNFはsyntaxでしょーが。
ここで文法ってのはsemanticsのことですたい。
ちなみにCのsyntaxだったらK&Rに載ってるね。
っていうかsyntaxだったらコンパイラのparserパクればOK?
SMLは操作意味(operational semantics)の文法が存在するのですよ。
>なんか…関数型言語関連のスレって、投稿者の知識にかなりのブレが
>ありますよね。とくにC/C++ネタが出てきたときの。
あり?もしかしてなめられてます?一応言語は研究範囲内なんすけど(涙)
0439デフォルトの名無しさん
NGNGなんていえないだろ...
ネタじゃないから痛すぎるから出直してくれ。
0440デフォルトの名無しさん
NGNGなんていえないだろ...
ネタじゃないから痛すぎるから出直してくれ。
0441デフォルトの名無しさん
NGNG0442デフォルトの名無しさん
NGNG> SMLは操作意味(operational semantics)の文法が存在するのですよ。
0443デフォルトの名無しさん
NGNG0444デフォルトの名無しさん
NGNG>> SMLは操作意味(operational semantics)の文法が存在するのですよ。
へー。文法って言わないのか?わりーわりー。なんせ留学10年めだから。
日本語(特に専門用語)分からなくなってますわ。
自分もちょっと変だと思ったんだよね。誰かがHaskellの文法は難しいって
言ったからてっきりsemanticsの方かと思ったぜ。Haskellのsyntaxが
難しいってことだったのね?syntaxって難しいか?
>ようするに、mathematical notation ってことか?
ちょっと違うかも?何をmathかとするかによるけどこっち(米国)の
言語学者たちはmathematical notationだとdenotational semanticsの
方を指すことになる。
やっぱ日本の板に書き込む前にはも少し日本語専門用語習わんとな。
反省-_-
0445デフォルトの名無しさん
NGNG0446デフォルトの名無しさん
NGNGhttp://www.google.com/search?q=Haskell+HARH+applications&btnG=Google+%8C%9F%8D%F5&hl=ja&lr=
と思ったらHaskellじゃなくMLになってるわね。
どっちがオリジナルなんでしょ?
0447427
NGNGいえ…僕もsemanticsの形式的な記述(これでいいの?)のことだと思ったんで、
>>424さんに煽りっぽく突っ込み入れてみたんですけど、424さんがBNFのことを
言ってたと>>426でわかったから、これはもう、漏れが厨房なだけだと。
0448デフォルトの名無しさん
NGNG0449デフォルトの名無しさん
NGNG3年目か4年目辺りで退学です。
0450デフォルトの名無しさん
NGNGつまり、ある決まった規則が、何を意味してるのか
わからないんだよ。
444はsemanticsとやらに形式的な記述が存在して綺麗だとか、
そういう学者的な超越的視点に立ってるから一般人が難しい
という意味がわからないんだろ。
0451デフォルトの名無しさん
NGNG0452デフォルトの名無しさん
NGNG痛さ100倍だな。
そうじゃないなら英語使っていいから自分の発言を説明してみれ。
>>450
単なる厨房。
0453デフォルトの名無しさん
NGNGでもそれ以外は Cなんかよりずっとわかりやすいとおもうがな..
pointerなんて architecture知らないとわからんし。
数列の合計とかも、loop変数とかぶん回さなくてもできるし。
0454デフォルトの名無しさん
NGNG型に引数とかあるが、あれはなんなんだ。
0455デフォルトの名無しさん
NGNGGeneric
Template
かなあ。
0456デフォルトの名無しさん
NGNG素直にポリモルフィズムって言ったほうが
最近のオブジェクト指向に慣れた人には通じるかも。
ただしアドホックじゃなくてパラメトリックなポリモルフィズムだから、
C++でいえばOperator OverloadingじゃなくてTemplateみたいなもの
(のもっと一般的な奴)です。
0457デフォルトの名無しさん
NGNGまあ、Javaにも Genericityが入るみたいだし、マンセーって感じ?
0458デフォルトの名無しさん
NGNG0459デフォルトの名無しさん
NGNG応用できないの?
0460デフォルトの名無しさん
NGNGそういう言語は実行時に型の間違いを発見し、コンパイル時には
発見しないので、型推論をする必要が無い。
0461デフォルトの名無しさん
NGNG>発見しない
だから、型推論がどうかって話じゃないの?
0462デフォルトの名無しさん
NGNG>発見しない
だから、型推論はどうかって話じゃないの?
0463デフォルトの名無しさん
NGNG実行する前に型推論行なって、MLとかと同様にエラー検出ができれば
十分意味があると思うけど。
0464デフォルトの名無しさん
NGNGそれなら意味あるけど、そうなったらもはや型の無い言語じゃないよね。
0465デフォルトの名無しさん
NGNG論理関係の本?
0466デフォルトの名無しさん
NGNGMLの解説本じゃない?
0467デフォルトの名無しさん
NGNGMLの本ですか。
どっちにしろ図書館ですね
0468デフォルトの名無しさん
NGNG0469デフォルトの名無しさん
NGNGあれってそんなのあったっけ???
うーん、それ以外に webってあったか...
0470デフォルトの名無しさん
NGNG0471デフォルトの名無しさん
NGNG0472デフォルトの名無しさん
NGNGschemeにMLライクな型推論を実装した、
っていうレポート記事は昔見たことあるよ。(英語)
純粋に型チェックに使うのかな?
0473デフォルトの名無しさん
NGNGwebって、インターネットってことだろ。
googleで検索しろよ。
0474デフォルトの名無しさん
NGNG> webって、インターネットってことだろ。
この言い方も変だなぁ……。
まあ、>>469が変な勘違いしてるようだからしゃーないか……。
0475デフォルトの名無しさん
NGNG結構高いし、難しい本だけど、
型付きλとか推論関係の内容があった。
まあ、図書館で見掛けたら。
047662
NGNGMayerさんの本は悪くはないが
どちらかというと広く浅くだし、ちょっと癖が強い。
>>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にいるね。
0477465
NGNGと
「プログラミング言語ML」
を借りてきました。
ML言語はともかく、型推論の部分はむずかしそうですね。
0478デフォルトの名無しさん
NGNG型理論なら
「モデルと表現」
米沢明憲・柴山悦哉
岩波書店ソフトウェア科学17
http://www.iwanami.co.jp/.BOOKS/01/1/0103570.html
の方が初心者向けで分かりやすいよ。
内容は「コンピュータサイエンス入門」より狭いけど。
0479デフォルトの名無しさん
NGNG型推論のところなんかちっとも難しくない。
それよりもストラクチャの所が難しい。
0480デフォルトの名無しさん
NGNGJavaやDelphiなどの現実的(?)な言語の
コーディング・設計の仕方が変わってきますか?
またどのように変わりますか?
それとも特に影響される部分はないのでしょうか。
0481デフォルトの名無しさん
NGNGMLやHaskellに感化され、型推論などの重要性を理解できるようになる
と世界が広がったような気分を満喫できる。それでひとつ目のハードル
がクリアされる。
しかし、それらの言語に特徴的な機能を何とかコーディングで実現しようと
してどつぼにはまって自爆する。
「現実的(?)な言語」では無理してそういうことやらなくて良いんだ、
その分設計に力を入れよ、ということに気が付くようになると
次のハードルをひとつ越したことになる。
型を動的な側面と静的な側面でうまく使い分けることができるように
なれば、更につぎのハードルを越えたといえるんじゃないだろうか。
ちなみに、C++でテンプレートを駆使してどつぼにはまったことがあります。
0482デフォルトの名無しさん
NGNG一般的な関数型言語は、従来の手続き型言語に比べ
すっきり記述できるので、それに慣れると
ややっこしいコードが理解できなくなります。
0483デフォルトの名無しさん
NGNG0484デフォルトの名無しさん
NGNG視野はいろいろと広がると思うけど。
別の言語でそれにこだわるとかえってマイナスになるということは
あるよね。郷に入っては郷に従えってことだね。
もちろんプラスとなることもあるだろうけど。
0486デフォルトの名無しさん
NGNG0487デフォルトの名無しさん
NGNG0488デフォルトの名無しさん
NGNGいえてるかも。
a = 4;
a = a + 1;
これって数学じゃないしね。
0489デフォルトの名無しさん
NGNGhttp://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
0490デフォルトの名無しさん
NGNGというか、数学のやりかたとCのやりかたの
どっちが「正しい」のか?という悩みに
ぶつかってしまったのだが…。
0491デフォルトの名無しさん
NGNG'='この記号を先に使ったのは数学。
0492デフォルトの名無しさん
NGNGa = a + 1 という式から、
今の数学の公理系と同じくらい広く利用できる公理系が作れるならいいけどね。
1 = 1 + 1 も、二進数で + が AND 演算なら成り立つんだし。
まあ、Pascal のように代入記号に等号を使わなければ回避できる。
a := 4
a := a + 1
0493492
NGNGi.a = 0
0 = 0 & 0
0 = 0 & 1
ii.a = 1
1 = 1 & 1
1 = 1 & 0 ←これがダメだ
0494デフォルトの名無しさん
NGNG安直に考えて
i = i + 1
とかいうのは、計算のステップごとに添字をつけて、
i_(n+1) = i_n + 1
とかいうことじゃないだろか。
プログラム上での変数というのは、数学での数列というわけ。
0496デフォルトの名無しさん
NGNG0497デフォルトの名無しさん
NGNGi := i + 1
じゃなかったっけ?
0498デフォルトの名無しさん
NGNG>>492
0499デフォルトの名無しさん
NGNGでもその考えだと数列の最後の項にどんどん追加することしかできないんじゃない?
0500デフォルトの名無しさん
NGNGHaskellのように非正格で、さらに優れているのはその名の通りコンカレントってこと。
あとIOはHaskellのモナドに対して
Concurrent Cleanでは、Uniqueness typingというのがサポートしているらしい。
速度も速いってHPには書いてあるけど。
どうよ?
0501デフォルトの名無しさん
NGNG0502デフォルトの名無しさん
NGNGコンカレントとは並列実行されるっていうことです。
0503デフォルトの名無しさん
NGNG0504デフォルトの名無しさん
NGNG0505デフォルトの名無しさん
NGNG0506デフォルトの名無しさん
NGNG説明してくれ
0507500
NGNG0508494
NGNG単なる思いつきなので、実は全く確信をもって言ったわけではないです…。
ところで「最後の項にどんどん追加することしか」というのは
どういうことのことを言ってるんでしょうか? よくわかりませんでした。
具体的にはどういうのをできないと言っているんでしょうか。
0509499
NGNGa_2みたいにn番目にアクセスできないという意味で言いました。こちらも深い意味は無いです。
C や Pascal みたいな手続き型言語では変数に数学的意味は無いと思います。
メモリの内容を書き換える、という程度でいいでしょう。
0510494,508
NGNGなるほどわかりました。
ありがとうございます。
過去の変数の値にアクセスしたい、というなら、
おっしゃるとおりそれはできないですよね。
> C や Pascal みたいな手続き型言語では変数に数学的意味は無いと思います。
> メモリの内容を書き換える、という程度でいいでしょう。
いずれにせよ、計算モデルはチューリングマシンとか
RAMとかにいきつくわけですからね。
数学で使われる式とは、出発点が違ってる気がするし、
それとなく方向性も違ってそうなので、
意味はないというのにはなんとなく同感です。
ただ、それらはλ計算のモデルとも同等だとかいう話もあるみたいなんで、
どっかではどうにかしてつながっているでしょうけど。
0512デフォルトの名無しさん
NGNG0513デフォルトの名無しさん
NGNG>LispのISO標準規格ISLISPの処理系
って有名なの?
あと、これのソースって何処にあるかしりませんか?
(なぜかバイナリしか置いてない)
0514デフォルトの名無しさん
NGNG有名じゃないみたい。
0515デフォルトの名無しさん
NGNG非常にすっきりしているけど、
ある程度ライブラリがたまってからでないとキツイかも。
教育用としては非常にいいと思われますが。
0516デフォルトの名無しさん
NGNGhttp://members.tripod.co.jp/kamopoo/LeeRan.html
そしてそのファンが作った解説ページ。(必見)
http://www.geocities.co.jp/HeartLand-Icho/1207/
彼の立てた伝説のスレッド
http://salami.2ch.net/test/read.cgi?bbs=hrhm&key=991394303
是非とも全部合わせてご覧あれ。
0517デフォルトの名無しさん
NGNG言語比較の論文に出てたけど。
0518名無しのλ式
NGNG> あと、これのソースって何処にあるかしりませんか?
http://www.ito.ecei.tohoku.ac.jp/TISL/index_j.html
「これ」の一例、TISLのソースあり。
0519513
NGNGありがとう!
かなり小さいですね。
日本がメインなのが良い感じです。
GUYのCommonLisp->Schemeの縮小思想と似てるかも。
0520デフォルトの名無しさん
NGNGSchemeはCommonlispよりもだいぶ前だよ.
0521デフォルトの名無しさん
NGNG0522デフォルトの名無しさん
NGNGCommonLispは80年前半から。
0523デフォルトの名無しさん
NGNG0524厨
NGNG0525デフォルトの名無しさん
NGNG入出力等、副作用を伴う処理は関数型言語の苦手とするところだから、
そういう汚れ仕事は伝統的な言語に任せて、本質的な処理だけを担当す
るライブラリの構築を関数型言語が担当するという役割分担はできない
もんでしょうかね。
0526デフォルトの名無しさん
NGNG0527デフォルトの名無しさん
NGNG0528デフォルトの名無しさん
NGNG思っておりますが、何か始めるに当たってアドバイスなんぞありますか?
参考サイトURLをぺたっ、でもOKです。
0529デフォルトの名無しさん
NGNGProgramming in Haskell(日本語)
http://www.sampou.org/haskell/
0530528
NGNGどうでもいいのでsageますが、
Lispを書くのにvim6がいいと思っておりますがいかがでしょう?
Syntax Highlightあるし、%でカッコジャンプできるし。
まぁemacsでも実現できるのでしょうが。
0531デフォルトの名無しさん
NGNGvim6とemacsと両方試してみて、気に入った方を継続的に
使えば良いと思います。もっとも、僕ならLISPを書くとき
にはemacsですけどね。
0532デフォルトの名無しさん
NGNG挙手をお願いいたします。
0533デフォルトの名無しさん
NGNG0534デフォルトの名無しさん
NGNG復旧後にでもたてましょうか。
0535名無しさん
NGNGwww.teu.ac.jp/kougi/koshida/Prog6/index.html
0536石敢當
NGNG0537デフォルトの名無しさん
NGNG関数型プログラミング言語Haskell
0538デフォルトの名無しさん
NGNG良さそうですね。
0539デフォルトの名無しさん
NGNG0540デフォルトの名無しさん
NGNG0541名無しさん
NGNG0542デフォルトの名無しさん
NGNG0543デフォルトの名無しさん
NGNG0544デフォルトの名無しさん
NGNGLispは実用的な土台をもっているらしいですね。
日本は手続き型言語ばかりで関数型言語を習得していない人が多いので
関数型言語は話題になりにくいし、企業でも導入事例は少ないそうで。
hmm... 慣れの問題なのかな?
それだけじゃ無いような気もするけど、よぉわからん。
0545デフォルトの名無しさん
NGNGところで、これでFFみたいなゲーム作ってみたいんですけど可能でしょうか?
あと、書けたとしてオブジェクト指向言語より楽になるんでしょうか?
ネタのようですがネタではないです。マジレスお願いします。
>lisperの皆さん
0546デフォルトの名無しさん
NGNG0547デフォルトの名無しさん
NGNG0548デフォルトの名無しさん
NGNGコンパイルでネイティブコード直接吐く様な処理系なら違うだろうけど。
0549デフォルトの名無しさん
NGNG作れるよ
0550545
NGNG>547 FFXってVBでも作れるんですか…すごいっすねVB
>548 lispは比較的遅い言語らしいですね ネックになるかな
>549 簡潔なレスサンクスです
Cでも書けそうですけどどちらが向いてるんでしょうか…。
0551デフォルトの名無しさん
NGNGあーいうのは言語そのものよりも、用意された環境とか
ライブラリの質/量が開発期間に影響すると思うけど。
0552デフォルトの名無しさん
NGNG> Cでも書けそうですけどどちらが向いてるんでしょうか…。
実行速度が要求される所は、C/C++で書いて、
ストーリーを司る所はLispなどのinterpreterで開発せよ。
0553550
NGNG>551 そうですね。絵や音を出すにも結構苦労しています。
ちょろっと書いてみてプログラムは動き出すまでが
難しいと思いました。必要なものが本当に多いですよね。
>552 適材適所ですね! ありがとうございます、
全体像が見えてきました。おぼろげな感じですが…。
0554525
NGNG呼び出すことも、kawaからjavaで作ったクラスを呼び出すこともできて便
利。ポータブルだしね。
0555デフォルトの名無しさん
NGNG0556デフォルトの名無しさん
NGNGjavaの上にlisp(scheme)って、とても遅そうなんですけど
実際どうでしょうか。現実的ですか?
0558デフォルトの名無しさん
01/08/30 13:42ID:aCGvLkdQ0559デフォルトの名無しさん
01/09/01 00:25ID:8UdnvL3A0560デフォルトの名無しさん
NGNG関数型言語みたいに、デバッガ上でいきなり関数を呼び出して
関数のテストが出来たらいいのに…
デバッグしやすさ的に、
1位:関数型言語
2位:XPのユニットテスト
3位:デバッガでちまちま
かなりボロクソに言われそうな無いようですが、意見求む。
0561デフォルトの名無しさん
NGNG動作テストできない場合が多いんじゃないか、と。
0562デフォルトの名無しさん
NGNGsetup()で対象クラスを生成して、
各メソッドごとのテストコードを書く。
入力と、望むべき出力を書いて、
一致すればOK、ダメなら何処がダメかが出力される。
一度テストコードを書けば、その後が楽なあたりは
関数型言語の関数を一つ一つテストするのよりは楽かと。
0563デフォルトの名無しさん
NGNGエラーになりそうな入力を考えないといけないし、
すべてのパターンを網羅的にチェックできるわけじゃないから、
本当の意味でエラーフリーであることは保証されない。
その点、強い型付けのある関数型言語は、かなり有利じゃないか、
と思いますが。
0564デフォルトの名無しさん
NGNGメソッドの定義修正もなんでもできるよ
0565デフォルトの名無しさん
NGNG0566デフォルトの名無しさん
NGNG統合環境型Lisp - 関数型 + 手続き型 + OO → Smalltalk
Xeroxのworkstationは、同じVMの上でsmalltalkとInterlisp-Dのどちらも動きました。
0567デフォルトの名無しさん
NGNG判ってないね
ちみは
0568デフォルトの名無しさん
NGNG0569振らんでよい
NGNG昔、論理型や関数型は機能推論によるdebugの研究が行なわれた頃があったけど、
ああいう研究って最近はどうなっているの?
0570そんなことできんの?
NGNGmain(){ print("Debug me!\n"); }
これ自動デバッグしたらWordになっちゃうのか?
0571デフォルトの名無しさん
NGNGhttp://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/
0572デフォルトの名無しさん
NGNGdylanのソースって読みやすそうだね
0573デフォルトの名無しさん
NGNGDylanって確かsyntaxが二つあって最初はLisp風だったのが
受けが悪くて普通っぽいのも用意したのではなかったかな?
0574デフォルトの名無しさん
NGNGhttp://www.cs.indiana.edu/hyplan/jsobel/forschemers.html
0575デフォルトの名無しさん
NGNGコンパイルの早いdylanがあれば、仕事のメインをdylanにしたいけどさー。
0576デフォルトの名無しさん
NGNG感心するね
0577デフォルトの名無しさん
NGNGなんでオブジェクト指向も出来ないHaskellが一位なんだ。
きっとRubyやSmalltalkのチームは出場してないんだろう。
Cごときが3位に入ってるし。きっと低レベルなコンテストに違いない。
Haskell スレにも居た人っぽいなぁ。
オブジェクト指向言語と関数型言語、
どっちが優れてるかという議論をしたいのだろうなぁ。
0580デフォルトの名無しさん
NGNGだって、言語コンテストじゃないもの。
0582デフォルトの名無しさん
NGNGじゃあ、RubyやSmalktal使って書いみて、あまりの素晴らしさに驚かしてくれ。
0583デフォルトの名無しさん
NGNGとかの理論を学んだ頭の良い人たちだったのでは。
0584デフォルトの名無しさん
NGNG0585デフォルトの名無しさん
NGNGAlthough 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の記述、普段もやる人多いし。
0586デフォルトの名無しさん
NGNG> ラムダ計算とかモナディックスタイルだとかの理論
などを勉強するのは頭がよい人ってのは偏見だろう。
0587デフォルトの名無しさん
NGNG0588デフォルトの名無しさん
NGNG俺は知らないけど、その理論が難しいんでしょ。
0589手続き者
NGNG1. 器を用意する
2. 器に代入 ← なにか計算した結果
3. 器を引数に手続き呼び出し
関数型の発想
(手続きを呼び出す
(引数として 計算をここでしちゃう))
非常におおざっぱだけど、こんな感じ?
0590デフォルトの名無しさん
NGNG君の理解だと、どこが関数型のメリットなの?
0591589
NGNG0592デフォルトの名無しさん
NGNG勉強する気あるの? それとも荒らし?
0593デフォルトの名無しさん
NGNGJavaで実現されたMLとかHaskelとかってないかなあ。
SchemeはSchemeで面白いんだけど、型システムのある
関数型言語がほしい場合もあるんで。
0595デフォルトの名無しさん
NGNG勉強する気があるんだね。
だったら答えるけど、>>589の比較では関数型言語と
手続き型言語の違いが浮かび上がってこないね。
関数型言語の特徴をごくおおざっぱに言えば、
・変数の値が変化しない
・関数を引数として渡せる
ってところだよね。
0596デフォルトの名無しさん
NGNG(houchi situmon)
(maji-resu situmon))
0597デフォルトの名無しさん
NGNG(lambda (q)
(cond
((null? q) '())
((arashi? (car q)) (eval-question (cdr q)))
(else (append (maji-resu (car q)) (eval-question (cdr q))))))))
0598デフォルトの名無しさん
NGNG0599デフォルトの名無しさん
NGNGこれは違うと思うよ。Cだって関数ポインタ渡せる。
一番違うのは関数型においては関数に対していろいろな演算が出来ること。
0600デフォルトの名無しさん
NGNG同意。
C でも関数ポインタなら返せるが、既存の関数へのポインタだけだもんな。
0601
NGNGこのページを見てみましょう。
http://cristal.inria.fr/ICFP2001/prog-contest/results-elim/
Smalltalk, Ruby, SML, Java, Tcl, Perl, Python,
Scheme, Common Lisp, C++, Eiffel, Pascal
等を使ったチームも参加していることが分かります。
0602デフォルトの名無しさん
NGNGチーム名ワラタ
0603デフォルトの名無しさん
NGNGHaskellを使ったチームが11チーム。
それに対してRubyを使ったチームは1チーム。
Smalltalkは2チーム、Schemeは6チーム、SMLは7チーム。
つまり、RubyよりHaskellの方が11倍有利だったということ。
C++は19チームもいるから救いようが無いけど。
0604デフォルトの名無しさん
NGNGあれって実行時性能を確保することを目的と
したトリッキーなテクニックのために存在し
ているのであって、アルゴリズムをより的確
に表現するためのものではない、と思ってい
ます(違っていたらスマン)。
関数型言語における高階関数は本質的で欠く
ことの出来ないものだと理解していますが、
おかしな理解ですかね?
0605デフォルトの名無しさん
NGNGしっかし、これ見るとocamlって言語が多いなあ。
そんなに人気がある言語なのかねぇ。
0606g
NGNGhttp://www.sex-jp.net/dh/01/
http://www.sex-jp.net/dh/02/
http://www.sex-jp.net/dh/03/
http://www.sex-jp.net/dh/04/
0607デフォルトの名無しさん
NGNGえー、流れ的に、>>595さんですよね?(違ってたらすまん)
あなたの理解で間違ってないだろうけど、
> ・関数を引数として渡せる
って表現が適切じゃなかっただけかと。
0608デフォルトの名無しさん
NGNGなんか、Shell と Python の成績がいいのか?
0609デフォルトの名無しさん
NGNGINRIAが主催しているからと思われ。
(CamlはINRIAが開発した言語だからね、授業で使ってるんでしょ)
0611デフォルトの名無しさん
NGNGCのqsort()みたいな使い方は、実効性能目的というより
高階関数的だ、というのは理解を間違っているかな?
0612デフォルトの名無しさん
NGNGLispのラムダ式の代わりみたいなもんか。
0613デフォルトの名無しさん
NGNGん?違うだろ?
>>611
だな。
0614デフォルトの名無しさん
NGNGRuby >>>>>>>>>>>>>>>> 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
0615デフォルトの名無しさん
NGNG>>>>>>>>>>>>>>>>は何演算子でしょう?
0616デフォルトの名無しさん
NGNG言語仕様のオタクぶりが売りだけど所詮ひとりのアマチュアが作った言語仕様。
HaskellやOcamlを作った言語研究のプロのオタクぶりに勝てるわけが無い。
0617デフォルトの名無しさん
NGNGって、価値基準はオタク度なのか?そーなのか!?
0618デフォルトの名無しさん
NGNGJavaやC++,Cまんせーな人に比べたら遥かに数少ないでしょ。
あと、まつもと氏はRuby関係の仕事をすることで給料をもらっているので
アマチュアではないです。
まぁ、言語研究のプロではないのかもしれないけどね。
0619デフォルトの名無しさん
NGNGRubyもこよなく愛しているよ。
I/O処理が多いプログラムを作ろうとすると、
慣れのせいなんだろうけど、関数型言語は疲れる。
0620デフォルトの名無しさん
NGNG俺も。それにrubyは関数型言語的な
処理も得意だしね。
0621デフォルトの名無しさん
NGNGということで合ってますか?
0622デフォルトの名無しさん
NGNGyes.
0623デフォルトの名無しさん
NGNG0624デフォルトの名無しさん
NGNGあるよ。perlにもある。
0625デフォルトの名無しさん
NGNGじゃあ、関数合成とかできるのけ?
0626デフォルトの名無しさん
NGNGできるよ。
0627デフォルトの名無しさん
NGNG>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
0628デフォルトの名無しさん
NGNGしょう。これにより直接的な表現を可能にする。
一方Rubyは型の無い言語であって、方向性が全く違うと思う。
0629デフォルトの名無しさん
NGNGrubyに型はない、ってのはちょっと語弊があるんでわ?
変数に型がないので任意のオブジェクトをバインドできる
けど、オブジェクト自体はいずれかのクラスのインスタン
スだから、動的に型チェックすることはできるじゃない。
もっともHaskellの強力な型システムとは比較するべくも
ないので、それには同意。
0630デフォルトの名無しさん
NGNGrubyは末尾再帰展開してくれたりはしないので、
関数型とはいい難い。
0631デフォルトの名無しさん
NGNGrubyを関数型言語とは言い難いのは同意だけど、
末尾再起を繰り返しに展開するかどうかは関数型
言語か否かを決定する要因なの?
# 効率上、重大な問題だということは認める。
0632デフォルトの名無しさん
NGNGgcc -O4とかやってみれ >>630
0633デフォルトの名無しさん
NGNGつーか、今時はそういうのを型なしの言語というんだべ。例えばLisp。
0634デフォルトの名無しさん
NGNG標準仕様じゃねーだろ
ここで処理系依存の機能持ち出されてモナー
0635デフォルトの名無しさん
NGNG関数型はループに相当する処理を再帰で書くのが普通。
言語によってはヘタレな人の為にループ構文を専用に用意したりしてるけど。
0636デフォルトの名無しさん
NGNG関数型言語のときは、静的な型付けの方がしっくりくる(けど、Schemeも好き)。
なぜかしらん?
0637デフォルトの名無しさん
NGNG知らないから検索してみたけど関数合成って
ttp://www.teu.ac.jp/kougi/koshida/Prog6/Text08/
みたいなことを言うんでしょ?
Rubyでどうやるの。無理じゃない?
0638デフォルトの名無しさん
NGNGなるへそ。たしかに無理ですね。結果として同じことが実現できるだけでは
不十分ですね。スマソ。
0639デフォルトの名無しさん
NGNG関数合成できないし...
0640デフォルトの名無しさん
NGNGえ?
関数合成はできるだろ?
0641デフォルトの名無しさん
NGNGhow?
>>637で紹介されているドキュメントによれば、
関数合成用の演算子が重要だということになる
んだが。
# もしかして、俺の理解がダメダメなだけ?
0642デフォルトの名無しさん
NGNG(define (comp f g)
(lambda (x) (f (g x)))
これでいかんのか?
とりあえず、Haskell でもやってることは同じだぞ。
>>637-638
Ruby 知らないのでアレなんだが…
> 結果として同じことが実現できるだけでは不十分ですね。
十分じゃないの?
0643デフォルトの名無しさん
NGNGさらに意味が分からん。
Semanticsにtail jumpが、あたかもschemeのように、入っていたら関数型なのか?
0644デフォルトの名無しさん
NGNGschemeではループ用にdo文を用意してるけど、本当は必要ないし。
(syntax-sugarとしてもあまり意味ない。lispとの互換性?)
0645デフォルトの名無しさん
NGNG0646デフォルトの名無しさん
NGNGf.call(g.call(x))
end
0647デフォルトの名無しさん
NGNG末尾再帰をループに展開するかどうかは関数型かどうかの判断基準には
ならないけど、関数型言語は再帰を多用するので末尾再帰をループに展
開しないとしたら、誉められた実装とは言えない。
# 末尾再帰になっているかどうかを判断できない処理系があるとすると、
# 関数型言語としては不満の残る実装だということ。
関数型言語ってのは、つまるところ「副作用のない言語」ってところに
尽きると思う。入出力その他のために副作用は完全にはなくせないんだ
けど、副作用を基本にしている手続き型言語とは一線を画しているのは
間違いないところだと思う。
0648デフォルトの名無しさん
NGNGあと複数の値を引数にとる関数同士の合成ってできるもの?
CommonLispなんかは多値を返す関数とか書けるみたいだけど。
0649デフォルトの名無しさん
NGNG>Scheme や Ruby の comp の例って、引数や返値の静的な型チェックはできないよね。
SchemeやRubyは静的な型チェック自体がないからねえ。
>あと複数の値を引数にとる関数同士の合成ってできるもの?
別に引数の個数は問題にならないと思うけど。
>CommonLispなんかは多値を返す関数とか書けるみたいだけど。
SchemeやRubyは多値を返す関数を書ける。
0650デフォルトの名無しさん
NGNGSchemeは知らんけどRubyにmultiple-valueあったっけ?
0651デフォルトの名無しさん
NGNG多値返すにはarrayを使う。
普通arrayを多値とは言わないけど。
0652デフォルトの名無しさん
NGNG0653デフォルトの名無しさん
NGNG次のように書きます。
a = method('f')
ちょっと変だけど、使いにくいほどじゃないでしょ。
0654デフォルトの名無しさん
NGNGそれって微妙に違わない?
合成するときに x を渡さず
保留することってできるの?
0658デフォルトの名無しさん
NGNGdef comp(f,g)
lambda{|x| f.call(g.call(x))}
end
0659デフォルトの名無しさん
NGNGlambda{|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)
こんなんでどう?
0660デフォルトの名無しさん
NGNG0661デフォルトの名無しさん
NGNG0662デフォルトの名無しさん
NGNGしかしそれでは関数fがオブジェクトって感じがしない。
0663a
NGNG0664デフォルトの名無しさん
NGNGオブジェクト指向言語を温めて関数型言語を知る
0665デフォルトの名無しさん
NGNGどうでもいいけど
sicp 読んでる人には ruby もやってる人が多い模様。
http://www.amazon.co.jp/exec/obidos/ASIN/489471163X/ref=sr_aps_d_1_1/249-0272495-6600319
0666デフォルトの名無しさん
NGNG0667デフォルトの名無しさん
NGNGRubyはクソです。ゴミ箱逝きです。
いじょ
この発言をコピペしていただければ幸いです。
0668デフォルトの名無しさん
NGNG## 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";
0669デフォルトの名無しさん
NGNG配列と別に多値はあるよ。配列の s-value は m-value に展開されるが。
もちろん m-value を配列で受けたり、配列を複数引数に展開して渡すこともできる。
0670デフォルトの名無しさん
NGNGそれでは次のコーナーです
__ ____________________
.|/ ‖ ‖ ____
‖ ‖ | ON AIR.|
∧ ∧ θ ‖  ̄ ̄ ̄ ̄
(,,゚Д゚)__ /[] ̄ ̄θΛ_Λ
||(. つ_/ //(´∀` )/|
┗┳ /  ̄/⊂ ||_/
┻| ̄ ̄ ̄ ̄ ̄| ( ━┳┛
|_____| /ヽ」┘┻
____________|\____
「Rubyはクソです。ゴミ箱逝きです。 いじょ 」
この発言をコピペしていただければ幸いです。
0671デフォルトの名無しさん
NGNGnil
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'
だめじゃん。関数合成どころか…
0672age
NGNGhttp://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()
おもろい?
0673デフォルトの名無しさん
NGNG訳が面白い。
> 関数が最初のクラス (オブジェクト) である。
0674デフォルトの名無しさん
NGNGえーとですねえ、多値を返すメソッドは、言わば「任意個」の値を返すメソッド
と同義なんですよ。ですから>>671でのメソッド定義では駄目で、
def add(*arg)
arg.map(){|x| x += 1 }
end
みたいに定義しないと。
0675h
NGNG0676デフォルトの名無しさん
NGNGそれは多値じゃないねぇ。
0677デフォルトの名無しさん
NGNGrubyでは多値は扱えない。
それでいいじゃん。
元々そんなに多用する機能でもないし。
0678デフォルトの名無しさん
NGNG0679デフォルトの名無しさん
NGNGコマンドラインでsml、と打つと対話型インタープリタ
が立ち上がってしまうのですが。
0680デフォルトの名無しさん
NGNGソースを読み込んだらexportMLでダンプして実行可能オブジェクトを作るのです.
0681679
NGNG- exportML "dmp.obj";
stdIn:1.1-2.4 Error: unbound variable or constructor: exportML
とかなりましたが、ちょいとgoogleで調べた所、
SMLofNJ.exportML
で私の環境ではよさげでした。どうも。
これでちょこちょこ遊んでみます。
0682デフォルトの名無しさん
NGNG0683デフォルトの名無しさん
NGNG0684デフォルトの名無しさん
NGNG意味わかんねぇ。
新しいって何?
0685デフォルトの名無しさん
NGNG柔らかい頭に叩き込む方がいいね。小学生に職業訓練したって
しょうがないと思うんだけど。文部省の人間はバカか?
それとも教えられる人間がいないのかな?
そもそもソロバン=計算機と考えて、それじゃあIT革命に乗じて
そろばんの代わりにエクセルを学校で教えようとか考えてるのが、
あほくさい。やっぱり役所ってだめだな。
0686デフォルトの名無しさん
NGNG小学生はもちろん、高校生でも怪しいと思われ。
0687デフォルトの名無しさん
NGNG0688デフォルトの名無しさん
NGNG0689デフォルトの名無しさん
NGNG0690デフォルトの名無しさん
NGNG暗記試験で良い点とることが勉強だと思っとるからな。
0691デフォルトの名無しさん
NGNG非常に多い回数まわるループ(含無限ループ)を書くのに
goto(または同等品)+代入が要ると思われ。
それで関数型言語って呼べるかって事では?
亀レスすまそ
0692デフォルトの名無しさん
NGNGMLのwhileループはtail recursionだが、
メモリを食わないことが保証されてる。
Schemeもtail recursionではメモリを
消費しない。
Haskellもtop-level CAFのような例外
を除けば同じく。
Lispはそうでない。
pure functional…Haskell, Miranda, ...
impure functional…Scheme, ML, ...
Lispはどちらでもない。
0693デフォルトの名無しさん
NGNGここ、Scheme, Haskell, ML, LISP@マ板
くらいかな。
最近Haskellいぢってないなぁ…
0694デフォルトの名無しさん
NGNGThat has such people in't!
0695デフォルトの名無しさん
NGNG0696デフォルトの名無しさん
NGNG買った人いるかい?
http://kyoritsu-pub.topica.ne.jp/shinkan/shin0109_05.html
0697デフォルトの名無しさん
NGNG0698デフォルトの名無しさん
NGNG0699デフォルトの名無しさん
NGNGML スレにもでてたね。
0700デフォルトの名無しさん
NGNG0701デフォルトの名無しさん
NGNG比較対象を持って書かれたということ
0702名無しさん@XEmacs
NGNG0703デフォルトの名無しさん
NGNGプログラミング言語 ML の評判は悪いらしい。
0704デフォルトの名無しさん
NGNGなんか誤解されそうな文だな。
そういう題名の本が評判悪いのね。
ML自体は悪くない。
0705デフォルトの名無しさん
NGNGこんなの読む人は大抵は英語ができるからかな?
0707デフォルトの名無しさん
NGNGいきなり1999年…悲
0708デフォルトの名無しさん
NGNGVLIWの幅を増やすのもさっさと見切って、
これからはマルチスレッドだと逝ってるみたいですね。
マルチスレッド化すると1.3倍速くなるとか(中途半端な)…
もう手続き型言語から抽出できる命令レベルの並列性は
限界に来たのかなという気がします。
関数型言語の利点に、副作用がないので並列化しやすい
というのがあると思うのですが、関数型言語で書くと
並列度はやっぱり上がるんでしょうかね?
その場合、lazyな言語よりMLとかの方が並列化しやすい
気がするんだけど…(だって、前もってやっちゃうと
lazyで無くなるから…)
0709デフォルトの名無しさん
NGNGlazy ってのは
評価されてない部分があっても、
それが評価されている必要が無いのなら
先に進んでよい
って話なので、別に必要が無いものを前もって計算したからって
問題はないと思うが。
0710デフォルトの名無しさん
NGNGhttp://research.microsoft.com/projects/ilx/index.htm
0711デフォルトの名無しさん
NGNGそうなのかな。
例えば
myIf :: Bool->a->a->a
myIf True x y = x
myIf False x y = y
で、述語を評価する前にxやyを評価したら、
本来起きないエラーが起きたりしない?
0712デフォルトの名無しさん
NGNG関数型言語とどういう関係があるの?
0713デフォルトの名無しさん
NGNGU.S.A では12才でScheme おしえてるって知ってた?
それより若い子は、LOGOをやらせてるってしってた?
0714デフォルトの名無しさん
NGNG0715デフォルトの名無しさん
NGNGSchemeは無いが、中学生たちにProlog教えたことならある。
別に問題はなかったよ。
0716デフォルトの名無しさん
NGNG思考の柔軟性を養うには関数型言語がいいと思うね。
http://www.hotwired.co.jp/news/news/culture/story/20010627204.html
0717デフォルトの名無しさん
NGNGこれって関数言語用にILを拡張するっていうものだろ。
直接は関係ないな。
0718デフォルトの名無しさん
NGNGその例に関しては、Haskell ならなんの問題もないと思うが。
というか、ML なんかのほうが副作用とかあるし、並列化しにくいのでは。
0719デフォルトの名無しさん
NGNG>>686
>小学生はもちろん、高校生でも怪しいと思われ
関数はそれほど高度な概念ではないのではないかと思われ。
数学でいう関数が厳密にどういうものを指すかは知らないけど、関数型言語を使うためのものなら、
その言語を使っているうちに覚えますよ。(schemeしか知りません)
>>714
時間を多めに割かないとそうなって終わりでしょうね。
(lambdaが出ないうちに終わっちゃったりして……それはないか)
0720デフォルトの名無しさん
NGNGそれって、ごく一部の話でしょ。
アメリカって州ごとに教育制度が全然違ってたりするし。
0721デフォルトの名無しさん
NGNGLittle Schemerあたりが関数型言語(っちゅうか再帰処理)の入門書としては
もっとも良く書けていると思うけれど、
きっと大学生でもわからん奴
(数学的センスのない奴、抽象化が苦手な奴)は、けっこういると思う。
いわんやHaskelをや。
0722_
NGNG解説読むより先にソース打ち込んで実際実行するか自分で書いてみた方が分かりやすい。
そういうのやった後なら、それ関係の抽象的な話も分かるようになるんだけどなー。
(「ああ、あのこと言ってるのね」って)
数学的センスあるやつって読んだだけで分かるの?
0723デフォルトの名無しさん
NGNG0724デフォルトの名無しさん
NGNGなんとなく抽象的なものを理解するのが
早そうとかいってみる。
0725デフォルトの名無しさん
NGNG0726デフォルトの名無しさん
NGNG0727157
NGNGちなみにCMPもそこそこの性能は出るよ。巷で言われるほど悪くはない。
146はどうせ雑誌か何かで読んだ知識を鵜呑みにしているだけだろう。
そうでなければCMPに挑戦して挫折したのか?
いずれにせよスレ違いなのでsageておこう。
0728デフォルトの名無しさん
NGNG0729719
NGNG>(数学的センスのない奴、抽象化が苦手な奴)は、けっこういると思う。
やっぱり苦手な人は苦手ですよねぇ……。
それに、高校までの数学とは違うものですし(言ってみれば、必要の無いこと)。
「総合的学習」の選択科目のひとつになるのが精一杯、といったところかも。
>>722
その方法は自分にとって分かりやすい、という方法が自分でわかっているなら、
「分からんやつ」でもないのでは?
自分で何かをしたり(この場合はソースを打ち込んだり)するのは、こういったことを
理解するための効果的な方法の一つではないかと思います。
……少なくとも、本を読んで覚えようとするよりは。
(読んだだけで分かる人がうらやましい)
0730名無しさん@XEmacs
NGNGリスト遊びで終わるような本ではなく、
出来れば実用的なコンソールアプリが作れる程度まで書かれていれば
うれしいのですが。
0731デフォルトの名無しさん
NGNGまだ見てないけど、この本がちょっと気になる。
http://www.amazon.co.jp/exec/obidos/ASIN/4756139264/
0732デフォルトの名無しさん
NGNG自分は業務系のJava屋ですが興味があります。
0733デフォルトの名無しさん
NGNG岩波のCommon Lisp入門はいいと思う。
サンプルではテキストエディタのコードが載ってた。
0734デフォルトの名無しさん
NGNGそれMacの奴だよ。
最初のほうはlisp全般だが、
後ろのほうは、Macのlispプロセッサが必要な奴。
0737デフォルトの名無しさん
NGNGいちおう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じゃないとだるいね。
0738デフォルトの名無しさん
NGNG0739デフォルトの名無しさん
NGNGところでGCLはバージョンいくつのつかってますか?
0740737
NGNGうまくインストールできました。
lisp.exeへのショートカットを作成し、そこのプロパティに
C:\UNIX\cygwin\usr\local\lib\clisp\lisp.exe -B /usr/local/lib/clisp -M meminit
(-M meminitは前も試した)と書いて実行すればOKでした。
けど、Cygwin経由からはうまくいかず。
ちなみに、バージョンは最新のを持ってきたはずです。
0741737
NGNG逝ってきます。
0742無名λ式
NGNG>>711
strictな引数だけspeculativeな計算をしてよい。
だから、strictness解析すればやっていいかどうか分かる。
f x ↑ z = ↑である時に、fの第二引数はstrictであるという。
↑は、「停止しない」式とか「副作用のある」式と思ってください。(やりたい解析による)
-- 式というか、semantic domain上のbottomと呼ばれる値。
myIfは第一引数だけstrict。
0743デフォルトの名無しさん
NGNGですよね。いかにHaskellでも、本来_Lが出てこないものが_Lになるような
投機的実行をしたらまずいですよね。
ところで do if P then putChar 'A' else getChar
なんてのはどうなんでしょ?
0744デフォルトの名無しさん
NGNGどうもCommonLispの一番メジャーな処理系はCLispらしいですね。
gclは古いしcygwinじゃ厳しそうなので諦めました。対応はしてる
みたいだけど。
0745デフォルトの名無しさん
NGNGなかではいいと思ってたんだが...
CLispは compilerなかったようだし。
Portabilityに欠けるなら CMU CLがよかったような。
でも win環境ならいろんなところの Lispの評価版が
もらえないか? Allegloとか。
MCLはなつかしいねえ.. あの木のアイコン...
0746デフォルトの名無しさん
NGNGcygwinでコンパイルできた?
おれ、コンパイルエラーが山のようにでるよ。
cygwinは1.3.3です。
0747デフォルトの名無しさん
NGNG> CLispは compilerなかったようだし。
あるよ。Win版でもあるかどうか知らんけど。
http://clisp.sourceforge.net/resources.html
> まさみさまマンセーな俺としては、GCLが portableな
> なかではいいと思ってたんだが...
ISLISPじゃなくていいのか?
0748デフォルトの名無しさん
NGNGおれのはこれと同じだった
http://sources.redhat.com/ml/cygwin/2001-09/msg01333.html
とりあえず手で書き直してやるかな。
0749デフォルトの名無しさん
NGNG立ち消え?
0750デフォルトの名無しさん
NGNG湯淺先生ファンなので前者を使いたい気分だが。
先生はリアルタイム処理用のGCを開発(完了?)しているらしいね。
0751デフォルトの名無しさん
NGNGどんな本を読んだらいいんでしょうか?
何かお勧めの本があれば教えて下さい。
0752デフォルトの名無しさん
NGNG計算モデルの基礎理論 井田哲雄 岩波講座ソフトウエア科学12
プログラムの基礎理論 佐藤雅彦、桜井貴文 岩波講座ソフトウエア科学13
0753デフォルトの名無しさん
NGNG先生!どれも在庫がないみたいです!w
仕方がないので明日仕事帰りに
明倫書店に言って探してきます。
ありがとうございました。
0754デフォルトの名無しさん
NGNG「情報科学における論理」, 小野寛晰, 日本評論社, 1994
「計算論」, 高橋正子, 近代科学社, 1991
0755デフォルトの名無しさん
NGNG0756デフォルトの名無しさん
NGNGヲイヲイ。
0757デフォルトの名無しさん
NGNGありがとうございます。
この手の本って最近出版されたもので
いいものってないんですかね。
ヘルプをプリントアウトしたような
ものが今は売れるからマニアックな
本は刷らないのかもしれませんね。
図書館から借りるのがベストかな。
>>755
自然言語ではなくて計算機用の言語に
関する本が読みたいです。
0758デフォルトの名無しさん
NGNG0759デフォルトの名無しさん
NGNGガンバレYO!
0760デフォルトの名無しさん
NGNGいいじゃないか、基礎から学ぶんだから、1990年代で十分だよ。
0761デフォルトの名無しさん
NGNG0762デフォルトの名無しさん
NGNG同意。
極端な例だが、幾何学や解析学を基礎から学びたいなら10年や20年
古くてもあまり関係ないだろう。それと同じ。
0763デフォルトの名無しさん
NGNGhttp://www.sra.co.jp/people/katsu/review/intro_theory
この本に挙げられている参考文献は今じゃWebで読めるものも
あるから一冊と言えばこれを薦めるな。
0764デフォルトの名無しさん
NGNGでもこれ、説明がヘタクソで意味不明。
0765デフォルトの名無しさん
NGNGこの本はいいよ。sraのサイトのやつは分かりにくいけど。
アマゾンにも在庫はあるみたいだから757は
これを買いなさい。年内これ一冊で楽しめると思う。
0766751
NGNG教えて頂いた本を書店で探してみます。
0767デフォルトの名無しさん
NGNG俺はその本を少しと、754が言ってる「プログラム意味論」, 横内寛文
を読んだことがあるけど、後者の方が説明がわかりやすい上に、内容
が深いと思った。
ただし、無味乾燥で、扱ってる内容が少々難しくなるが。
0768デフォルトの名無しさん
NGNGその本いい加減な集合論で定義しただけで「数学的」とか
調子こいてて全然ダメ。話にならない。
Meyerなんてしょせんタダの計算機馬鹿。
0769デフォルトの名無しさん
NGNG同意。あまり真面目に読む本じゃない。
独学で、かつ真面目に読もうと思っちゃうと、緩い記述に引っかかって辛いかも。
さらっと読んで、>>767に進むのが良い。
0770デフォルトの名無しさん
NGNGこれにしとけ
0771デフォルトの名無しさん
NGNG…俺はいらねーけど(wara
0772デフォルトの名無しさん
NGNG腐ってたが。
0773751
NGNG0774デフォルトの名無しさん
NGNGそれは基礎論の教科書だけどこの話とは関係ないな
0775デフォルトの名無しさん
NGNG「プログラム言語の基礎理論」っつーのはどうでしょうか?
0776デフォルトの名無しさん
NGNGTurboPascalとかと同じでボーランドから?
0777デフォルトの名無しさん
NGNGBorlandが売ってたけど開発元は違った。
今はVisual Prologという名前になってる。
Prologとは呼べないほど変わった言語。
TurboLispってのもあるが、Borlandとは無関係。
0778751
NGNGとりあえず、Bertrand Meyerの
「プログラミング言語理論への招待」を買ってきました(それに
しても高かった、、、)。明日からの3連休で読み終えたいです。
教えてくださった方の話だと、どうも横内さんの本は難しそうなので、
とりあえずこれを読んでからにします。
今2章で基本的な概念とその記法を学んでいるんですが、
高校数学すらろくすっぽ覚えていないので記号に馴染むまで時間がかかりそう。
頭が悪いのでノートに書きまくって読んでます(*^o^*;
0779デフォルトの名無しさん
NGNG0780仕様書無しさん
NGNG0781デフォルトの名無しさん
NGNGそんなわけで、Cもこのスレに入れてもいいですか?
0782名無しさん@XEmacs
NGNGナニが「そんなわけで」だよ。
0784デフォルトの名無しさん
NGNG大堀さんの?いい本だよ.
MLの基礎理論がしっかり書いてある.
0785デフォルトの名無しさん
NGNGあの本を3日で読み終えようなんて傲慢にして無謀。
0786デフォルトの名無しさん
NGNG0787デフォルトの名無しさん
NGNGそんなに必要性もないということか。。。
0788751
NGNG確かに無謀でした。じっくり読んでるので今まだ4章の初めですw
前にも言われたように年内楽しめそうです(苦笑
お風呂やトイレに行くときも持ち込んで読んでるのに
こんなペースか、、、正直、自分の頭に失望しました。
こういった本を読んでいるとちゃんとした人に教わりたく
なってきますね。自分は高卒なので新たに大学に行きたくなってきました。
といっても4年間の学費を払う余裕もないのでなにか教養講座のような
ものがあればいいなと。どうでしょうかね?一人で本読んでばっかりじゃ
アウトプットがなくて効率が悪いと思うんですよ。
なにかご存知であれば教えて頂けないでしょうか?
0789デフォルトの名無しさん
NGNG大学にはこういう人に来て欲しいよね。
実際に大学に来てる人って勉強なんてやる気なくて
働かなくてもいいから大学いってるみたいな人がたくさんいる。
0790デフォルトの名無しさん
NGNGそんな大したものじゃありません。恥かしくなるのでやめてください
今いろいろと検索してみたのですが教養講座みたいなものはなかなか
見当たりません。ある程度の人数が集まるようなものでないと、
授業を開くことができないのは分かりますが残念です。
むしろ一般の講義を切り売りしてるような学校ってないかな?
一単位10万ぐらいで。飛行機の空席を安く売るような感じにw
先生に直接交渉して現金渡すのがいいのでしょうかね?ワラ
教える人とその授業を買う人が自由に売買できるほうが
望ましいと思いますが、現実はそうでもないみたい。
こういうの仲介するのが商売として成り立つかな?とも考えてみたりw
スレ違い、すみませんでした。
0791デフォルトの名無しさん
NGNG> むしろ一般の講義を切り売りしてるような学校ってないかな?
ケンブリッジは、講義のビデオ売ってるよ。
日本の大学でもやっているところないかな?
いずれにせよ、多くの大学がやり始めると思う。
それから、多くの大学には、聴講という制度がある。
勝手にもぐり込んで授業を聞いても、誰も気づきはしないけどね。
# 某板では、思想的に偏った放言を吐く人の授業を聞きに行くツアーがあった。
>>788
>確かに無謀でした。じっくり読んでるので今まだ4章の初めですw
その手の本を読むのが初めてらしいので、遅いという事はないと思う。
0792デフォルトの名無しさん
NGNGどうだ、やすいだろ。これの方が大学なんてところに4年も行くよりは効率がいいぜ!
0793デフォルトの名無しさん
NGNG途中解約はできるのか?
お試し期間はあるのか?
月謝制か?
0794_
NGNG結局そのソースが吐き出すコードってループになってるんですよね?
なんのために再帰にこだわるのか私には謎。
0795デフォルトの名無しさん
NGNG再帰で書いたほうがきれいにかれるときに再帰を使えばいい。
末尾再帰がないと必ずループで書かなくちゃいけない。
# 他のものとの違いを聞かれると特徴的なことをあげるだろうけど、
# 別にそれがすべてって思ってるわけではないでしょ。
0796デフォルトの名無しさん
NGNG結局そのソースが吐き出すコードって機械語になってるんですよね?
なんのために高級言語にこだわるのか私には謎(w
0797_
NGNG確かに。再帰に対する考え方は一応私も同じスタンスです。
字句解析とか不思議なほどすっきり書けるのは確かですし。
まあ、lispでも普通にループ使ってたらいいですね。
ただ、なんか関数型言語って変なこだわりを感じるんですね。
(変数へ代入は状態がどうのこうのとか)
この辺り馴染めません・・・
#これも気にせず普通にコーディングしてればいいのかな。
0798デフォルトの名無しさん
NGNG基本的には、imperativeに対する批判から出発している。
つまり、imperativeによるアルゴリズムの記述は、
実行順序を細かく論じることに費やされてしまい、
とかく冗長・複雑なものになってしまう。
また、そのアルゴリズムの正当性を論じようとする際には、
その非数学的な記述は、いかにも厄介である。
したがって、数学的でコマンドの羅列になることのないような記述法を
模索しようと言うことから出現してきた背景がある。
従って、別にどうでもいいといわれればどうでもいいのかもしれない。
しかし、まあ一応流れと言うことで。
0799デフォルトの名無しさん
NGNGいや,再帰にはこだわりたい.なぜなら多くのアルゴリズムは
分割統治的な性質があるから,漸化式が導き出せる.すると
再帰はその直接的な表現になる.
逆に,ループは漸化式を開いた形に対応するので,アルゴリズム
の記述という観点からすると間接的な表現と言える.
0800デフォルトの名無し
NGNG0801デフォルトの名無しさん
NGNGその手の分野では日本ソフトウェア科学会が
ときどき短期の集中講座を開いてる.もちろん一般参加可能.
0802デフォルトの名無しさん
NGNG・ループは単なる再帰の特殊例なので、再帰さえあればループは不必要。
・ループなんてものは数学的にはあやふやな概念。ループの『意味』を
厳密に定義するには再帰を使うしかない。
・「ループが基本」とか「ループが分かりやすい」と思うとしたらそれは、
たまたまそういう言語を先に学んだ人の偏見にすぎない。
0803デフォルトの名無しさん
NGNG普通の関数として定義できてしまう。LispやSchemeでもマクロ
を使えば可能。基本構文に加える必要は全く無い。
0804デフォルトの名無しさん
NGNG代入もいらない
0805デフォルトの名無しさん
NGNGループを再帰の特殊例としてのみ捉えるのも、
たまたま数学マンセーに生まれついた人の偏見に思えるけど。
0806デフォルトの名無しさん
NGNG切り取られた概念だという事を忘れた言い分だね。
0807デフォルトの名無しさん
NGNG面白いけど無意味
みんなもやってみよう
0808デフォルトの名無しさん
NGNG関数型言語には再帰がある。ループは定義できるから。
表現能力が同じで便利さも同じなら、primitiveは少ない方が良い。
0809デフォルトの名無しさん
NGNG曖昧さのあるプログラミング言語なんて使いたくない(w
0810デフォルトの名無しさん
NGNG別に関数型言語にケチつけるわけじゃないが
それは所詮個人的な美意識の問題に過ぎないと思われ。
利用局面において使いやすければそれでいいんだから。
C#なんてそういう美しさという点から言えば話にならないが(以下略)
0811デフォルトの名無しさん
NGNGないんだよ。「ループなんてライブラリで良いじゃん(ライブラリ化が可
能な言語なら)」と言ってるだけ。
CでもC++でも、「quick sort文」とか「hash table型」なんてのを
primitiveにはしないだろう、ということ。(C♭ならわからんが…)
0812デフォルトの名無しさん
NGNG確かに、再帰で表現できるループを言語文法にしてしまうのは良くないね
特に、数学的なものを扱う場合にはね
従わねばならない文法が増えれば増えるほど、「前提」も増えるからね
0813デフォルトの名無しさん
NGNG代入が必要なんだから。
0814デフォルトの名無しさん
NGNG(loop 100 '腕立て)
こういう風に使える関数loopを定義することはScheme的にはひどくカンタンですが、それが何か?
0815デフォルトの名無しさん
NGNG意味不明。
たとえばSchemeの
(do ((i 0 (+ i 1))
(a 0 b)
(b 1 (+ a b)))
((> i 10) b))
というループに代入など出てこないが?
0816デフォルトの名無しさん
NGNG個人的にはこういうのがいいけどなぁ。
(define (udetate-ato n)
(udetate-suru)
(udetate-ato (- n 1)))
(udeate-ato 100)
>>814
(i 0 (+ i 1)) とか代入だよね。
実際には代入しない式に変換するかも知れないけど、
そんなこといったら手続き型の代入もすべて変換すればいいし。
0818814
NGNG> (define (udetate-ato n)
> (udetate-suru)
> (udetate-ato (- n 1)))
> (udeate-ato 100)
これでは無限ループでは?
; (udetate-ato n)においてnがゼロになろうがマイナスになろうが停止しないでしょ。
0819デフォルトの名無しさん
NGNG代入じゃないよ。
(letrec ((loop (lambda (i a b)
(if (> i 10)
b
(loop (+ i 1) b (+ a b))))))
(loop 0 0 1))
みたいなただの再帰呼び出しになる。
これを「副作用」と感じるようだとかなり毒されてる。
0821学生
NGNG再帰的に定義されたものを再帰的なプログラムで記述するのが
一番忠実で簡潔な方法なのではないでせうか?
「腕立て伏せを『n回』やるように命令する」なんてまさにそうだと思われ。
0822デフォルトの名無しさん
NGNG0823デフォルトの名無しさん
NGNGforループもそういう風に展開できるよね?
再帰に展開したらループ自体の副作用がなくなるのは当然だけど無意味では?
0824デフォルトの名無しさん
NGNG「腕立て伏せを『n回』やるように命令する」
のどこに再帰があるんだい?
0825デフォルトの名無しさん
NGNG意味が分からない。
「ループ自体の副作用」って? 「ループ」という概念に副作用は含まれてい
ないと思うが。
「無意味」とは? 別に何か凝った変形操作をしているわけではなくて、同じ
ことを(つまり、ループはすなわち再帰だから、素直に再帰で)書いている
だけなんだが、何が無意味?
forという「文法」「カタチ」の方が好きならば、それを使えば良い。全く
同じ意味だが。
0826821
NGNGn回やるとは
・n>0なら(n-1)回やったあとXXXを1回やれ
・n=0なら何もしない
というふうに書けるということです
ん、関節やら筋肉やらにどういう指令を送って
腕立て伏せの一連の動作を行わせるかっていうこと?
それは関数型の話しとちゃうのでは?
0827デフォルトの名無しさん
NGNG「n回繰り返す」をどうモデル化しても再帰の概念が出てこざるを得ない。
たとえば「loopというラベルに続くコードからloopへジャンプする」という
のは、「loopという状態に遷移した以降の状態遷移先にまたloop自身が出てく
る」わけだから、遷移規則(オートマトンに対応する言語の導出規則)が再帰的
になる。
もっとストレートに言えば「繰り返し」はすべて「再帰」のサブセット。
0828デフォルトの名無しさん
NGNG同じ状態に遷移したら無限ループじゃん。816みたく。
0829828
NGNG「クロージャに1,2,...,nを引数として順次与える」
って事しか言ってないのでは?
引数を与える方法が副作用であるか再帰関数であるかには
触れていない。
0830デフォルトの名無しさん
NGNG君は腕立て伏せをするとき、「一回やって、あとn-1回だ」って数えてる?
俺は1,2,3,4,...,nと数え上げて、その度に腕立てするよ。
別に「一回やって、あとn-1回だ」でもいいけど、他の方法もあるってこと。
自然数を公理的に定義する場合にも
n∈Nat ⇒ n'∈Nat としても
x≠0 ⇒ ∃y.x=y' としても
どっちでもいいよね。
0831821
NGNG私もそうします。たまに何回目だかわからなくなって
1セット余分にやっちゃったりもします。
>「一回やって、あとn-1回だ」
なんてやってたら、エラー:「あれえ、あと何回だっけハァハァ」が爆発的に発生して
ぶったおれるまで終れないかも・・・
loop(a, n)とは
・もしもa>nならば終了
・そうでなければ loop(a+1, n)へ
0832デフォルトの名無しさん
NGNG途中に脱出条件が入っても(当然入ることを想定してたが)再帰であることに
かわりはない。
>>828
良くわからんが副作用とループが(必ずしも)関係ないということには同意。
>>829
カウンタを減らしていっても増やしていっても再帰は再帰。>>819 では増やし
てる。
0833832
NGNG>>829
オートマトンと逝ったのが悪かったかも知れんが(それでも入力が進んでるか
ら無限ループとは限らないが)チューリングマシンなら意味は通るだろ。
0835デフォルトの名無しさん
NGNG単純に具象構文が身体感覚に合致するかどうかを問題
にしているんだと思う。
Schemer/Lisperは構文問題に頓着しないので、
ループを再帰に置き換えるし、むしろ積極的にループなど
再帰の一種に過ぎないと「抽象化」する。
しかし、構文問題に頓着する人もいるわけ。
だからSchemeやLispの普及は一定以上のものにならない。
よくC言語はソースコードとマシンコードのギャップが少ない、
という評価のされ方をするね。
関数型言語の場合はソースコードと本質的なアルゴリズムの
ギャップが少ないという評価でいけるんじゃないかな。で、問題
を解決するときに「この問題の本質は何か?」を追求するので
はなく、本質的かどうかは問わず、手作業でやるときの方法を
素直に機械処理化するという方法論の人もいるんだな。そうい
う方法論の人の場合、ソースコードと自分の身体感覚のギャッ
プの少ないことが重要なんだと思う。
Perlなんかは、身体感覚重視で、だから科学的な発想の人か
ら嫌われるんだと思うし、身体感覚派の人からも、身体感覚的に
合わないと嫌われるんだと思う。
0836デフォルトの名無しさん
NGNGなかなか鋭い洞察だと思うが身体感覚派の人もSchemeでdoループでも
forループでも使えば良いじゃん。あるいは身体感覚に合う構文を作っ
ても良いし。
0837デフォルトの名無しさん
NGNGそれなら Haskell や ML なんて…
0838デフォルトの名無しさん
NGNG0839デフォルトの名無しさん
NGNGえ、チューリングマシンなら、それこそ副作用+ジャンプじゃん。
それを再帰関数に読み替えることができるってのはその通りだよ。
つまり、
>「n回繰り返す」をどうモデル化しても再帰の概念が出てこざるを得ない。
は「どうモデル化しても」じゃなくて「functionalなパラダイムでモデル化すれば」であって、
計算モデルとしてチューリングマシンを選べば「書き込み+ヘッド移動の概念が出てこざるを得ない」でしょ。
繰り返し動作を実装する時に
functionalなパラダイムでは再帰が自然だし
impericalなパラダイムではループが自然だっていう
それだけの話でしょ?なんで普遍的にどっちかに統一せにゃならんの?
0840デフォルトの名無しさん
NGNG>計算モデルとしてチューリングマシンを選べば「書き込み+ヘッド移動の概念が
>出てこざるを得ない」でしょ。
んで、そのチューリングマシンと等価な言語の導出規則はどうなるの?
>繰り返し動作を実装する時に
>functionalなパラダイムでは再帰が自然だし
>impericalなパラダイムではループが自然だっていう
impericalってのはimperativeのことかな。
何でも良いが、再帰の出てこない意味論があったら教えてくれ。
>それだけの話でしょ?なんで普遍的にどっちかに統一せにゃならんの?
別に(形を)統一しろとは言ってない(と何度も言ってる)。
forやdoが好きなら使えばよろしい。
再帰さえあればループという「形」は簡単に作れるからprimitiveからは除
いても差し支えないと言っているだけ。
0841デフォルトの名無しさん
NGNGことになりそうなんだけど。慣れの問題か?漏れはよく分からん。
0842デフォルトの名無しさん
NGNG誰もチューリングマシン上でアルゴリズムの設計などしないのですが。
いろいろな計算モデルがチューリングマシンモデルと等価だというの
は正しいですが、だからといってチューリングマシンモデルが他のモ
デルと同様に有用だと考える人はいないでしょう。
だいたいそんなことを言い始めると言語を研究している人たちの立場
が...
0843デフォルトの名無しさん
NGNG> impericalってのはimperativeのことかな。
スマソ。その通りです。
> 何でも良いが、再帰の出てこない意味論があったら教えてくれ。
操作的意味論でよければ、いくらでもあると思うが。
例えばアセンブリコードを吐くコンパイラみたいのとか。
さらにそのアセンブリでcallやretをスタック操作+jumpに展開しちゃえば
再帰というよりループに近いシロモノになるよね。
0844デフォルトの名無しさん
NGNG別に自分自身を呼ぶ必要はなくて、
関数などの一番最後のコンテキストで他の関数を呼ぶ時に
余分なスペースを消費しないことだから、
>>843 みたいなのはまさに末尾再帰だと思うのだが。
0845デフォルトの名無しさん
NGNGカット無しのPrologみたいなものか、
死ぬほどスタックがいるな。くだらん
0846デフォルトの名無しさん
NGNGいや、末尾再帰は最適化する環境が多いんだけども。(w
Schemeは言語仕様で最適化すると決まってるな。
0847デフォルトの名無しさん
NGNG物言いだけど、そんなのあるの?
0848デフォルトの名無しさん
NGNGあるけど、そんな物言い誰もしてないと思うけど?
0849デフォルトの名無しさん
NGNGどんなのか少し説明お願い
0850デフォルトの名無しさん
NGNGCで再帰使って記述するとなると
return文が冗長だから読みやすくはならない。
Rubyみたいに最後の評価式が関数の値となる仕様ならまだしも。
0851デフォルトの名無しさん
NGNG脳型計算機とか。
話がずれてないか?
0852デフォルトの名無しさん
NGNG>>849
ラムダ計算+簡約規則でもいいし、ホーン節+推論規則でもいいし。
どっちのモデルもチューリングマシンコンパチだよ。
0853835
NGNGSchemeは構文を拡張できるから、自分の身体感覚に合う構文を作れば良いってのは
ある意味正論だけど、やっぱり詭弁でしょ。アセンブラなら何でも記述できるんだから、
自分の好きなようにコンパイラを書けば良いって話と同じじゃない。(もちろん、Scheme
のマクロが強力かつ安全かつ書きやすいってことは認めるけれど。)
ある言語を評価するとき、個人的な感動の経験が影響するのは否定できないんじゃな
いかな。再帰処理の美しさに感動できれば、再帰処理が基本となっている言語の評価
は甘くなるだろうし、実行効率で感動できる人なら、実行効率に劣る言語はどうしたって
評価が辛くなる。
開発スタイルにもよるよね。上からの指示を淡々とプログラミングするだけの現場なら、
KISSが黄金律だろうし、納品先でカスタマイズしやすいことが大事だとしたらVBとかに
なりがちだろうし。
0854836
NGNG詭弁とはまた厳しいお言葉。
コンパイラを書くのとは全然レベルが違うじゃん。
Schemeでdoループを書くなんてほんの20行かそこらでできちゃうんだから。
0855835
NGNGforもwhileも欲しいし、Pascal風にレコード定義できるようにしたい、とか、
いろいろ始まるでしょ。
自分の身体感覚に合う構文を網羅しようとすると、大事だよね。
当然デバッグも必要なわけだし。
0856デフォルトの名無しさん
NGNGそれでもまだコンパイラを作るのと同等に扱うのはどうかと思うよ。
そっちのほうがよっぽど詭弁ぽい。
0857デフォルトの名無しさん
NGNGきみらの会話はさっぱりわからん
何がいいたいんだ?
0858デフォルトの名無しさん
NGNG重要な議題なのかな?
オブジェクト指向派なので逆に関数型にも興味はあるが…
こんなに構文にこだわる言語なの?
繰り返しにも分岐にも、特別な文法を与えていないSmalltalkの方がきれいだなぁ
0859デフォルトの名無しさん
NGNG0860835
NGNGその人が言語を選択するときに、あらかじめ用意されている道具(構文や関数、制御構造等)が
「しっくりくる」かどうかを気にするのは当然だと思う。道具を作るための仕掛けが十分に用意さ
れていても、自作しなければならない道具が多すぎると腰が退ける人はいるでしょう。
; あまりにも多くの道具が用意されているので尻込みすることもあるでしょうが。
Schemeが強力だってことは疑いないし、構文など些末な問題ではないってことも
疑いない。構文が身体感覚に合致しなくても、身体感覚に合う構文を定義して利用
できるというSchemeの強力さは、もっと評価されていいと思う。だから個人的には
836は支持できるんだけど。
でも、やっぱり、それが万人に通用するかと言えば無理があると思うんだ。
原理などしらずに道具を使いたい人はいるわけだし。原理が透けて見えると
息苦しい人とかいるわけだし。
0862デフォルトの名無しさん
NGNGがわかれば使いこなせるのでは? それができないってことは,つまりプログラ
ミング言語の基礎が理解できてないっていうことだよね.EoPLか,せめてSethi
の本でも読んで勉強してみてはどうだろうか.
0863デフォルトの名無しさん
NGNGプログラミング言語はプロのためだけにあるわけじゃなかろうに。
ってゆーか、862が言いたいのは
「二進数表記の機械語でも使ってろ。
セマンティクスさえ理解すれば使いこなせるはずだ。
それができないってことは基礎がダメダメってことだ。」
とも読める。
0864デフォルトの名無しさん
NGNG862じゃないが、関数型言語は機械語と全く逆に高水準で使いやすいんでは?
それを機械語と同一視するのはあまりにこじつけが過ぎるような。
0865デフォルトの名無しさん
NGNG「Cで再帰だけで書け」と言ったヤツはいないように思うが。
関数型言語は末尾再帰がちゃんとループと同一視される。
だから再帰だけあればループも使える。Cはそうでないので、
ループ構文が(再帰と別に)必要。
だから逆だろ。「Cで再帰だけで書け」じゃなくて、「関数型言語には、
(primitiveとしての)ループ構文は不要(ライブラリで良い)。」
forを自分で定義する必要なんてない。SchemeでもMLでも最初から
(ライブラリとして)用意されてるから。それが「身体感覚」に合わなかったら
作れば? Cではできない贅沢だろ。新しいループ構文作るなんて。
0866デフォルトの名無しさん
NGNGその「身体感覚」なるものを「万人に通用する」とまで一般化して語るのはどうかと思うが。
大部分の人間が手続き型からプログラミングを学んだために、
他のパラダイムの言語を覚えるのに抵抗感を感じるのは良いとして、
例えば中学で一次関数を習うと同時に関数型言語も習ったとしたら、
事態は逆になっていたと思わないかな。
「原理」で言えば、コンピュータの原理(ノイマン型/プログラム内蔵方式/逐次実行)を
知らないと ASM/C/C++ なんかは使えないと思ったり。
0867デフォルトの名無しさん
NGNGプログラミング知らない中学生クラスにLisp教えたことがあるが、
別に再帰呼び出しに抵抗はないようだった。
0868デフォルトの名無しさん
NGNG手続き型は妥協の産物ということで理解するほうが
望ましいと思うんだけど。
0869858
NGNGOO派な私にとっては、関数型はある意味ライバル(?)なので
そのスレッドが荒れているのはライバルとしてふがいなく感じるんだよ。
だから、あんな書き方をしたんだ。
(まあ、うちのスレッドはどれも荒れまくりだがw)
SchemeなんかはSmalltalkからヒントを得たアクター理論を用いた
Plasmaを改良して作られたものなのに、関数型の考えになったりしてるけど、
なぜそうなったのかとか気になるしね
そういや、SmalltalkもSchemeも評価方法(インタプリタやコンパイラ)が
同一言語自身で作られているが、それが言語の柔軟性・拡張性を高めている気がする。
これは、まさに、アーキテクチャの再帰構造と言えるかもしれない。
0870デフォルトの名無しさん
NGNG本質的に非同期な並列動作だし、継承なんて概念はないし、
全然違うものだと思うが。
似てるのはメッセージ・パッシングというキーワードだけでわ。
0871デフォルトの名無しさん
NGNGなんで関数型とOOが対立しないといけないのかな?
LispやSchemeはもちろんOOだし、Objecitve Haskellだって
あるのに。
0872デフォルトの名無しさん
NGNG0873デフォルトの名無しさん
NGNG部分的にはそうなんじゃない?
それがなにか?
0874デフォルトの名無しさん
NGNG0875デフォルトの名無しさん
NGNGすると、カウンタとかどうするんだ?
外部に記憶空間を持って手続きでやり取りするのか?
大体それじゃ諸機能の実装を副作用に頼る事になるだろ、
なんというか、無駄っぽい。
0876デフォルトの名無しさん
NGNGただ単に、制御文だとか、命令だとかが関数で統一的に
表現されてるってだけでは。
0877デフォルトの名無しさん
NGNG中途半端な代物だということだ。そういう共時律的な概念に
基づいた言語も新しい物理学上のパラダイムシフトが無い限り
時間発展系の操作によって実装せざるを得ないのは、
時間の定義上当然であり、つまり我々の世界においては
今現在知られている限りでは手続きしかあり得ないのであって、
結局どちらが基本的手段であるかといわれれば当然手続きである。
0878デフォルトの名無しさん
NGNG分かっている人だと期待して聞いてみよう。
論理学に時間概念を取り入れることはできるのですか?
0879デフォルトの名無しさん
NGNG様々な論理体系が見出されたが、これからも自然言語に含まれる
或は全く未知の論理体系の定式化が進むだろう。
そして時間概念取り入れの手がかりが様相論理にはある。
(今現在の研究がどの程度進んでいるのかは知らないが)
しかし、論理学におけるそのような議論は計算科学に
おいて必要不可欠ということは全く無く、
時間発展系の記述という点について言えば
数学でそれを記述する事は容易である。
確かに数学は論理以上を原理的に含むのではあるが
方法として数学を採用する事を躊躇する理由は何も無い。
実際計算科学は時間発展についてよく考察し、
さらには情報量に関するエレガントな理論を展開し、
その物理学との関連をこれもまた意味深に語っているではないか。
0881デフォルトの名無しさん
NGNG逝ってきます
0882デフォルトの名無しさん
NGNG関数型が時間概念を無視したってのはおかしいな。
例えば、リストがあったとしてそれには順番が
ついているのだから、時間的経過を表現してる
とも言える。
それに、あんた物理学上のパラダイムシフトが
必要とかいってるが、なんで物理学が出て来るんだよ。
0883.
NGNGそれともプログラムですか?
LISPやSchemeならそのどちらにでもなりますか?
0884デフォルトの名無しさん
NGNGそういう議論って意味がわからない。
C言語で
a=1;
a++;
という文があったら、この二つは時間的に前後が決定されてる
から、時間がプログラムってことになるのか?
それならLISPも同じだよな。LISPの場合はプログラムがリスト
だから時間がデータとも言えるってことになるのか?
とりあえず、時間がどうのこうの言いはじめた877は一体
何が言いたかったんだろう。
0885デフォルトの名無しさん
NGNG不勉強を認める賢さは持ち合わせてるみたいだから
厨房ではないが。
0886デフォルトの名無しさん
NGNG共時的に存在できるのですよ。
その操作に時間が必要なのです。それはもちろん因果律の
もとで行われるからです。この方向性のある順序尺度としての
時間の元で非可換な操作を並べたものがもちろん手続きです。
もちろん時間には間隔尺度としての側面もありますから
完全に物理概念を利用しているという訳ではありません。
ところで純粋な関数型は写像の合成で記述するという
数学的に非常に綺麗な構文をしていますが、
ここ(構文)にはもちろん時間概念はありません。
言ってみれば恒常的に成立する式を記述する形式で
プログラミングが成立します。
このような共時的実装は我々にとって為すすべも無く
結局手続きで実装する事になりますが、そこで
この形式(関数型)で時間順序を扱うには言語仕様を熟知した上で
副作用を利用する事になります。このことは
実用的プログラミングにおいて大変不利であると考えます。
0887デフォルトの名無しさん
NGNG0888デフォルトの名無しさん
NGNG0889デフォルトの名無しさん
NGNGレヴィ=ストロースと仲間たち。
0890デフォルトの名無しさん
NGNG関数型言語の目指しているところを曲解して難癖つけているだけじゃん。
RDBの世界に正規化って概念があるよね。
導出値はフィールドに保持しないとかね。
超整理法でいうところの「ポケットを2つ以上持たない」ってアイデアだよ。
参照透過性を保証することで、デバッグが容易になる、
というアイデアの価値は普遍的なものでしょ。
もちろん、結局入力はどこからか与えられなければならないし、
出力もどこかに保存しなければならないから、そういう意味では
副作用はなくせないし、むしろそれは本質的なものでしょ。
ただ、そのプロセスにおいて、無用な副作用、本質的でない副作用は
排除するに越したことはないんじゃないの。
0891デフォルトの名無しさん
NGNG普通の関数も、全部関数っていう統一した形式だってだけで便利じゃない。
Lispなんかはそれをうまく利用して変数に何でも代入できたり、引数に
いろんなものを渡せたり、同一のルーチンがいろんなものに作用したり
するよね。
そういうところが利点じゃないかな。
0892デフォルトの名無しさん
NGNG>変数に何でも代入できたり、
>引数にいろんなものを渡せたり、
>同一のルーチンがいろんなものに作用したり
そこから Smalltalk の型無し変数や、
Eiffel の総称(あるいは STL や GenericJava) という流れに続いてるのだしね。
そのものが*実用的*じゃないにしてもフィードバックは必ずある。
0893デフォルトの名無しさん
NGNG人にとってどれだけ使い易いかも重要でしょう。
量子計算機の新しいユニークなアルゴリズムが
なかなか提案されない現状を見ても直感的な概念での
言語構築がその普及の鍵を握っていると言えるでしょう。
手続き型は我々の日常に近いという点でその条件を満たしていると
考えられます。
しかし真の関数型はそもそも実現されないのではないでしょうか?
現在のそのような言語は機能を持たせるのに実装依存の副作用を
利用せざるを得ないため、その動作を覚えるには言語の
実装を知る事が必要不可欠ですし、その結果ほとんどの人は
頭の中で手続きを考えながら関数風に記述しているだけに思えます。
実装したい機能が時間依存するものである以上どうにもならない様に
見えますが、ここをクリアできない限り関数風手続き型の域を
でないでしょう。
これから先のブレークスルーに期待します。
0894デフォルトの名無しさん
NGNG0895デフォルトの名無しさん
NGNG0896デフォルトの名無しさん
NGNG0897894
NGNGみたいなSQL構文きぼん
>>896
MITってことはSICP?
0898デフォルトの名無しさん
NGNGmonad使えば順序は表現できるのでは。
0899858
NGNGん〜、対立概念ではないが同一概念でもない
これが、完全な対立概念ならどんなに分かりやすかったことか…
手続型も関数型もOOも同じ土俵で戦うからこそライバルになり得る
また、同一概念でないからこそ名前で区別される
実装として妥協的に共存できるかもしれないが、
概念としての共存は難しい
…ただし、それぞれの概念を完全には理解できていないので
(つまり、定義しろと言われてもできないので)
もしかしたら、共存できる概念なのかもしれない
0900858
NGNGLispの利点はリスト形式ですべてを表現できること、この1点に尽きると思います
これはあまりに、あまりに強力です
例えば、OOにおけるオブジェクトの重要な要素に
識別性・状態・操作
があるけど、これを表現するには
(識別性 状態 操作)
みたいにスペースで区切って、括弧をつけるだけ…
なんとシンプルで強力なのでしょう
0902858
NGNG状態変化に関して
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.
と書かれてあった
0903デフォルトの名無しさん
NGNG> 実装を知る事が必要不可欠ですし、その結果ほとんどの人は
> 頭の中で手続きを考えながら関数風に記述しているだけに思えます。
それでいいと思うけど。何が問題なの?
0904デフォルトの名無しさん
NGNGあと、副作用を持たざるを得ないといってるけど、
副作用を持たない言語もあるよ。
0905デフォルトの名無しさん
NGNG人にとってどれだけ使い易いかも重要でしょう。
人工知能の新しいユニークなアルゴリズムが
なかなか提案されない現状を見ても数学的な概念での
言語構築がその普及の鍵を握っていると言えるでしょう。
関数型は数学の概念に近いという点でその条件を満たしていると
考えられます。
しかし真の命令型はそもそも実現されないのではないでしょうか?
現在のそのような言語は機能を持たせるのに実装非依存の関数を
利用せざるを得ないため、その動作を覚えるには言語の
関数概念を知る事が必要不可欠ですし、その結果ほとんどの人は
頭の中で関数作用を考えながら命令風に記述しているだけに思えます。
実装したい機能が正確で複雑なものである以上どうにもならない様に
見えますが、ここをクリアできない限り命令風関数型の域を
でないでしょう。
これから先のブレークスルーに期待します。
0906デフォルトの名無しさん
NGNG手続き型が日常に近いとは全く思わない。そういう発想にはちょっとびっくりだ。
また、いずれにせよプログラミングは日常的な思考とはかなり異なると思う。
0907デフォルトの名無しさん
NGNG0908デフォルトの名無しさん
NGNG作用至上主義の究極の関数型=Haskell
これが全てを物語っているだろう。(w
0909デフォルトの名無しさん
NGNGそもそも手順が関数と相容れないと考えるのが間違ってる。
関数は手順をまとめたものだ。
0910中庸な名無しさん
NGNG何事もほどほどに、ということか?(藁
0911デフォルトの名無しさん
NGNGCに毒されたか?
0912デフォルトの名無しさん
NGNG関数型言語では。
0913デフォルトの名無しさん
NGNGそういう一面もある。f(x)=2x+1だとすれば、xに2をかけた後
1を加えるという手順をまとめたものだ。
0914デフォルトの名無しさん
NGNGオブジェクトといっても狭い意味でのものじゃないです。
0915デフォルトの名無しさん
NGNG数学知らんのか?
それとも計算機中毒か(w
0916デフォルトの名無しさん
NGNGそれはイコールと代入の区別がついていないような気がするけど。
0917デフォルトの名無しさん
NGNGオブジェクト指向のオブジェクトとは少し違う
と思うけど、変数に代入したり値と同等に扱う
ことができるということならそういう言語が
多いね。
0919デフォルトの名無しさん
NGNGf(x)=1ならどうよ
0920デフォルトの名無しさん
NGNG言うに事欠いてそれかよ。(プ
数学の定義を持ち出して反論してくるかと思って
身構えた俺がバカだった。(w
レベルが低くて話にならんな。ただの煽りか。
0921デフォルトの名無しさん
NGNG0922デフォルトの名無しさん
NGNG別に破綻してないが?(w
それに今の議論とは関係ないがそういう一面もあるだけだしな。
0923デフォルトの名無しさん
NGNG自分だけの考えに固執してもしょうがないぞ(w
0924デフォルトの名無しさん
NGNG無いとして、例外一つ挙げただけで「そういう
一面もある」が破綻かい?(w
0925デフォルトの名無しさん
NGNGお前がな。
0926デフォルトの名無しさん
NGNG0927デフォルトの名無しさん
NGNG手順とは思ってないね。手順をまとめたという
側面で捕らえることもできるがね。(w
もうちょっと具体的に反論しろよ。
0928デフォルトの名無しさん
NGNG手順をまとめたという側面で捕らえる時点で痛いな(w
関数の定義は思い出せたかね(w
0929デフォルトの名無しさん
NGNG関数は手順をまとめたものということも
できると言うことだ。
数学的定義でなく「日常的な感覚」でな。(w
0930デフォルトの名無しさん
NGNG関数→手続き変換(似非言語)
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 のプログラムなどが置き換え可能か(意味や意義はともかく)興味深い。
0931デフォルトの名無しさん
NGNGお前は言語障害ありか?
痛いとしか言えんのか。
理由を説明する能力が無いのかね?(w
0932デフォルトの名無しさん
NGNG>できると言うことだ
できない(w
0933三村
NGNG0934デフォルトの名無しさん
NGNGていうか、関数は処理だとも言ってないし
定義には手順も含まれる。
演算子には適用の優先順位がある。
ま、でも処理とも言えると思うが。
0935デフォルトの名無しさん
NGNGなんで?(w
0936デフォルトの名無しさん
NGNG捕らえ方によっては手順と言えるだろ。
他人の捕らえ方をお前がとやかく言えないぞ。
0937デフォルトの名無しさん
NGNGできるならやってみな(w
0938デフォルトの名無しさん
NGNGお前やっぱ言語障害だ。
説明がさっぱり出来ないみたいだな。
0939デフォルトの名無しさん
NGNGまだ分からんのか(w
やってみりゃ分かる(w
0940デフォルトの名無しさん
NGNGf(x)=2x+1
xに2をかけて1を足した。
手順と言えますな。(プ
0941デフォルトの名無しさん
NGNG了解。
が、単純に手順をまとめたものじゃあないと思う。
少なくとも文面そのままは手順ではない。
あ、逆にいえば手続きは副作用の許される関数であるといえるのか(w
0942デフォルトの名無しさん
NGNGそれで全部か(w
0943デフォルトの名無しさん
NGNGまあ誰も単純に「手順をまとめたもの」が関数の全て
を完璧に表すとは言ってないんだけどね。
0944デフォルトの名無しさん
NGNG>関数は手順をまとめたものだ。
の一行だけだとそう取られてもしかたないような…
「〜ものと言える」 のような表現ならともかく。
0945デフォルトの名無しさん
NGNG確かにそれは簡単に略して言いすぎたので、913でフォローしたんだけどね。
「そういう一面もある」と。
0946デフォルトの名無しさん
NGNGfunctionは日常の用語だよ。少なくともprocedureよりはずっと良く使う。
0947デフォルトの名無しさん
NGNGそんなときに見るね。
0948デフォルトの名無しさん
NGNG関数型と手続き型のもっとも大きな違いは、
副作用の有無なんだけど。
0949デフォルトの名無しさん
NGNG0950デフォルトの名無しさん
NGNG関数型とかいいつつ副作用が有る言語が関数型の主流の
くせして良くそんなことが言えるな。
0951デフォルトの名無しさん
NGNGメソッドとデータの区別をなくす方向に行ってることだろう。
ある意味OOと逆。
0952デフォルトの名無しさん
NGNGC言語の前置/後置インクリメントなんかは
「副作用」という概念丸出しですが?
0953デフォルトの名無しさん
NGNGすべて意図通り
0954デフォルトの名無しさん
NGNG0955デフォルトの名無しさん
NGNG逆じゃないよ。C#のデリゲートなんて、メソッド
をデータとして扱う典型例じゃん。
0956858
NGNG非常に微妙な問題だが、私の解釈では少し違う。
まず、純粋なオブジェクト指向では、メソッドもデータも単独で存在する事はあり得ない。
(define オブジェクト '(識別子 データ メソッド))
という感じになるが、この中のデータもまたオブジェクトになっている。
(こういう定義は、難しいねぇ。
再帰は再帰によって定義されるからね。)
データとメソッドをいっしょにしたオブジェクトを扱うのが、OOで
データとメソッドを区別しつつ扱いが同等なのが、関数型。
逆とも言えないが、同じとも言えない。
微妙な関係だ…。
あと、C#のデリゲートはCで言うところの関数ポインタにあたるが、
主にイベント処理を扱うために考案されているので、
そのメソッドだけを取り出して、どうこうするのはC#らしくないかもしれない。
また、これはデザパタで言うところの、マルチキャストパターンにあたる。
http://objectclub.esm.co.jp/evolutionalDesignWithPatterns/index.html
0957デフォルトの名無しさん
NGNGそれで十分だろ。
実用とかけ離れた抽象的議論はくだらねぇよ。
0958.
NGNG0959デフォルトの名無しさん
NGNG- ある意味 - OOと逆。
一応ちゃんと読んでくれよな。
0960デフォルトの名無しさん
NGNGある意味ってどういう意味だ?
0961デフォルトの名無しさん
NGNG0962デフォルトの名無しさん
NGNG俺としては、お前がちゃんと読んだ上で
回答してくれればそれで良い。
今後は気をつけるように。
0963960
NGNG誰かと人違いしないでくれ。
意味がわから無いかつ説明しないことなら書き込むなよ。
最近このスレでそうやって関数型言語を無理やり批判する人物を見かけるが、
全部同一人物か?
0964デフォルトの名無しさん
NGNG技術的な議論する気はないわけだね.「メソッドとデータの区別をなくす」
という表現も意味不明.
0965縞栗鼠(シマリス)の親方
NGNG汚物入れを物色して女子生徒の使用済みタンポン・ナプキン等を
個人的に収集しているというのは事実。
中央高等学院 http://chs-f.com/index.html 中央高等学院福岡校
http://www.chuo-school.ac/
0966デフォルトの名無しさん
NGNGそれについて色々批判があったので、
他に考えられる関数型の特徴と言えば、
関数を他の関数の引数として使用できる、
つまり、それこそある意味関数が「値」でもあることなのでは
なかろうかと考えレスをしてみた。
>>964
>「メソッドとデータの区別をなくす」
>という表現も意味不明.
むしろえらそうなのはお前。
どの点が意味不明なんですか?
0967960
NGNGまあ、俺はメソッドとデータの区別をなくすとかいう表現は
そんなことだろうと思ってた。
で、それがオブジェクト指向とどういう意味で逆なんだ?
詳しく説明してくれ。
説明しなきゃわからんことはちゃんと説明しないと意味が無い。
0968デフォルトの名無しさん
NGNGしっかりしたクラス設計が欠かせないとされている。
そして、その際には、属性と方法を適切に弁別する作業が欠かせない。
つまり、「良い」OOからしてみると、
属性と方法が渾然一体となってしまうような状態は好ましいとはいえない。
一方で、関数型は、OO的に言うところの方法が
同時に属性でもあり得ることを奨励し、
そのことによってより抽象的なアルゴリズムを構築でき、
表現力が高まるとしている。
その意味においては、
両者は理想とする方向が逆なのではないかと思った。
>>964
ちゃんと説明しろよ。
どのように意味不明なのか。
0969デフォルトの名無しさん
NGNG使っている言語仕様において関数が値として扱えるからと
言って、属性と動作を混同するような人がいるとは思えない
んですが。
例えば、2という値とaddという関数を混同する人がいますか?
0970デフォルトの名無しさん
NGNGそのことによって何が言いたいのかが不明。
いるとは思えないからなんですか?
0971デフォルトの名無しさん
NGNG好ましくない状況では無いと言いたいんでは?
0972デフォルトの名無しさん
NGNGもうちょっと噛み砕いて、というか、全部まとめて説明してくれ。
0973デフォルトの名無しさん
NGNG0974デフォルトの名無しさん
NGNG0975デフォルトの名無しさん
NGNG関数型言語Part2
http://pc.2ch.net/test/read.cgi/tech/1007387924/
0976デフォルトの名無しさん
NGNG>そして、その際には、属性と方法を適切に弁別する作業が欠かせない。
>つまり、「良い」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" あるし。
0977デフォルトの名無しさん
NGNG同意。っつーか、
OO言語で「方法」を抽象できないものがあるのなら、
それはOO言語として不完全だとすら言えると思うな。
そもそも関数型とOOは直交している概念だと思うのだがなあ。
0978デフォルトの名無しさん
NGNG直交する「関数型」軸と「OO」の間に何が来るだろ…
アセとかCOBOLとかになるのかな?
0979デフォルトの名無しさん
NGNG困らないから別にいいってだけじゃん。
そんなこともわからないなんてバカすぎ。
0980デフォルトの名無しさん
NGNGしかし、お前達の議論は俺の議論を曲解している。
俺は「ある意味」といっている。
ある意味とは、in some senseと言う意味であり、
部分的にそう言える場合があると言う意味だ。
従って読解力の点で馬鹿過ぎるのは>>979
また、直交することが
どうして部分的に逆であることと排他なのかがよく分からない。
ま、他にもいうことはあるが、機会があったらな。
そんなかんじで。
じゃな!
0981デフォルトの名無しさん
NGNGやはり言語は実用されているものを例とすべきだ。
Eiffel等という正直に言って普及しているとは言いがたい言語を例とするのは、
例示としては頂けない。
現在の普及率などから考えて、C++やJavaなどを例示とすべきだ。
その手の議論は言語的な広がりがなくなる。
0982メーテル
NGNG人は、旧スレになってから粋がる奴を厨房と呼ぶわ。
0983デフォルトの名無しさん
NGNG>>980
お前も下らない書き込みする前になんか使ってみろ
おれはこれからHaskellがどんなもんかやってみる。
0984デフォルトの名無しさん
NGNG新スレにそのまま議論を持ちこめなさそうだし。
それにそんな長い内容ではないし、
いくつかレスできる分が空いてたのでここでいいかなと。
0985デフォルトの名無しさん
NGNG俺は病み上がりなんだよ。
書込みできなかったから今やってるんだよ。
0986デフォルトの名無しさん
NGNG病み上がりならマターリしてろよ(ワラ
0987デフォルトの名無しさん
NGNG困らないからいいじゃんなどと言う議論には意味がない。
というより、有害ですらある。
それは、今のプログラミングスタイルでも困らないから
OOはいらないといっている連中と同様の論法にたつものだ。
ソフトウェア工学であれ計算機科学であれ、
少しでもよいもの、望ましいものを目指すべきであり、
そのような延長線の中に関数型なりOOなりは位置付けられるべきだ。
その意味でもお前は明らかに馬鹿だ。
0988デフォルトの名無しさん
NGNG0989デフォルトの名無しさん
NGNGそれ、つかってりゃいいじゃん。なんでこんなところに
くるんだよw。
0990デフォルトの名無しさん
NGNG0991仕様書無しさん
NGNG0992デフォルトの名無しさん
NGNGこんなのみるとパフォーマンスは悪くないようだ。
0993デフォルトの名無しさん
NGNGなんで、よりによってHello Worldのページを選んだの?
0994デフォルトの名無しさん
NGNGプログラミングはhelloworldからだし。。
ところで、
英語で書かれたよいチュートリアル知りませんか?
0995デフォルトの名無しさん
NGNG今hello worldコンパイルしてみたけど、
結構時間かかるんだね。ghcのversionは5.02。
0996デフォルトの名無しさん
NGNG素直にHugs使ったら?
0997デフォルトの名無しさん
NGNG勉強にはそっちの方がよかったかもね。
ちと、カコつけてしまった。こんな大きな
ものはどうせ使いこなせないだろうし。。
という訳で#apt-get install hugs開始w
0998デフォルトの名無しさん
NGNGという訳でこのスレも終わりになりそうなので、
続きはHaskellスレにて質問させてください。
どうもありがとう。
0999デフォルトの名無しさん
NGNG10001000
NGNG10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。