トップページtech
990コメント380KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2012/01/02(月) 22:19:28.26
haskell.org
ttp://www.haskell.org/

日本語サイト
ttp://www.sampou.org/cgi-bin/haskell.cgi
ttp://www.shido.info/hs/

過去ログ
関数型プログラミング言語Haskell
Part1 ttp://pc.2ch.net/tech/kako/996/996131288.html
Part2 ttp://pc2.2ch.net/test/read.cgi/tech/1013846140/
Part3 ttp://pc8.2ch.net/test/read.cgi/tech/1076418993/
Part4 ttp://pc8.2ch.net/test/read.cgi/tech/1140717775/
Part5 ttp://pc8.2ch.net/test/read.cgi/tech/1149263630/
Part6 ttp://pc11.2ch.net/test/read.cgi/tech/1162902266/
Part7 ttp://pc11.2ch.net/test/read.cgi/tech/1174211797/
Part8 ttp://pc11.2ch.net/test/read.cgi/tech/1193743693/
Part9 ttp://pc11.2ch.net/test/read.cgi/tech/1211010089/
Part10 ttp://pc12.2ch.net/test/read.cgi/tech/1231861873/
Part11 ttp://pc12.2ch.net/test/read.cgi/tech/1252382593/
Part12 ttp://hibari.2ch.net/test/read.cgi/tech/1272536128/
Part13 ttp://hibari.2ch.net/test/read.cgi/tech/1286706874/
Part14 ttp://hibari.2ch.net/test/read.cgi/tech/1299385928/
Part15 ttp://hibari.2ch.net/test/read.cgi/tech/1310199414/
Part16 ttp://toro.2ch.net/test/read.cgi/tech/1317958045/
0446デフォルトの名無しさん2012/01/29(日) 13:23:33.53
>>441
今はサイト自体(と運営会社)が無くなっちゃったけど、Haskell入門以前という、プログラミング全くの初心者向けのブログ書いてたんだ
(そして、ネット上の友達(プログラミング未経験者)に読んでもらって、理解できるか確認しながら書いてた)

その関係で、PCがどうやって動いてるかも理解できてない人向けの言語を探してたり
そういう意味で、Haskellは割りと有効だとは思ってたんだけど、このswap関数でちょっと心が揺らいでたり
(変数の概念とかも数学から離れていないと言う意味で、数学+α程度の知識でプログラミングできる言語だと思う)
0447デフォルトの名無しさん2012/01/29(日) 13:24:16.02
>>443
Array=配列 ですが、何か
0448デフォルトの名無しさん2012/01/29(日) 13:24:26.38
まーたこれで数日後にRubyスレが荒れるのか
0449デフォルトの名無しさん2012/01/29(日) 13:26:31.49
>>444
ん・・・
それって、結局Haskellのやり方と同じことを手続き型言語でもリストのswapの勉強の際には教えるってこと?
0450デフォルトの名無しさん2012/01/29(日) 13:28:51.88
>>445
何というか・・・
行間嫁よ
そんなの当たり前だろ
0451デフォルトの名無しさん2012/01/29(日) 13:31:51.09
>>448
rubyの場合、リストっぽく使える配列だね
pythonとは名前が逆だけど、実装は何が違うんだろう?
0452デフォルトの名無しさん2012/01/29(日) 13:36:38.70
>>450
はあ?文脈読んでないのはオマエだろ。
>>424のリンク先のコードのswap関数の型を書いてみろよ。
どこをどう見たって、リスト/配列中の1組の値のswapだ。
型情報以上に重要な「行間」があるなら書いてみろw
0453デフォルトの名無しさん2012/01/29(日) 13:45:07.16
>>449
結果としてHaskellのやり方と同じことを初心者には教えることになるが、
そんなことが言いたかったのではないんだ

・一般的にリストと呼ばれている構造をプログラムで表現する方法
・その表現方法の上での、リストに関する様々な演算方法

リスト処理を初心者に教える入門書はこの2点を分かってもらいたくて書いている

Haskell でのプリミティブなリストの表現方法はいわゆる前方参照の単方向リストだが、
概念は他言語で表現されたリストと似ているし、表現方法が同じなら同じ方法が使える

もし swap 処理を教えるとしたら、その概念に沿って教えるのが自然だ
概念から外れた方法を理解させようとしている入門書があるなら、
その入門書は(少なくともその部分に関しては)クソだと思う
0454デフォルトの名無しさん2012/01/29(日) 14:12:10.92
>>452
視野が狭いな・・・
0455デフォルトの名無しさん2012/01/29(日) 14:25:57.63
>>453
リスト専門の入門書ってのは読んだこと無いんだが、もし在るならそうなるだろうね
Haskellでちょっと不便かな?と思ったのは配列も値が変えられないだろうという事。結局、IOモナドなり、Stateモナドなりを頼る事になりそうなのがね・・・
>>425のupdate関数は初心者にも作れるし、意外と有効かも
(全体を2回書き換える事にはなるが、コード上は交換したい値を一つずつ更新してるのは、初心者には分かりやすそう)

最近はリストなんだか配列なんだかという、(コード上の)データ構造の性質がハッキリしない言語が多くなってきたから、楽にはなったけど、データ構造の性質を教えるのにはちょっと不便になってきた気がする
(そう言う意味では、Cとかの方が生々しい意味で最適なのかも知れないが、生々しすぎて初心者には敷居が高いし・・・)
04564532012/01/29(日) 14:33:26.96
>>449
読み返したら誤解を与えそうな感じがするから言っておくが

一般的なリストの構造とリストの演算を初心者に教える過程で swap を教えるのなら、
結果としてHaskellのやり方と同じことを教えることになる、という事だからな

要素の破壊的な代入が許されるタイプのリストなら、
普通の変数同士のswapのようにテンポラリ変数を使って比較的素早くswapできるし、
そのように解説している入門書もあるだろうが、それは目的が違う
その部分の関しては、リストの構造とリストの演算を学ばせるためじゃない
(喩えは悪いかもだが、方程式の解法で移項というテクニックを教えるようなもの)
04574532012/01/29(日) 14:34:53.97
レス前にリロードしとけば良かった orz
0458デフォルトの名無しさん2012/01/29(日) 14:41:52.19
>>456
いや、ありがとう
他人に書かれてもドンマイだよ

変数の値が書き換わるのが理解出来ない初心者(かなり稀なパターン)へ手を替え品を替え説明するのに比べれば。。。

変数が箱って言う例えは誰が考えたんだよ。。。
04594532012/01/29(日) 14:48:17.90
数学で式に文字が導入された頃から漠然とした箱のイメージはあったと思う

値と変数を束縛して固定するイメージよりは、
値を入れるための箱のイメージの方が先にあったのではないか

と、大して根拠もなく個人的には思ってる
0460デフォルトの名無しさん2012/01/29(日) 15:00:35.95
>>459
それは分かる。つーか、自分も似た感覚なんだが、箱の中身がコピーされるとか、新しい値を入れると消えちゃうとかの説明がね。。。
箱じゃ無くて1個のみのスタックみたいなところてん式(追い出された値は捨てられる)の説明でもコピーが説明出来ないしね。。。

まあ、そいつがバカ過ぎなのが問題なんだけど、普通の人はメモリって何?が基準だしなぁ。。。と、基本的な事柄は紙の上で説明出来るのがベストなのかなぁ。。。とか考えてhaskellに流れ着いてたり

ちょっとコンピュータの仕組み齧れば普通の言語の方が自然なんだが。。。

04614532012/01/29(日) 15:15:26.29
>>460
私がC言語を初心者に教えている時は、一般的な「変数=箱」のような喩えではなく、
もう初めから「変数=メモリアドレスの別名」と直に教える
そして、メモリとはどういう構造か、その上でどんな事ができるかを教えてる

当然メモリって何?が基準だけど、C言語ならそこから逃げられないし
喩えると余計に分かりにくい

Haskellを初心者に教えた事は一度しかないけど、
その時も箱とかの喩え話じゃなく、「変数=値の別名」と直に束縛の概念を教えた
0462デフォルトの名無しさん2012/01/29(日) 15:36:15.61
>>461
自分も結局、変数=値の別名で教えた
おバカなその人はhaskellも無い頃の思い出だが、cpuの仕組み習ってる筈なのに(情報技術科の同級生)、全く理解出来てなかった
そこまでのバカは捨て置いても良いと思うんだけど、手続き型だとスコープの問題もあるのよね。。。
関数内でswapしたのに値が変わってない!!とか
ガッコの先生じゃ無いから、放っときゃ良いんだけど、なるべくそう言う「?」が無い言語が望ましいんじゃ無いかと

本気でプログラマ目指すなら、多分javaやC#しか使わなくても、Cでメモリの概念を直接覚える必要があるだろうな。とは思う
(C#は限定的でもポインタ残してたのは、本当に英断だった)
0463デフォルトの名無しさん2012/01/29(日) 18:06:25.05
>>454
おまえは心が狭いな
素直に自分の間違いを認めればいいのに
0464デフォルトの名無しさん2012/01/29(日) 19:00:27.45
>>463
1、リストの中身を配列に移す
2、配列で値を交換
3、配列の中身をリストに戻す

って書いてて、値の交換が何度も必要な場面で毎回リストに戻す馬鹿がどこに居るよ
行間嫁ってのは、そう言うこと
そんな応用力無い奴はプログラマになれないだろが
0465デフォルトの名無しさん2012/01/29(日) 21:03:37.16
C言語から入るとやたらとメモリの無駄遣いが
気になるのはあるね。

swapは、配列の発想から抜け出せないから出てこないだけで、
リストだと思えば、切ってポインタ繋ぎかえるだけじゃんと思いつくと思う。

Haskellだと、こんな感じか。

swap i j l = let
  (cs,d:ds) = splitAt j l
  (as,b:bs) = splitAt i cs
  in as++[d]++bs++[b]++ds

まぁ、swapくらい標準で用意して欲しい気はする。
0466デフォルトの名無しさん2012/01/29(日) 21:20:50.26
リストでインデックス指定のswapが必要になる時点で型の選択を間違ってる気がしないでもない
綺麗事だけどさ
0467デフォルトの名無しさん2012/01/29(日) 21:50:07.46
まぁ、他のリスト計算(++ や fold系、zip系など)に比べると、
swap の需要は圧倒的に少ないわな

正直、今まで必要になった事があったのかどうか思い出せん
0468デフォルトの名無しさん2012/01/29(日) 22:09:42.45
swapは、Sortに使うね。
Haskellは、Sort簡単だからあまり出番がないのかも。

でも、Sliceは欲しいな。
0469デフォルトの名無しさん2012/01/29(日) 22:38:39.26
>>468
Haskell のリストのソートに swap は使わないだろ
効率的なマージソートの実装が標準ライブラリに既にあるじゃん

ソート関数を自作してまで swap を使う理由は何?
0470デフォルトの名無しさん2012/01/29(日) 22:45:28.87
>>468
マージソートにも、クイックソートにもswap使わないけどね・・・
0471デフォルトの名無しさん2012/01/29(日) 22:52:38.26
いや、別にHaskellの話してたわけじゃないけどな。
swapって言ったらCのqsortなんかが真っ先に思いついたわけだ。

でもって、まぁHaskellじゃ使わんなと思って出番がないと書いたんだが、、、
しょうもないことに一々絡まんでも。

というか、C言語とかあんま使ったことないでしょ?
0472デフォルトの名無しさん2012/01/29(日) 23:11:17.90
>>471
絡むってほどのつもりでもなかったけど・・・
Cは確かにあまり使ってないなぁ・・・

最近は、データ構造の定義がHaskellと似てるなー・・・とか思いながら、ぼんやり復習してるけど
0473デフォルトの名無しさん2012/01/29(日) 23:18:12.48
>>471
俺も別に絡むわけじゃないが

>>468 では Haskell で swap の出番があまりない理由が
「Haskell では sort が簡単だから」に見たから

もし仮に Haskell の標準ライブラリで sort が実装されてなかったら、
swap を使って実装する気だったのかなと思って
0474デフォルトの名無しさん2012/01/29(日) 23:28:13.17
よくよく考えてみると
swapの最大の利点はデータの長さを変えずに済むことなんだよな
だから配列操作に有難がられるわけだ
0475470 de 4722012/01/30(月) 00:04:53.69
>>473
ごめん・・・
標準でsortあるの?
Haskell入門中で、マージソートもクイックソートも自作したけど、swap使わんかったんで書き込んだんだけど、sort関数あるの知らんかった・・・
ソートって、基本、交換じゃなくて、並べ替えだから、リストの切り貼りで出来るから、swap要らんという意味だったのかと・・・
たぶん、純粋に交換したい時しかswap使わないと思われ
要素が少なかったら、コード上で直接交換できるし・・・

--3要素のリスト限定。(大抵、こういう処理はタプルでするっぽいけど)
swap3rd a:b:c:[] = c:b:a:[]


0476デフォルトの名無しさん2012/01/30(月) 00:12:01.81
>>475
> Haskell入門中で、マージソートもクイックソートも自作したけど

それは大変素晴らしいことだ

ただ、ソート関数自体は Data.List に既にある
ライブラリドキュメントを見てみ
(そのドキュメントからソースの中身も見れる)
0477デフォルトの名無しさん2012/01/30(月) 00:29:00.75
>>476
・・・orz
ま、まあ、元々アルゴリズムの勉強不足だったから、良いんですけどね・・・
0478デフォルトの名無しさん2012/01/30(月) 08:40:36.13
マージソートはswapじゃなくてリストを対象としてできるぞ?
0479デフォルトの名無しさん2012/01/30(月) 10:55:57.11
ソートがないと思えるのも、
これまた凄い感覚で好きだぜw
0480デフォルトの名無しさん2012/01/30(月) 18:27:21.44
>>464
おまえ、正真正銘の馬鹿だな。
>>424のリンク先は1組swapする関数で、以後それをベースにした議論が続いていた。
>>424とは異なる前提で議論をしたければ、それを示せ。それが議論ってもんだ。
自分の勝手な妄想が他人にも共有されていると思うほうが
よほど応用力がないオナニー野郎だ。

自分の勝手な妄想を行間などと呼んで、他人にも自動的に賛同してもらえているなど、
正常な判断能力を持つ人間とは考えられない。病院いけ。
0481デフォルトの名無しさん2012/01/30(月) 19:37:07.68
>>480
それをいうなら、>>445で最初に前提覆してるのはおまいさんだろ・・・
と言うか、自分もおまいさんと同じ意見のつもりで>>437書いてたんだが?

swapは

> 1、リストの中身を配列に移す
> 2、配列で値を交換
> 3、配列の中身をリストに戻す

の2で使うだけだろ
1と3は前処理と後処理

それをおまいさんが>>438で煽るから、どんな画期的な手法が出てくるのかと期待してたのに・・・
0482デフォルトの名無しさん2012/01/30(月) 19:47:22.37
>>481
すまんが、>>445はn回まとめてswapを「否定する」内容だと思うぞ。
0483デフォルトの名無しさん2012/01/30(月) 19:51:58.64
>>481
> swapは
>
> > 1、リストの中身を配列に移す
> > 2、配列で値を交換
> > 3、配列の中身をリストに戻す
>
> の2で使うだけだろ
> 1と3は前処理と後処理

え?1,2,3全部で「リスト要素対のswap」じゃないのか?
実際、>>424のリンク先のコードも「リスト要素対のswap」だし。

冷静になって論点を整理してみたら?俺は>>438に同意だ。
「リスト要素対のswap」の実装で配列にコピーしてからswapして
またリストを作りなおすとか、最初にeliminateする実装だ。
0484デフォルトの名無しさん2012/01/30(月) 20:11:13.37
>>482
なるほど、合点がいった
じゃあ、結局、たった一回リストの中身を交換するswap関数は、Cのようにリストと配列がはっきりデータ構造として区別された言語ではどのような処理を行うのがベテランの手法なのだろう・・・
その回答は出てない気がする
私はベテランではないし、最早、>>438に初心者認定されてるしな
0485デフォルトの名無しさん2012/01/30(月) 20:59:22.54
>>480
話と全く関係ないが、感動した。そうだ行間、行間だ。
行間を読めというやつは何処か特徴的だ。
0486デフォルトの名無しさん2012/01/30(月) 22:59:47.18
唐突だが、monad-parallel パッケージってめっちゃ便利だな

例えば複数のIOモナドをひとつのリストに全て入れて
Control.Monad.Parallel.sequence_ 呼べば勝手に並列処理してくれる

プログラムソースが非常にスッキリした
今まで pseq や par を駆使してたのがアホらしくなったわ
(monad-parallel パッケージの中で駆使されているんだが)
0487デフォルトの名無しさん2012/01/31(火) 18:43:29.33
5 :: Int と 5 :: Integerと何が違うのですか?
0488デフォルトの名無しさん2012/01/31(火) 19:16:11.30
>>487
5::Int の型は Int になって、
5::Integer の型は Integer 型になる

よって、この 5 の部分が例えば 2147483648 だと結果の値が変わってくる
0489デフォルトの名無しさん2012/01/31(火) 19:21:46.24
>>487
Intは31ビットで表現できる範囲の整数しか扱えないが、速い(C言語で言うところのintだが、1ビットは型推論に使用)
Integerはメモリの許す限り大きな整数も扱えるが、遅い
0490デフォルトの名無しさん2012/01/31(火) 19:40:11.07
>>489
GHCのIntは32ビットまたは64ビットだよ
Intが31ビットの処理系があってもいいけど、余った1ビットの用途は普通GCで型推論じゃないよ
0491デフォルトの名無しさん2012/01/31(火) 19:42:57.63
objectの型をあらわすタグかな?
0492デフォルトの名無しさん2012/01/31(火) 19:59:59.24
>>490
ごめん。GCだったっけ
Javaとかは31ビットとか無いよなー・・・とか考えて、型推論にしたけど、確かに昔31ビットって聞いたんだが、改めてググってみたら、昔は30ビット、あるいは31ビットだったけど、今は32ビットなんだな。
(64ビットコンパイラは64ビットInt)

http://www.haskell.org/ghc/docs/7.0.3/html/libraries/ghc-prim-0.2.0.0/GHC-Prim.html
0493デフォルトの名無しさん2012/01/31(火) 20:32:31.44
simonpj先生らのboxing/unboxing研究のおかげ。> word一杯のInt
0494デフォルトの名無しさん2012/02/01(水) 12:33:11.89
 ttp://www.snoyman.com/img/book-cover.png
0495デフォルトの名無しさん2012/02/01(水) 12:35:57.99
>>494
HaskellでのWebフレームワークは面白そうだから興味はあるんだが、いかんせん、
遊びでやるにしてもその前に学ばなければならないことが多いんだよな
0496デフォルトの名無しさん2012/02/01(水) 12:41:38.35
僕のweb framework処女はyesodに捧げます><
0497デフォルトの名無しさん2012/02/01(水) 13:38:07.92
>>494
こういうのが本になっちゃう所がすごいね
http://shop.oreilly.com/product/0636920023142.do
0498デフォルトの名無しさん2012/02/01(水) 15:00:41.95
オライリーの中の人の選球眼が良いんだろうねぇ
0499デフォルトの名無しさん2012/02/01(水) 15:03:27.03
すのいまんは108人いる
0500デフォルトの名無しさん2012/02/01(水) 15:46:12.82
すのいまんって グアルディオラみたいな顔してるね。
0501デフォルトの名無しさん2012/02/01(水) 20:49:46.05
ruby on railsに似たFWってあります?
0502デフォルトの名無しさん2012/02/01(水) 21:28:18.68
市原警察署生活安全課の創価警官名言集

「俺のおかげで家から出れなくした。俺の手柄だ!」

「昼間は市役所のパトロール隊を使う。夜は消防団を使う。」

防犯パトロールと称する近所の創価学会員が
中学生を口実にした何年にも渡る誹謗中傷行為や人権侵害行為について
市原警察署生活安全課の創価警官の指導でやってあげているんだと発言したことについて
「指導じゃない、パトロールをお願いしてるだけだ。俺の責任じゃない!」

いくら創価学会員が集団で誹謗中傷を繰り返しても
調べれば何の前科もない事くらいすぐわかるのに
創価学会員の発言に根拠のない点については完全無視

帰化人の創価学会員が当たり前のように警官になれてしまう狂った世の中

0503デフォルトの名無しさん2012/02/03(金) 08:42:57.25
諸君、ホットな話題は?
0504デフォルトの名無しさん2012/02/03(金) 15:52:10.78
相変わらず俺がモナド理解できない圏に付いて
0505デフォルトの名無しさん2012/02/03(金) 17:33:55.88
圏論に懐疑的な人の方が攻略が早い
0506デフォルトの名無しさん2012/02/03(金) 18:48:41.28
アローはモナドにできる事が全てできます。
アローにできるがモナドにできない事もあります。
アローにはモナド則のような余計な規則がありません。
アローはモナドより理解しやすく圏論を知らなくても理解できます。
だからアローがあればモナドは不要です。

モナドは今となっては無駄に挫折者を増やす過去の遺物です。
Haskellはモナドを全廃しアローに置き換えるべきだと思います。
0507デフォルトの名無しさん2012/02/03(金) 19:26:50.37
>>506
> アローにはモナド則のような余計な規則がありません。

モナド則は「余計」でアロー則は「余計ではない」理由が分からない

もっとちゃんと説明して欲しい
0508デフォルトの名無しさん2012/02/03(金) 19:34:54.82
>>406
> アローはモナドにできる事が全てできます。

この理屈だと、Control.Applicative なども要らない
と言っているように感じる

しかし、実現したい計算と式に関して、
必要十分な機能は何かと考えることは大事だと私は思う
なぜなら、そう考える過程で計算と式が洗練されていくからだ

何でもかんでもアローでプログラムするのは、
プログラミングを不必要に複雑にする事に繋がりかねない
0509デフォルトの名無しさん2012/02/03(金) 19:39:08.83
>506
>アローはモナドにできる事が全てできます。
>アローにできるがモナドにできない事もあります。
逆じゃね
0510デフォルトの名無しさん2012/02/03(金) 22:50:53.19
アローの良質な入門サイトを紹介して下さい(勿論日本語の)
0511デフォルトの名無しさん2012/02/03(金) 23:22:13.48
アロー演算子ならまかせろ!
0512餃子チョコレート ◆8X2XSCHEME 2012/02/03(金) 23:25:47.33
>>510
こういうのはどう?
http://d.hatena.ne.jp/MaD/20070816#1187319817
0513デフォルトの名無しさん2012/02/04(土) 00:05:18.95
>>506
Arrowの心
http://d.hatena.ne.jp/MaD/20070816
>Monadと同様にArrowにもArrow則という規則があります。
> 1. (a >>> b) >>> c = a >>> (b >>> c)
> 2. arr (g.f) = arr f >>> arr g
> 3. arr id >>> a = a = a >>> arr id
> 4. first a >>> arr pi1 = arr pi1 >>> a
> 5. first a >>> arr (id X f) = arr (id X f) >>> first a
> 6. first a >>> arr alpha = arr alpha >>> first (first a)
> 7. first (arr f) = arr (f X id)
> 8. first (a >>> b) = first a >>> first b
0514デフォルトの名無しさん2012/02/04(土) 13:28:24.89
>>512
読みました\(^O^)/
0515デフォルトの名無しさん2012/02/04(土) 17:10:59.19
要約すると「Arrow はパズル」。
0516デフォルトの名無しさん2012/02/04(土) 17:41:35.25
> とりあえずfirstについてのルール4,5,6,7,8は無視します。
ワロタ
0517デフォルトの名無しさん2012/02/05(日) 10:47:39.79
ghciで階乗の関数factを定義しようとしてるのですが、以下のようにすると
Prelude> let fact 0 = 1
Prelude> let fact n = n * fact (n - 1)
Prelude>
先週まではうまく行ってたのに、急になぜかうまくいかなくなりました。
Prelude> fact 10
^CInterrupted.
Prelude>
fact 10とかやると永遠に返って来ません。
どうもlet fact 0 = 1のあとにlet fact n = n * fact(n-1)とやるとfactの定義が上書きされてる
みたいなのですが、何か間違ってるでしょうか?
0518デフォルトの名無しさん2012/02/05(日) 12:44:07.59
>>517
ghci上ではこうやるといいです

let fact 0 = 1; fact n = n * fact (n-1)

先週か今週にかけて ghc のバージョンアップをしたのでは?
ghciの仕様が変わったかどうか詳細は知らないので、原因は違うかもですが
0519デフォルトの名無しさん2012/02/05(日) 13:16:48.53
>>518
ありがとうございました。動きました。
先週までは
Prelude> let func1 'a' = "aaa"
Prelude> let func1 'b' = "bbb"
こう書けてたと思うんですが、自信がなくなってきました。上のも、こう書けば動きました。
Prelude> let func1 'a'="aaa"; func1 'b'="bbb"
ありがとうございました。
0520デフォルトの名無しさん2012/02/06(月) 18:39:55.29
HaskellはHTMLに<?haskel ?>のように
埋め込めますか?
0521デフォルトの名無しさん2012/02/06(月) 18:43:44.18
>>520
埋め込んだらええやん

それを解釈して正式な HTML や JavaScript なんかに変換する
サーバーアプリに通せばええよ
0522デフォルトの名無しさん2012/02/06(月) 18:51:15.58
なんちゅう名前のサーバアプリがええんですか?
0523デフォルトの名無しさん2012/02/06(月) 19:16:46.10
>>522
そんなん自分で作るんちゃうんかいな

探したって無駄やさかい
0524デフォルトの名無しさん2012/02/06(月) 19:32:44.58
>>523
ホンマですか? えらい難儀な話ですけど、しゃーないですね。
スレ汚しすんませんでした。
0525デフォルトの名無しさん2012/02/06(月) 20:25:45.57
>>523
てげよだきー
0526デフォルトの名無しさん2012/02/07(火) 07:07:30.44
んじちゃーぴら
0527デフォルトの名無しさん2012/02/07(火) 07:48:14.32
a_1 = a_2 = 1, a_n+2 = a_n+1 + a_n

a_9 = a_8 + a_7
  = (a_7 + a_6) + a_7

でa_7をグラフ簡約してくれるようにするにはどうしますか?

まさか a_7 を2度計算するなんて事になったら
土砂降りの中、滑って転んだ野良犬のような惨めに打ちのめされた気分になります

  = (a_7 + a_6) + [a_6 + a_5]_7
  = (a_7 + [a_5 + a_4]_6) + [a_6 + a_5]_7
  = (a_7 + [a_5 + a_4]_6) + [a_6 + [a_4 + a_3]_5]_7
  = (a_7 + [a_5 + [a_3 + a_2]_4]_6) + [a_6 + [a_4 + a_3]_5]_7
  = (a_7 + [a_5 + [a_3 + a_2]_4]_6) + [a_6 + [a_4 + [a_2 + a_1]_3]_5]_7
  = (a_7 + [a_5 + [2 + 1]_4]_6) + [a_6 + [a_4 + [2]_3]_5]_7
  = (a_7 + [a_5 + [3]_4]_6) + [a_6 + [3 + [2]_3]_5]_7
  = (a_7 + [5 + [3]_4]_6) + [a_6 + [5]_5]_7
  = (a_7 + [8]_6) + [8 + [5]_5]_7
  = (13 + [8]_6) + [13]_7
  = 34

ってイメージで
0528デフォルトの名無しさん2012/02/07(火) 18:48:44.70
>>527
何らかの形で共有を明示するしかない
たとえば
fib = 1 : 1 : zipWith (+) fib (tail fib)
0529デフォルトの名無しさん2012/02/07(火) 21:57:38.51
>>528
フィボナッチ以外でも適用できる汎用的なノウハウが欲しいです
寧ろ数列計算よりシミュレーション的な
将棋の次の一手の探索みたいな
0530デフォルトの名無しさん2012/02/07(火) 22:02:40.24
・処理するには新しい処理が芋蔓式に出現する
・それらの多くが頻繁に共通にあらわれる・共通処理は省かないと総処理は天文学的オーダーで膨れ上がる


こういうケースの汎用指針が欲しいです
0531デフォルトの名無しさん2012/02/07(火) 22:07:23.01
DPを自動でやりたいように見えた
0532デフォルトの名無しさん2012/02/07(火) 22:09:06.55
>>530
メモ化ね
汎用指針は、計算済みの値を捨てないで保存しておくこと
IOとかStateモナド上で状態にして引き回してもいいし、
>>528みたいに、全部の値を含む(場合によっては無限の)データ構造を定義してもいい
0533デフォルトの名無しさん2012/02/08(水) 07:20:52.45
>>531
「芋蔓式に出現する」の意味がよく分からないけど、新しい式を書き加えてなんどもコーディングするっていうことなら、トップレベルに定義していけばよいんじゃないの?

コーディングを繰り返さないなら、>>532のいうようにメモ化を求めているんだろうけど、将棋の次の一手とかメモ化したら空間オーダが爆発しそうだな。
それで解決できるなら、将棋の決して負けない手順がすでに明らかになっているだろうし。
そのレベルのことをどうしてもやりたいなら金に糸目を付けず並列クラスタを作るしかないんじゃないの?
0534デフォルトの名無しさん2012/02/08(水) 07:50:15.51
「Stringはオワコン。これからはText」って言われてるのを見て
Data.Text を使おうとしたけれど、なんで index が O(n) なの?
中身はただの配列だと思ってたのに。
http://hackage.haskell.org/packages/archive/text/0.11.1.13/doc/html/Data-Text.html

0535デフォルトの名無しさん2012/02/08(水) 09:20:34.12
データはコピーしないで、リストでデータの在処を持ってるんでしょ。
lastがO(1)だからケツも押させてるんだと思う。
0536デフォルトの名無しさん2012/02/08(水) 11:41:41.19
>>535
ありがとう。

ソースをざっと見てみたら、配列・オフセット・長さの組を使っているようだっ
た。単なる配列じゃないのは、部分文字列(tail とかで)でコピーしなくていい
ようにするためらしい。

で、index が遅いのは、Unicode のサロゲートがらみみたい。index s n の n
が文字数なので、サロゲートがあると配列のインデックスとずれてしまうせい
で、先頭か最後から順番に数えてるようだった。length が O(n) なのも、たぶ
んそれが理由。

ちょろっと眺めただけなので、まちがってるかも。

とりあえず String より遅くはなさそうなので、もうちょっと試してみます。
0537デフォルトの名無しさん2012/02/08(水) 12:05:29.10
とにかくでかいデータ用だぜ。
0538デフォルトの名無しさん2012/02/08(水) 12:10:04.92
時代はUTF32
0539デフォルトの名無しさん2012/02/08(水) 12:35:16.38
UTF48
0540デフォルトの名無しさん2012/02/08(水) 13:42:13.86
>>515
じゃあパズルをとこうぜ。
http://www.amazon.co.jp/gp/product/0486281523/
http://www.amazon.co.jp/gp/product/0486653552/
0541デフォルトの名無しさん2012/02/08(水) 18:37:49.70
>>539
warota
0542デフォルトの名無しさん2012/02/10(金) 21:18:58.47
QuickCheck って Monad もテストできるのずっと気づかなかった
0543デフォルトの名無しさん2012/02/10(金) 23:30:34.09
本屋に行ったけど、RWHしかなかった
人気ないのかな…
0544デフォルトの名無しさん2012/02/11(土) 02:30:53.27
>>543
人気の定義による。

・プログラマー人口内のシェア?
→世間のビジネスの9割以上は単純な事務作業なので、 そういう処理を書ける言語はHaskell以外に沢山ある。
ちなみに、書店はシェア重視。

・ある問題領域で解決したい課題を持つ者にとって、ロジックを実装しやすいか?
→自分と同様の問題領域の人を探したほうがいい。
0545デフォルトの名無しさん2012/02/11(土) 08:27:54.18
>>543
RWHの和訳って前半部分がいまいちわかりにくいのが残念。
また、あのままでGHC7以後で動かそうとすると、ちょっと面倒なところ
が出てる。だから、改訂版に期待したいんだがな。
■ このスレッドは過去ログ倉庫に格納されています