トップページtech
983コメント385KB

関数型プログラミング言語Haskell

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001デフォルトの名無しさんNGNG
あまり馴染みのない人の多い関数型プログラミング。
Haskellを通じて、みんなで勉強しましょう。
0809デフォルトの名無しさんNGNG
1から10万までの総和を求める問題で、($!)を使って末尾再帰と
して一応決着がついたが、どうも($!)を使って強制評価させるの
はhaskellらしくない。
そこで、haskellらしくストリームを使ってやってみた。
nat = 1 : map (+1) nat
acc = 0 : zipWith (+) nat acc
natは自然数のストリーム、accはある数までの総和の
ストリーム。
10万までの総和はacc !! 100000。しかし、ダメだった。
ERROR - Garbage collection fails to reclaim sufficient space
だって。
なんか、よい方法ない?
0810デフォルトの名無しさんNGNG
>>809
ghci 使ってみた?
0811810NGNG
ghcはじめて使った。

やはり、だめみたい。10万まではOKだけど、100万で
stack over flow
0812デフォルトの名無しさんNGNG
>811
訂正。名前まちがえた。オレは809だった。

1から100万までの整数の総和を求めよ。
ただし($!)やそれを含む関数を使うな。
この問題の解法だれかたのむ。
どうも気になる。
0813デフォルトの名無しさんNGNG
(1+100万) * 50万
で求められるんじゃないの?
0814デフォルトの名無しさんNGNG
ガウス少年、その手は小学生にはダメよ。

こころは、ハスケルの遅延評価の枠組みの
なかで、メモリー爆発させずに計算できるか
ということなんです。
0815デフォルトの名無しさんNGNG
Haskellの基礎的なことを一通りわかった(つもり)になったので、
Haskellのライブラリをながめてみた。
なんかHaskellって天才向けの言語なんだろうかと思えてしまう。
よくそんなこと思いついたよなあ、ということが満載。
0816806NGNG
>>808
レスが遅れてすいません。
返事有難うございます。
うーん。
私は英語がにがてなので、紹介してくれた本は読めないかな?
もう少し独学でがんばってみます。
0817デフォルトの名無しさんNGNG
モナドは一応理解した。
で、おもったのだが、
モナドってどうやって使いこなせるのだろう?
CategoryTheoryの知識とかがないと、掴みきれないのだろうか。
なんか凄いとは思ったが、これを使いこなしている自分は思い浮かばないなあ。
0818デフォルトの名無しさんNGNG
自分でモナドを作れるくらいやりこんでおる人はここに居るのでしょうか?
0819デフォルトの名無しさんNGNG
モナド使うったり作るのは簡単じゃん?
モナドを理論的に解説するのは難しいけど。
0820デフォルトの名無しさんNGNG
>>819
モナドをつかったライブラリを・・ってことじゃないの?
0821デフォルトの名無しさんNGNG
モナドって何か隔靴掻痒の感があるな。
特に根拠はないけど。
0822デフォルトの名無しさんNGNG
>>821
いや,手続き型を先に知った人は誰でもそう感じるんじゃないかな.
わざわざ複雑なことをしたあげく,できるのが手続き型ではごく当り前のこと.
0823デフォルトの名無しさんNGNG
>>822
そうかなぁ?
Gentle Introduction の monad のところに載ってるやつぐらいでも
手続き型では結構大変そうな感じが…。
0824デフォルトの名無しさんNGNG
I/Oモナドと状態モナドを理解出来るかどうかが
入門の障壁になってるというか、λ教に入信する為の
イニシエーションという感じだね。
Cのポインタみたいに。

Haskellがメジャー言語だったら、書店には
『Haskellモナド完全制覇』とか『秘伝Haskell問答 モナド編』とか
のタイトルが並んでいそうだ。
0825デフォルトの名無しさんNGNG
>>824
>『Haskellモナド完全制覇』

めっちゃ欲しいよ〜。
誰か書いて〜。
0826デフォルトの名無しさんNGNG
>>822
>わざわざ複雑なことをしたあげく,できるのが手続き型ではごく当り前のこと.

そう思えるのであれば、まだモナドを深く理解していないと思います。
もし単に手続き型にすぎないなら、モナドを剥き出しにする必要は無く
Doの糖衣構文で覆ったままにしておけば済むはずですし。

モナドは(私もよくわかっていないが)、それ以外に色々な使い方が可能。
よくわからないが、けっこう不思議な道具なかんじがする。
0827名無しさん@お腹いっぱい。NGNG
Lispの処理系の乱立に嫌気が差してきたんだけど、
Haskellの場合はまともな処理系はGHCで決まりという
ことになってるのかな?
もしそれならHaskellやってみたいし、GHCを使って
なにか使えるものを作りたい。
0828デフォルトの名無しさんNGNG
ああ、あれな
藤崎奈々子も使ってる。
第一位な奴な
0829デフォルトの名無しさんNGNG
え、藤崎奈々子がHaskelプログラマ?マジ?
0830一応ツッコミNGNG
>>828
それは DHC (化粧品) だろ!
0831デフォルトの名無しさんNGNG
モナドは、なんか犠牲にしているような気がするな。
なんというか、プログラマからみての明らかさというか
そんな感じのものを。
0832デフォルトの名無しさんNGNG
>>826
> もし単に手続き型にすぎないなら、モナドを剥き出しにする必要は無く
> Doの糖衣構文で覆ったままにしておけば済むはずですし。

Monadにdoのsyntax sugarがあるのは、Monadのユーザーは
普通doですべてこと足りるからでしょ。実際、入門の段階でMonadを
扱うときはdoでシーケンシャルな処理が簡単に書けますよ、っていう
例題が普通だし、それを見て手続き型を知ってる人達が、なんでそん
な難しいことをするのかと感じるのは当然でしょう。実際遅延評価のお
かげでストレートにシーケンシャルな評価をさせるのは難しくなっちゃ
ってるわけだし。結局Monadの肝は、順番に評価を実行して、それを
環境に反映させてさらに次の評価に移る、ということを(lawsに従っ
たMonadであれば)遅延評価の枠組を壊さずきちんと実現できる点に
尽きると思います。

doが(>>=)や(>>)Nおsyntax sugarになっている理由はユー
ザが独自のMonadを定義する際に、きちんとlawsに従ったものにさ
せるためですよね。doだけになっちゃたら、Monadクラスの型は定
義できなくなっちゃうじゃないですか。
0833デフォルトの名無しさんNGNG
>>832
モナドの処理がdoを使えば手続き型と同じ書き方になるんだなとは
思ったけど、難しいとは思わなかった。同じだと思っただけ。
0834デフォルトの名無しさんNGNG
継続をモナドで実装するとか、
チュートリにある、計算ステップを制限した手続き型計算とか、
ああいうのをみると凄そうだなと思うな。
0835デフォルトの名無しさんNGNG
コンカレントのライブラリが、あれでどうしてコンカレントになってしまうのか
不思議で眠れません
0836デフォルトの名無しさんNGNG
Concurrent Haskellって、マルチCPU環境だと
スレッドを意識して書かなくても勝手に
ものすごい勢いで計算出来たりするわけ?
0837デフォルトの名無しさんNGNG
今チュートリアル読みながらやってるけど、
なかなか難しいね。馴れが必要かも。

皆さん最初は何で勉強されました?

0838デフォルトの名無しさんNGNG
>>837
難しいよね。Haskellは。
0839デフォルトの名無しさんNGNG
>>837
東京工科大学のテキストでツカミを得てから、
この本↓を読むのが分かりやすいと思う。
http://www.cs.ukc.ac.uk/people/staff/sjt/craft2e/

手に入れやすいもう一冊の本、『〜THROUGH MULTIMEDIA』の方は
ちょと難しい。
0840エフェドリンながヰNGNG

  /       /       | \        ヽ
  /i.     /   ,,,,,;;;;=:::...、  ヽ       i
  |    ∠,,,   '''  __  `   i.       |
  /|   i'´   ヽ   ,. 'i'''''i>、    !      !
  ! !   !,;i'''(''`;, :.   ':‐`'''´`     `i      .|
   トi、 .| ''''´´             ;| i     !
    ヽ. !    .    .        /!;//   i'
     `!:.    :..、.‐'' '        / //   i'.  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
     ヽi.    ,___,、       ./ //   ./.  |
      ノ| ;  .:',.r==‐`‐     / // _   〈 < コレ、気持ちいいかも……‥‥・・・
      ノノ;ヽ ヽ:::::::'''´      /´ ,!    !  | http://www.puchiwara.com/hacking/
     ' '´  \       .::  ´   /,、,,; ,!.  \_______________
          ` ;,、__....:::::       。・.,;;::::.
           ````ヽ      。::';=''´ ``、
               `i   ,,。;:':;''´   ::..、:、
            ,.:::‐‐,; .,,;:;':':'''`       ヽ:、
          ,.:''´  ;:iレ;:''             ::.
         .,i  .:。´'':;''   :.            :.
         i /,:;..,:;''    .:.            :.
         ,ノ '..;:;':;''      :.             :
       ..:' 。;''´´       .            :.
      人,,:;'`'         :.:..:.            :.
     ノr'' ̄`‐::.、        . :. :           .i
    /,:;''    ノ \_       :. :.、           i
    /`´   /    `‐::.、    ` :.           :、
   ./   ./        ``‐::.._   :.          i
   i   /            / `::..、ヽ          :、
   !.  /            /    ``:.          :、

0841デフォルトの名無しさんNGNG
http://research.microsoft.com/~simonmar/hws.tar.gz
マイクロソフトの次期IIS、Haskellで作るられるらしいです!!

とりあえず例題ばかりじゃつまらんだろうから一応。
0842デフォルトの名無しさんNGNG
>>841
これも、Concurrent Haskellなんだね。
この前見たGUI系の奴もConcurrent使ってたなぁ。
0843デフォルトの名無しさんNGNG
MLのほうが簡単ぽいのでMLに浮気します・・
無念。
0844デフォルトの名無しさんNGNG
知らない間にMLスレが立ってますね。
ところで、MLに比べてのHaskellの特徴・利点欠点とはなにでしょうか。
0845デフォルトの名無しさんNGNG
遅延評価だろ。なんつっても。
良くも悪くも。

理想的には遅延評価によって無用な計算を避けられるはずなんだが、
現実にはHaskellはMLより効率悪い(と云われている)。
0846デフォルトの名無しさんNGNG
>>845
StandardMLでは遅延評価は仕様外だが、
独自に装備している処理系も多いッすよ。

遅延評価だけでは両社の差とは言いにくいと思いますが、いかが?
(私はHaskell知らず)
0847デフォルトの名無しさんNGNG
>>846
補足、
部分的に遅延にできる機能を、です。
0848デフォルトの名無しさんNGNG
遅延評価は無限データ構造を扱えるようにするためだろ?
あと関連するがノンターミネーションをなくす為。
無駄をなくすとかじゃないだろ。
理想的にも何も無駄は増えるよ。当たり前じゃん。
0849デフォルトの名無しさんNGNG
ちょっと奥さんこれマジよ?
こんなもん作ってるとは。

'Quake Haskell'
http://www.dtek.chalmers.se/~d95jowi/quakehaskell/index.html
0850デフォルトの名無しさんNGNG
>>849
これ、何語?読めません(笑
なんとなくは解るけど。
0851デフォルトの名無しさんNGNG
swedish?
0852デフォルトの名無しさんNGNG
>>850
すえーでんじゃないかな。わたしも読めません。
>>846
でもそれがデフォルトにはなっていないでしょう。
わたしはMLを知らないけど、Haskellのプログラミングは、
Schemeで「いつでもdelay/forceを使う」のと同じようなものでは?
もちろんそれとは違ってHaskellのプログラミングは「自然に」そうなるのでしょうけど。
0853デフォルトの名無しさんNGNG
>>848
評価する必要のない物を評価しないってことで
多少無駄が減るって話もあるかと。
0854デフォルトの名無しさんNGNG
>>848
ちがうと思うな.関数型言語を設計するにあたって本当に欲しいのは遅延評価
じゃなくてcall-by-nameでしょ.ただ,工夫しないでcall-by-name
にすると問題が多すぎるから,遅延評価にしているわけで.
0855デフォルトの名無しさんNGNG
http://www.sampou.org/haskell/article/whyfp.html
遅延評価の意義についてはここに述べられているが?
0856デフォルトの名無しさんNGNG
>>855
それは、遅延評価を採用するとこういう良いこともあるよ、というお話。
0857デフォルトの名無しさんNGNG
haskellやったからといって、すごいプログラムが書けるとかは、
全然期待してないけど、すこし数学がわかるようになる副作用を
期待している。
0858 NGNG
>>854
だからそれはノンターミネーションの話でしょう
0859デフォルトの名無しさんNGNG
>>858
違う。call-by-name そのままだと、同じ評価を繰り返すことになりやすい。
それを防ぐため。nonterminationとは全く別の話で、簡単に言えば無駄をな
くす、ということ。
0860 NGNG
>>859
しかし値渡しからすれば無駄でしょう
0861デフォルトの名無しさんNGNG
>>859
そのためのGraphだ
同じ文脈(関数内?)に現れる同じ名前のものは同じものを指すという
参照透明性を利用することで解決している。
同じ名前のものの実態は、1つに共有するようにしている
0862デフォルトの名無しさんNGNG
>>859
call by nameとか遅延評価とかじゃなくて、
inner-most reduction, outer-most reduction, graph reduction
で説明したほうがわかりやすいと思う。
inner-most reductionはcall by valueに相当して、strictであり、
計算上必要ない引数まで評価してしまう。
outer-most reductionとgraph reductionは遅延評価の実装で、non-strictであり、
計算上必要ない引数を評価せずにすむ。
うち、outer-most reductionはナイーブなcall by nameの実装。
graph reductionは副作用がなければcall by nameと等価だが、
同一式が無駄に複数回評価されるのを防ぐことができる。
0863デフォルトの名無しさんNGNG
>>862
で,結局ノンターミネーションとの関係は?
0864デフォルトの名無しさんNGNG
すみませんです
通りかかりです

|call-by-name , nontermination , call-by-value
|inner-most reduction, outer-most reduction, graph reduction

もしよろしければでいいんですが、
これらの用語についてぜんぜん初心者である私らに簡単な説明をして
頂けませんか?
0865デフォルトの名無しさんNGNG
>>862
遅延評価でnon-terminationを避けることができる。
0866デフォルトの名無しさんNGNG
call by name, call by reference
 関数fが定義されているとして、f(1+1)を計算する時に
 1+1を計算して2という値を渡すのがcall by value。
 1+1という式(名前)を渡すのがcall by name。
 call by nameは手続型言語ではAlgol、関数型言語ではMiranda, Haskelなど
 call by valueは大部分の手続型言語と関数型言語ではML, Lispが採用している。
0867デフォルトの名無しさんNGNG
reductionの戦略
 関数doubleがdouble(x) = x + xと定義されていて、double(1+2)を計算する時、
 double(1+1)→double(2)→2+2→4といった具合に式の内側から計算していくのがinner-most reduction。
 double(1+1)→(1+1)+(1+1)→2+(1+1)→2+2→4と、式の外側から計算していくのがouter-most reduction。
 一方、関数ifがif(true, x, y) = x, if(false, x, y) = yと定義されていて
 if(true, 1, 1+2+...+10)を計算する時には、
 inner-most reductionではif(true,1,1+2+...+10)→...→if(true,1,55)→1
 outer-most reductionではif(true,1,1+2+...+10)→1となり、余分な計算を避けることができる。
 inner-most reductionはcall by valueに相当する。
 outer-most reductionはcall by nameに相当する。
 副作用およびnon-terminationおよび計算量を除けば両者は同じ値が求まる。
graph reduction
 double(1+1)の例で見たように、outer-most reductionでは
 引数で渡ってきた式を複数回計算してしまうことが多い。
 graph reductionでは式をグラフ構造で表現し、double(1+1)は
 double(* + *)
  | |
  +---->1 + 1 (実際はちょっと違うけど、まあわかりやすく)
 というグラフ構造で表現される。
 ここで1+1はx+xの中で2回出現しているが同一ノードに参照されているから
 double(1+1)→(1+1)+(1+1)→2+2→4という具合に計算されていき、
 1+1は1度きり計算されるのみである。
0868デフォルトの名無しさんNGNG
non-termination
 このスレの文脈では、
 無限リストなど、完全に値を求めようとすると計算が終了しない式を扱う時、
 inner-most reductionでは当然、計算が終了しないことになる(non-terminationの問題)。
 outer-most reductionやgraph reductionなどにより遅延評価をおこなうことで
 無限リストなどのうち必要な部分のみを計算することで、non-terminationの問題を避けることができる。
 もちろん、遅延評価ならどんな式でも計算が終了するというわけではない。
0869 NGNG
>関数ifがif(true, x, y) = x, if(false, x, y) = yと定義されていて
>if(true, 1, 1+2+...+10)を計算する時には、
>inner-most reductionではif(true,1,1+2+...+10)→...→if(true,1,55)→1
>outer-most reductionではif(true,1,1+2+...+10)→1となり、余分な計算を避けることができる。

そんなこと言うけど
実際に実装してみたら、値渡しの方が無駄がないよ。
シンプルだし。
0870 NGNG
やっぱり、無駄なのに敢えてやる実益を考えてみるならば、
ノンターミネーションの為であり、
ひいては無限の為でしょう。
0871デフォルトの名無しさんNGNG
>>869
>実際に実装してみたら、値渡しの方が無駄がないよ。
>シンプルだし。

宣言的プログラミングという理想からすると、そのプログラムが
「何を求めるか」だけ宣言すればよく、「どのように求めるか」
はコンピュータに任せることができる、というのがゴールでしょ
う。多少計算に時間がかかっても「その解法が正当かどうか」を
検証する手間を省けるなら、その方が嬉しいことも少なくないだ
ろう?
0872 NGNG
>>871
それは遅延評価と関係あるのかな。
関係あるとしても導入の理由かな?
というか、それは副作用の話では?
0873デフォルトの名無しさんNGNG
最後までHaskellを使うとしたら、どんな処理系を使うんだろうage
0874デフォルトの名無しさんNGNG
>>873>>841のことでしたsage
0875デフォルトの名無しさんNGNG
>>866
>>867
ありがとうございました、勉強になりました。
なんの議論かようやくわかりました。

>>873
個人的にはGHCと関連のライブラリだけでできそうな気がします。
Haskellは、いろんなモノがそろっててすごいと思った。
日本では全然マイナーだから机上の言語と思っておりました。

にしても本当なんでしょうか?
マイクロソフトがHaskellだなんて、ラティンとブッシュが手打ちしたようにも
思えるのは私だけ?
0876デフォルトの名無しさんNGNG
>>872
別に副作用だけの話じゃないだろ。
よーするにcall by nameだのreductionの戦略なんてのは
実装上の問題にすぎないわけで、
真に宣言的プログラミングを実現しようとすれば、
そんな事気にしなくてよいほうがいいに決まってるじゃん。
だったら、より安全かつ効率もそこそこいいgraph reductionが
現状では一番理想に近いっつーことでしょ。
0877デフォルトの名無しさんNGNG
>>873-875
次期IISってのはネタかと。
http://www.haskell.org/~simonmar/abstracts/web-server.html
0878デフォルトの名無しさんNGNG
>>876
純粋に数学的な関数を実現しようとすると参照透過性って必要にならない?
で、参照透過性って、プログラミング言語ではcall by nameがそうな
んじゃないの?だから実装の問題だけとも言えないような…
0879デフォルトの名無しさんNGNG
>>878
call by nameが参照透明性を保障するわけではない。
参照透明性が保障されていればcall by nameでもcall by valueでも
同じ結果が求まる(ただしnon-terminationは除く)っつーこと。

ちなみにAlgolは手続型言語だがcall by nameをサポートしていた。
0880デフォルトの名無しさんNGNG
>>879
じゃ参照透過性はどうやって実現するの? 例えばHaskellでは、
何が参照透過性を実現するために必須のコンポーネントなの?
0881デフォルトの名無しさんNGNG
>>880
強いて言えば、もなーど。 #そっか、だから2chで人気なのか...

参照の透明性自体は破壊的代入などの副作用を起こすものや非決定性を
言語やライブラリから排除する事で達成できる。
でもそれじゃ外部I/Oなんかを扱うのに困っちゃうから、関数型言語では
それぞれ工夫して折り合いをつけている。
Mirandaなら無限リスト、Haskelならmonad。
っつーか、武市先生の「関数プログラミング」とか読んでみれば?
0882デフォルトの名無しさんNGNG
はっはっは、昨日関数プログラミングのテストだったよ。
全部解けちまったよ。はっはっは。

そらそーだよな。簡単だったもん。
「関数プログラミング」の6章までが範囲でした。
ドキュソ学生でスマソ。
0883 NGNG
>>876
現実には、遅延評価はプログラムの正当性を検証しやすくする方向に
働くとは限らないでしょう。
同じことを繰り返すが、
遅延評価とプログラムの正当性の検証しやすさは余り関係ないと思うが。
理想的ともいいきれないと思いますよ。
0884デフォルトの名無しさんNGNG
というか、遅延評価と正当性の関係及び
遅延評価と参照透明性の関係をいう人は、
その例を示して欲しいと思います。
特に正格評価との比較において。
0885デフォルトの名無しさんNGNG
>>883
じゃ,なんでHaskellは遅延評価を採用しているの?
0886 NGNG
だからノンターミネーションを防ぐ為でしょう。
何度もいいますが。
0887石敢當NGNG
与えられたリストの長さが有限か無限かを調べる

isFinite :: [a] -> Bool

のような関数というのは簡単に作れるものなのでしょうか。
ちょっと考えてみたりライブラリを調べてみたりしてみたのですが
良く分かりません。何に使うというわけでもないのですが、
なんとなく気になっています。
0888デフォルトの名無しさんNGNG
Network Information: [ネットワーク情報]
a. [IPネットワークアドレス] 61.207.0.0-61.207.255.0
b. [ネットワーク名] OCN
f. [組織名] オープンコンピュータネットワーク
g. [Organization] Open Computer Network
m. [運用責任者] AY1361JP
n. [技術連絡担当者] MO081JP
n. [技術連絡担当者] KK551JP
n. [技術連絡担当者] IM657JP
p. [ネームサーバ] ns-kg001.ocn.ad.jp/61.207.56.0-61.207.255.0
p. [ネームサーバ] ns-kn001.ocn.ad.jp/61.207.56.0-61.207.255.0
p. [ネームサーバ] ns-os001.ocn.ad.jp/61.207.0.0-61.207.37.0
p. [ネームサーバ] ns-os001.ocn.ad.jp/61.207.42.0-61.207.55.0
p. [ネームサーバ] ns-tkb01.ocn.ad.jp/61.207.38.0-61.207.41.0
p. [ネームサーバ] ns-tkb02.ocn.ad.jp/61.207.38.0-61.207.41.0
p. [ネームサーバ] pns.ocn.ad.jp/61.207.0.0-61.207.37.0
p. [ネームサーバ] pns.ocn.ad.jp/61.207.42.0-61.207.55.0
y. [通知アドレス] [email protected]
[割当年月日] 2001/05/08
[返却年月日]
[最終更新] 2002/01/28 10:53:02 (JST)
[email protected]
0889デフォルトの名無しさんNGNG
>>888
嬉しそうだな。
0890デフォルトの名無しさんNGNG
>>887
なんか直観的にはできなさそうですね。
ちょっと問題を拡大して、任意の表現式のterminationを返す関数について、
任意の式のterminationを返す関数willTerminateが定義できると仮定して
対角線してみたらどうでしょうか?
0891デフォルトの名無しさんNGNG
>>883
>>876にはプログラムの正当性や検証の話は全然出てこないのですが。
0892 NGNG
>>891
しかし、>>871は正当性の話をしているでしょう。
それに対する応答として>>872があって、
>>876はその872の応答なのだから、
当然正当性の話でしょう。
0893871NGNG
なんか粘着君だねえ。そういう書き方されると説明したくなるなるよ。

たしかに俺の書き込みはちょっと飛躍があったかも知れない。
それで混乱させたんなら悪いと思う。

正当性について述べたのは「なぜ宣言的プログラミングが必要か」を
述べるためでであり、「なぜ遅延評価が必要か」を直接述べたわけで
はないよ。誤解させたのならすまん。

で、宣言的プログラミングには遅延評価が必要なわけだ。
いつでも遅延評価が必要なわけではないし、
遅延評価ではまずいこともある。
でも、宣言的プログラミングを実現するにあたって、
遅延評価が「不必要」ってことはない。

Haskellは宣言的プログラミングを完全にサポートしているわけではない。
しかし、そこに近づくためのひとつの実験だと、僕は考えている。
とりわけ遅延評価の重要性と問題をともに検証するための実験だと。

その点、MLはぐっと実用上の理由から設計された言語だと思うんだ。
少なくとも宣言的プログラミングを目指してはいないでしょう?

僕はこういう理解で871を書いた。
間違ったことを書いているかも知れない。
それは指摘してください。
でも、書きたかったことはこういうことです。
0894デフォルトの名無しさんNGNG
>>887
チューリング機械のエミュレータを関数で作る。
関数は機械の状態遷移図と初期状態を引数にとり、
1ステップおきの状態のトレースをリストで返す。
そうすれば、リストが有限であることと
初期状態から状態を遷移させ、終了状態に至ることは同じになる。
ということはもしisFiniteがあったらチューリング機械の停止性が
判定できてしまう。だが、これはできないことがわかっているので
そもそもisFiniteは書けないと思われ。
0895デフォルトの名無しさんNGNG
>>894
この問題ってrecursiveだけれどenumerableでない典型ですよね.
0896デフォルトの名無しさんNGNG
>>894
そりゃそうなんだ。
リスト操作しかできなかったら、そうやって即答できる。

でも無限リストとして定義されている、というところを触れれば判定できてしまう。
できるかねえ?
というかそこまで判定したかったら、リストを拡張してしまえば・・ってそれじゃ
リストの判定ならない?
0897876NGNG
うーんと、俺は871が
> 多少計算に時間がかかっても「その解法が正当かどうか」を
> 検証する手間を省けるなら、といっているのは、
-----------
値渡しの場合には各引数のcannonical formを求める手続きの停止性を
正当化しなければならない。
遅延評価を使えば、少なくとも各引数の停止性を正当化する必要がない分だけ
「何を求めるか」に集中することができる。
--------------------------
って事だと解釈した。
つまり、遅延評価でのプログラムの検証がどうこうということではなく、
値渡しでのプログラムでは正当化しなければならない事が増える、って事。
あってる?>871

あと、俺はHaskelなどのlazy evaluationを理想とは思っていない。
ただ、値渡しに比べればより宣言的プログラミングの理想に近いとは思う。
0898デフォルトの名無しさんNGNG
些細な事だが、HaskellはLが2つ。
0899 NGNG
え?
ここでの正当性の話というのは正当性のテスト又は
部分正当性の話ではないのか?
ターミネーションの話ならば、私の話とどう違うんでしょう?
0900871NGNG
>>897
>つまり、遅延評価でのプログラムの検証がどうこうということではなく、
>値渡しでのプログラムでは正当化しなければならない事が増える、って事。
>あってる?>871

うん。というか、値渡しだと、処理順序を特定することなしに
手続きの停止性は決定できないわけだから、必然的に処理順序
を特定することになる。つまり「アルゴリズム」を記述しなけ
ればいけなくなり、アルゴリズムの正当性を(言語処理系の責
任ではなく、プログラマーの責任において)保証しなければな
らなくなる。つまり、それは宣言的プログラミングではない、
ということだと。

あ、そうでもないか。言語処理系が任意のアルゴリズムの正
当性を決定できれば良いのか。できるのか?
0901899NGNG
私は、遅延評価の意義をターミネーションの為だといったものです。
0902デフォルトの名無しさんNGNG
>900
>> あ、そうでもないか。言語処理系が任意のアルゴリズムの正
>> 当性を決定できれば良いのか。できるのか?
それはNP完全なのでは?
0903デフォルトの名無しさんNGNG
ghc-5.03でたよー!
変更点をコピってきました。

・ The type system now supports arbitrary rank polymorphism,
  given appropriate type annotations.

・ Heap profiling has had a major overhaul and now supports
  retainer profiling and biographical profiling ala nhc98.

・ Major improvements to the native code generators.
  You can now compile any and all code through them,
  including the Prelude.

・ The FFI syntax has been updated to match the latest version
  of the FFI Haskell 98 Addendum.

・ newtypes support deriving *any* class for which the underlying
  type is also an instance.

・ Linear implicit parameters: a highly experimental feature.
0904デフォルトの名無しさんNGNG
>>903
訳せ〜

・・っちゅうか英語を日本語に直す作業くらい私でもできんことはないが、

1.用語を正しく訳せるかあやしい
2.変更点の持つ意義についての解説がさっぱり

ということで、どなたかお願いします。
0905デフォルトの名無しさんNGNG
山形浩夫が Haskell 本を2冊も買ってるよ。
http://www.post1.com/home/hiyori13/buy/buy1.html
この人あんまりプログラミングとかしない人だと思ってたのだが…
つか時期的にアレだな、このスレの影響である可能性も無くもないな。
0906デフォルトの名無しさんNGNG
つーか山形センセ、"L"が一つ足りません、、
0907デフォルトの名無しさんNGNG
>>906

山形せんせ、いきなりHaskellではなくて、
MLをUllmanの翻訳本→大堀先生の本で「斜め読み」してからHaskellにしたほうが
いいかもしれないです。

いや、Haskellに敵対するつもりはないです。
がっこの先生いわく、ML(からの)方がやさしいし、関数型でのコードの書き方もわか
って挫折しにくいとか。
いきなりHaskellでくみ出すとコードが書けないこと多しとかで。

#わたしもこの路線でべんきょしとります。
#こけた人はこの迂回路を試して見てください。
0908デフォルトの名無しさんNGNG

こらっ!山形!
プログラムのしろーとがいきなりHaskellに取り組んでどうする!


Tcl/Tk【+Cで機能拡張】でもやっときなさい。

いや、結構マジです。
なぜなら、言語内部で戯れていただくより、
アプリケーションで世界と戯れていただきたい。
微妙に絶妙なアプリを作って我々を笑わせてください。

#Tcl/Tkなら、山形著のプログラム解説本が拝めるかもしれないし(笑
レス数が900を超えています。1000を超えると表示できなくなるよ。