1 名前:デフォルトの名無しさん mailto:sage [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/
449 名前:デフォルトの名無しさん mailto:sage [2012/01/29(日) 13:26:31.49 ] >>444 ん・・・ それって、結局Haskellのやり方と同じことを手続き型言語でもリストのswapの勉強の際には教えるってこと?
450 名前:デフォルトの名無しさん mailto:sage [2012/01/29(日) 13:28:51.88 ] >>445 何というか・・・ 行間嫁よ そんなの当たり前だろ
451 名前:デフォルトの名無しさん mailto:sage [2012/01/29(日) 13:31:51.09 ] >>448 rubyの場合、リストっぽく使える配列だね pythonとは名前が逆だけど、実装は何が違うんだろう?
452 名前:デフォルトの名無しさん mailto:sage [2012/01/29(日) 13:36:38.70 ] >>450 はあ?文脈読んでないのはオマエだろ。 >>424 のリンク先のコードのswap関数の型を書いてみろよ。 どこをどう見たって、リスト/配列中の1組の値のswapだ。 型情報以上に重要な「行間」があるなら書いてみろw
453 名前:デフォルトの名無しさん mailto:sage [2012/01/29(日) 13:45:07.16 ] >>449 結果としてHaskellのやり方と同じことを初心者には教えることになるが、 そんなことが言いたかったのではないんだ ・一般的にリストと呼ばれている構造をプログラムで表現する方法 ・その表現方法の上での、リストに関する様々な演算方法 リスト処理を初心者に教える入門書はこの2点を分かってもらいたくて書いている Haskell でのプリミティブなリストの表現方法はいわゆる前方参照の単方向リストだが、 概念は他言語で表現されたリストと似ているし、表現方法が同じなら同じ方法が使える もし swap 処理を教えるとしたら、その概念に沿って教えるのが自然だ 概念から外れた方法を理解させようとしている入門書があるなら、 その入門書は(少なくともその部分に関しては)クソだと思う
454 名前:デフォルトの名無しさん mailto:sage [2012/01/29(日) 14:12:10.92 ] >>452 視野が狭いな・・・
455 名前:デフォルトの名無しさん mailto:sage [2012/01/29(日) 14:25:57.63 ] >>453 リスト専門の入門書ってのは読んだこと無いんだが、もし在るならそうなるだろうね Haskellでちょっと不便かな?と思ったのは配列も値が変えられないだろうという事。結局、IOモナドなり、Stateモナドなりを頼る事になりそうなのがね・・・ >>425 のupdate関数は初心者にも作れるし、意外と有効かも (全体を2回書き換える事にはなるが、コード上は交換したい値を一つずつ更新してるのは、初心者には分かりやすそう) 最近はリストなんだか配列なんだかという、(コード上の)データ構造の性質がハッキリしない言語が多くなってきたから、楽にはなったけど、データ構造の性質を教えるのにはちょっと不便になってきた気がする (そう言う意味では、Cとかの方が生々しい意味で最適なのかも知れないが、生々しすぎて初心者には敷居が高いし・・・)
456 名前:453 mailto:sage [2012/01/29(日) 14:33:26.96 ] >>449 読み返したら誤解を与えそうな感じがするから言っておくが 一般的なリストの構造とリストの演算を初心者に教える過程で swap を教えるのなら、 結果としてHaskellのやり方と同じことを教えることになる、という事だからな 要素の破壊的な代入が許されるタイプのリストなら、 普通の変数同士のswapのようにテンポラリ変数を使って比較的素早くswapできるし、 そのように解説している入門書もあるだろうが、それは目的が違う その部分の関しては、リストの構造とリストの演算を学ばせるためじゃない (喩えは悪いかもだが、方程式の解法で移項というテクニックを教えるようなもの)
457 名前:453 mailto:sage [2012/01/29(日) 14:34:53.97 ] レス前にリロードしとけば良かった orz
458 名前:デフォルトの名無しさん mailto:sage [2012/01/29(日) 14:41:52.19 ] >>456 いや、ありがとう 他人に書かれてもドンマイだよ 変数の値が書き換わるのが理解出来ない初心者(かなり稀なパターン)へ手を替え品を替え説明するのに比べれば。。。 変数が箱って言う例えは誰が考えたんだよ。。。
459 名前:453 mailto:sage [2012/01/29(日) 14:48:17.90 ] 数学で式に文字が導入された頃から漠然とした箱のイメージはあったと思う 値と変数を束縛して固定するイメージよりは、 値を入れるための箱のイメージの方が先にあったのではないか と、大して根拠もなく個人的には思ってる
460 名前:デフォルトの名無しさん mailto:sage [2012/01/29(日) 15:00:35.95 ] >>459 それは分かる。つーか、自分も似た感覚なんだが、箱の中身がコピーされるとか、新しい値を入れると消えちゃうとかの説明がね。。。 箱じゃ無くて1個のみのスタックみたいなところてん式(追い出された値は捨てられる)の説明でもコピーが説明出来ないしね。。。 まあ、そいつがバカ過ぎなのが問題なんだけど、普通の人はメモリって何?が基準だしなぁ。。。と、基本的な事柄は紙の上で説明出来るのがベストなのかなぁ。。。とか考えてhaskellに流れ着いてたり ちょっとコンピュータの仕組み齧れば普通の言語の方が自然なんだが。。。
461 名前:453 mailto:sage [2012/01/29(日) 15:15:26.29 ] >>460 私がC言語を初心者に教えている時は、一般的な「変数=箱」のような喩えではなく、 もう初めから「変数=メモリアドレスの別名」と直に教える そして、メモリとはどういう構造か、その上でどんな事ができるかを教えてる 当然メモリって何?が基準だけど、C言語ならそこから逃げられないし 喩えると余計に分かりにくい Haskellを初心者に教えた事は一度しかないけど、 その時も箱とかの喩え話じゃなく、「変数=値の別名」と直に束縛の概念を教えた
462 名前:デフォルトの名無しさん mailto:sage [2012/01/29(日) 15:36:15.61 ] >>461 自分も結局、変数=値の別名で教えた おバカなその人はhaskellも無い頃の思い出だが、cpuの仕組み習ってる筈なのに(情報技術科の同級生)、全く理解出来てなかった そこまでのバカは捨て置いても良いと思うんだけど、手続き型だとスコープの問題もあるのよね。。。 関数内でswapしたのに値が変わってない!!とか ガッコの先生じゃ無いから、放っときゃ良いんだけど、なるべくそう言う「?」が無い言語が望ましいんじゃ無いかと 本気でプログラマ目指すなら、多分javaやC#しか使わなくても、Cでメモリの概念を直接覚える必要があるだろうな。とは思う (C#は限定的でもポインタ残してたのは、本当に英断だった)
463 名前:デフォルトの名無しさん mailto:sage [2012/01/29(日) 18:06:25.05 ] >>454 おまえは心が狭いな 素直に自分の間違いを認めればいいのに
464 名前:デフォルトの名無しさん mailto:sage [2012/01/29(日) 19:00:27.45 ] >>463 1、リストの中身を配列に移す 2、配列で値を交換 3、配列の中身をリストに戻す って書いてて、値の交換が何度も必要な場面で毎回リストに戻す馬鹿がどこに居るよ 行間嫁ってのは、そう言うこと そんな応用力無い奴はプログラマになれないだろが
465 名前:デフォルトの名無しさん mailto:sage [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くらい標準で用意して欲しい気はする。
466 名前:デフォルトの名無しさん mailto:sage [2012/01/29(日) 21:20:50.26 ] リストでインデックス指定のswapが必要になる時点で型の選択を間違ってる気がしないでもない 綺麗事だけどさ
467 名前:デフォルトの名無しさん mailto:sage [2012/01/29(日) 21:50:07.46 ] まぁ、他のリスト計算(++ や fold系、zip系など)に比べると、 swap の需要は圧倒的に少ないわな 正直、今まで必要になった事があったのかどうか思い出せん
468 名前:デフォルトの名無しさん mailto:sage [2012/01/29(日) 22:09:42.45 ] swapは、Sortに使うね。 Haskellは、Sort簡単だからあまり出番がないのかも。 でも、Sliceは欲しいな。
469 名前:デフォルトの名無しさん mailto:sage [2012/01/29(日) 22:38:39.26 ] >>468 Haskell のリストのソートに swap は使わないだろ 効率的なマージソートの実装が標準ライブラリに既にあるじゃん ソート関数を自作してまで swap を使う理由は何?
470 名前:デフォルトの名無しさん mailto:sage [2012/01/29(日) 22:45:28.87 ] >>468 マージソートにも、クイックソートにもswap使わないけどね・・・
471 名前:デフォルトの名無しさん mailto:sage [2012/01/29(日) 22:52:38.26 ] いや、別にHaskellの話してたわけじゃないけどな。 swapって言ったらCのqsortなんかが真っ先に思いついたわけだ。 でもって、まぁHaskellじゃ使わんなと思って出番がないと書いたんだが、、、 しょうもないことに一々絡まんでも。 というか、C言語とかあんま使ったことないでしょ?
472 名前:デフォルトの名無しさん mailto:sage [2012/01/29(日) 23:11:17.90 ] >>471 絡むってほどのつもりでもなかったけど・・・ Cは確かにあまり使ってないなぁ・・・ 最近は、データ構造の定義がHaskellと似てるなー・・・とか思いながら、ぼんやり復習してるけど
473 名前:デフォルトの名無しさん mailto:sage [2012/01/29(日) 23:18:12.48 ] >>471 俺も別に絡むわけじゃないが >>468 では Haskell で swap の出番があまりない理由が 「Haskell では sort が簡単だから」に見たから もし仮に Haskell の標準ライブラリで sort が実装されてなかったら、 swap を使って実装する気だったのかなと思って
474 名前:デフォルトの名無しさん mailto:sage [2012/01/29(日) 23:28:13.17 ] よくよく考えてみると swapの最大の利点はデータの長さを変えずに済むことなんだよな だから配列操作に有難がられるわけだ
475 名前:470 de 472 mailto:sage [2012/01/30(月) 00:04:53.69 ] >>473 ごめん・・・ 標準でsortあるの? Haskell入門中で、マージソートもクイックソートも自作したけど、swap使わんかったんで書き込んだんだけど、sort関数あるの知らんかった・・・ ソートって、基本、交換じゃなくて、並べ替えだから、リストの切り貼りで出来るから、swap要らんという意味だったのかと・・・ たぶん、純粋に交換したい時しかswap使わないと思われ 要素が少なかったら、コード上で直接交換できるし・・・ --3要素のリスト限定。(大抵、こういう処理はタプルでするっぽいけど) swap3rd a:b:c:[] = c:b:a:[]
476 名前:デフォルトの名無しさん mailto:sage [2012/01/30(月) 00:12:01.81 ] >>475 > Haskell入門中で、マージソートもクイックソートも自作したけど それは大変素晴らしいことだ ただ、ソート関数自体は Data.List に既にある ライブラリドキュメントを見てみ (そのドキュメントからソースの中身も見れる)
477 名前:デフォルトの名無しさん mailto:sage [2012/01/30(月) 00:29:00.75 ] >>476 ・・・orz ま、まあ、元々アルゴリズムの勉強不足だったから、良いんですけどね・・・
478 名前:デフォルトの名無しさん mailto:sage [2012/01/30(月) 08:40:36.13 ] マージソートはswapじゃなくてリストを対象としてできるぞ?
479 名前:デフォルトの名無しさん mailto:sage [2012/01/30(月) 10:55:57.11 ] ソートがないと思えるのも、 これまた凄い感覚で好きだぜw
480 名前:デフォルトの名無しさん mailto:sage [2012/01/30(月) 18:27:21.44 ] >>464 おまえ、正真正銘の馬鹿だな。 >>424 のリンク先は1組swapする関数で、以後それをベースにした議論が続いていた。 >>424 とは異なる前提で議論をしたければ、それを示せ。それが議論ってもんだ。 自分の勝手な妄想が他人にも共有されていると思うほうが よほど応用力がないオナニー野郎だ。 自分の勝手な妄想を行間などと呼んで、他人にも自動的に賛同してもらえているなど、 正常な判断能力を持つ人間とは考えられない。病院いけ。
481 名前:デフォルトの名無しさん mailto:sage [2012/01/30(月) 19:37:07.68 ] >>480 それをいうなら、>>445 で最初に前提覆してるのはおまいさんだろ・・・ と言うか、自分もおまいさんと同じ意見のつもりで>>437 書いてたんだが? swapは > 1、リストの中身を配列に移す > 2、配列で値を交換 > 3、配列の中身をリストに戻す の2で使うだけだろ 1と3は前処理と後処理 それをおまいさんが>>438 で煽るから、どんな画期的な手法が出てくるのかと期待してたのに・・・
482 名前:デフォルトの名無しさん mailto:sage [2012/01/30(月) 19:47:22.37 ] >>481 すまんが、>>445 はn回まとめてswapを「否定する」内容だと思うぞ。
483 名前:デフォルトの名無しさん mailto:sage [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する実装だ。
484 名前:デフォルトの名無しさん mailto:sage [2012/01/30(月) 20:11:13.37 ] >>482 なるほど、合点がいった じゃあ、結局、たった一回リストの中身を交換するswap関数は、Cのようにリストと配列がはっきりデータ構造として区別された言語ではどのような処理を行うのがベテランの手法なのだろう・・・ その回答は出てない気がする 私はベテランではないし、最早、>>438 に初心者認定されてるしな
485 名前:デフォルトの名無しさん mailto:sage [2012/01/30(月) 20:59:22.54 ] >>480 話と全く関係ないが、感動した。そうだ行間、行間だ。 行間を読めというやつは何処か特徴的だ。
486 名前:デフォルトの名無しさん mailto:sage [2012/01/30(月) 22:59:47.18 ] 唐突だが、monad-parallel パッケージってめっちゃ便利だな 例えば複数のIOモナドをひとつのリストに全て入れて Control.Monad.Parallel.sequence_ 呼べば勝手に並列処理してくれる プログラムソースが非常にスッキリした 今まで pseq や par を駆使してたのがアホらしくなったわ (monad-parallel パッケージの中で駆使されているんだが)
487 名前:デフォルトの名無しさん [2012/01/31(火) 18:43:29.33 ] 5 :: Int と 5 :: Integerと何が違うのですか?
488 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 19:16:11.30 ] >>487 5::Int の型は Int になって、 5::Integer の型は Integer 型になる よって、この 5 の部分が例えば 2147483648 だと結果の値が変わってくる
489 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 19:21:46.24 ] >>487 Intは31ビットで表現できる範囲の整数しか扱えないが、速い(C言語で言うところのintだが、1ビットは型推論に使用) Integerはメモリの許す限り大きな整数も扱えるが、遅い
490 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 19:40:11.07 ] >>489 GHCのIntは32ビットまたは64ビットだよ Intが31ビットの処理系があってもいいけど、余った1ビットの用途は普通GCで型推論じゃないよ
491 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 19:42:57.63 ] objectの型をあらわすタグかな?
492 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 19:59:59.24 ] >>490 ごめん。GCだったっけ Javaとかは31ビットとか無いよなー・・・とか考えて、型推論にしたけど、確かに昔31ビットって聞いたんだが、改めてググってみたら、昔は30ビット、あるいは31ビットだったけど、今は32ビットなんだな。 (64ビットコンパイラは64ビットInt) www.haskell.org/ghc/docs/7.0.3/html/libraries/ghc-prim-0.2.0.0/GHC-Prim.html
493 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 20:32:31.44 ] simonpj先生らのboxing/unboxing研究のおかげ。> word一杯のInt
494 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 12:33:11.89 ] ttp://www.snoyman.com/img/book-cover.png
495 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 12:35:57.99 ] >>494 HaskellでのWebフレームワークは面白そうだから興味はあるんだが、いかんせん、 遊びでやるにしてもその前に学ばなければならないことが多いんだよな
496 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 12:41:38.35 ] 僕のweb framework処女はyesodに捧げます><
497 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 13:38:07.92 ] >>494 こういうのが本になっちゃう所がすごいね shop.oreilly.com/product/0636920023142.do
498 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 15:00:41.95 ] オライリーの中の人の選球眼が良いんだろうねぇ
499 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 15:03:27.03 ] すのいまんは108人いる
500 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 15:46:12.82 ] すのいまんって グアルディオラみたいな顔してるね。
501 名前:デフォルトの名無しさん [2012/02/01(水) 20:49:46.05 ] ruby on railsに似たFWってあります?
502 名前:デフォルトの名無しさん [2012/02/01(水) 21:28:18.68 ] 市原警察署生活安全課の創価警官名言集 「俺のおかげで家から出れなくした。俺の手柄だ!」 「昼間は市役所のパトロール隊を使う。夜は消防団を使う。」 防犯パトロールと称する近所の創価学会員が 中学生を口実にした何年にも渡る誹謗中傷行為や人権侵害行為について 市原警察署生活安全課の創価警官の指導でやってあげているんだと発言したことについて 「指導じゃない、パトロールをお願いしてるだけだ。俺の責任じゃない!」 いくら創価学会員が集団で誹謗中傷を繰り返しても 調べれば何の前科もない事くらいすぐわかるのに 創価学会員の発言に根拠のない点については完全無視 帰化人の創価学会員が当たり前のように警官になれてしまう狂った世の中
503 名前:デフォルトの名無しさん mailto:sage [2012/02/03(金) 08:42:57.25 ] 諸君、ホットな話題は?
504 名前:デフォルトの名無しさん mailto:sage [2012/02/03(金) 15:52:10.78 ] 相変わらず俺がモナド理解できない圏に付いて
505 名前:デフォルトの名無しさん mailto:sage [2012/02/03(金) 17:33:55.88 ] 圏論に懐疑的な人の方が攻略が早い
506 名前:デフォルトの名無しさん mailto:sage [2012/02/03(金) 18:48:41.28 ] アローはモナドにできる事が全てできます。 アローにできるがモナドにできない事もあります。 アローにはモナド則のような余計な規則がありません。 アローはモナドより理解しやすく圏論を知らなくても理解できます。 だからアローがあればモナドは不要です。 モナドは今となっては無駄に挫折者を増やす過去の遺物です。 Haskellはモナドを全廃しアローに置き換えるべきだと思います。
507 名前:デフォルトの名無しさん mailto:sage [2012/02/03(金) 19:26:50.37 ] >>506 > アローにはモナド則のような余計な規則がありません。 モナド則は「余計」でアロー則は「余計ではない」理由が分からない もっとちゃんと説明して欲しい
508 名前:デフォルトの名無しさん mailto:sage [2012/02/03(金) 19:34:54.82 ] >>406 > アローはモナドにできる事が全てできます。 この理屈だと、Control.Applicative なども要らない と言っているように感じる しかし、実現したい計算と式に関して、 必要十分な機能は何かと考えることは大事だと私は思う なぜなら、そう考える過程で計算と式が洗練されていくからだ 何でもかんでもアローでプログラムするのは、 プログラミングを不必要に複雑にする事に繋がりかねない
509 名前:デフォルトの名無しさん mailto:sage [2012/02/03(金) 19:39:08.83 ] >506 >アローはモナドにできる事が全てできます。 >アローにできるがモナドにできない事もあります。 逆じゃね
510 名前:デフォルトの名無しさん [2012/02/03(金) 22:50:53.19 ] アローの良質な入門サイトを紹介して下さい(勿論日本語の)
511 名前:デフォルトの名無しさん [2012/02/03(金) 23:22:13.48 ] アロー演算子ならまかせろ!
512 名前:餃子チョコレート ◆8X2XSCHEME mailto:sage [2012/02/03(金) 23:25:47.33 ] >>510 こういうのはどう? d.hatena.ne.jp/MaD/20070816#1187319817
513 名前:デフォルトの名無しさん mailto:sage [2012/02/04(土) 00:05:18.95 ] >>506 Arrowの心 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
514 名前:デフォルトの名無しさん mailto:sage [2012/02/04(土) 13:28:24.89 ] >>512 読みました\(^O^)/
515 名前:デフォルトの名無しさん mailto:sage [2012/02/04(土) 17:10:59.19 ] 要約すると「Arrow はパズル」。
516 名前:デフォルトの名無しさん mailto:sage [2012/02/04(土) 17:41:35.25 ] > とりあえずfirstについてのルール4,5,6,7,8は無視します。 ワロタ
517 名前:デフォルトの名無しさん [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の定義が上書きされてる みたいなのですが、何か間違ってるでしょうか?
518 名前:デフォルトの名無しさん mailto:sage [2012/02/05(日) 12:44:07.59 ] >>517 ghci上ではこうやるといいです let fact 0 = 1; fact n = n * fact (n-1) 先週か今週にかけて ghc のバージョンアップをしたのでは? ghciの仕様が変わったかどうか詳細は知らないので、原因は違うかもですが
519 名前:デフォルトの名無しさん [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" ありがとうございました。
520 名前:デフォルトの名無しさん mailto:sage [2012/02/06(月) 18:39:55.29 ] HaskellはHTMLに<?haskel ?>のように 埋め込めますか?
521 名前:デフォルトの名無しさん mailto:sage [2012/02/06(月) 18:43:44.18 ] >>520 埋め込んだらええやん それを解釈して正式な HTML や JavaScript なんかに変換する サーバーアプリに通せばええよ
522 名前:デフォルトの名無しさん mailto:sage [2012/02/06(月) 18:51:15.58 ] なんちゅう名前のサーバアプリがええんですか?
523 名前:デフォルトの名無しさん mailto:sage [2012/02/06(月) 19:16:46.10 ] >>522 そんなん自分で作るんちゃうんかいな 探したって無駄やさかい
524 名前:デフォルトの名無しさん mailto:sage [2012/02/06(月) 19:32:44.58 ] >>523 ホンマですか? えらい難儀な話ですけど、しゃーないですね。 スレ汚しすんませんでした。
525 名前:デフォルトの名無しさん mailto:sage [2012/02/06(月) 20:25:45.57 ] >>523 てげよだきー
526 名前:デフォルトの名無しさん mailto:sage [2012/02/07(火) 07:07:30.44 ] んじちゃーぴら
527 名前:デフォルトの名無しさん mailto:sage [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 ってイメージで
528 名前:デフォルトの名無しさん mailto:sage [2012/02/07(火) 18:48:44.70 ] >>527 何らかの形で共有を明示するしかない たとえば fib = 1 : 1 : zipWith (+) fib (tail fib)
529 名前:デフォルトの名無しさん mailto:sage [2012/02/07(火) 21:57:38.51 ] >>528 フィボナッチ以外でも適用できる汎用的なノウハウが欲しいです 寧ろ数列計算よりシミュレーション的な 将棋の次の一手の探索みたいな
530 名前:デフォルトの名無しさん mailto:sage [2012/02/07(火) 22:02:40.24 ] ・処理するには新しい処理が芋蔓式に出現する ・それらの多くが頻繁に共通にあらわれる・共通処理は省かないと総処理は天文学的オーダーで膨れ上がる こういうケースの汎用指針が欲しいです
531 名前:デフォルトの名無しさん mailto:sage [2012/02/07(火) 22:07:23.01 ] DPを自動でやりたいように見えた
532 名前:デフォルトの名無しさん mailto:sage [2012/02/07(火) 22:09:06.55 ] >>530 メモ化ね 汎用指針は、計算済みの値を捨てないで保存しておくこと IOとかStateモナド上で状態にして引き回してもいいし、 >>528 みたいに、全部の値を含む(場合によっては無限の)データ構造を定義してもいい
533 名前:デフォルトの名無しさん mailto:sage [2012/02/08(水) 07:20:52.45 ] >>531 「芋蔓式に出現する」の意味がよく分からないけど、新しい式を書き加えてなんどもコーディングするっていうことなら、トップレベルに定義していけばよいんじゃないの? コーディングを繰り返さないなら、>>532 のいうようにメモ化を求めているんだろうけど、将棋の次の一手とかメモ化したら空間オーダが爆発しそうだな。 それで解決できるなら、将棋の決して負けない手順がすでに明らかになっているだろうし。 そのレベルのことをどうしてもやりたいなら金に糸目を付けず並列クラスタを作るしかないんじゃないの?
534 名前:デフォルトの名無しさん mailto:sage [2012/02/08(水) 07:50:15.51 ] 「Stringはオワコン。これからはText」って言われてるのを見て Data.Text を使おうとしたけれど、なんで index が O(n) なの? 中身はただの配列だと思ってたのに。 hackage.haskell.org/packages/archive/text/0.11.1.13/doc/html/Data-Text.html
535 名前:デフォルトの名無しさん mailto:sage [2012/02/08(水) 09:20:34.12 ] データはコピーしないで、リストでデータの在処を持ってるんでしょ。 lastがO(1)だからケツも押させてるんだと思う。
536 名前:デフォルトの名無しさん mailto:sage [2012/02/08(水) 11:41:41.19 ] >>535 ありがとう。 ソースをざっと見てみたら、配列・オフセット・長さの組を使っているようだっ た。単なる配列じゃないのは、部分文字列(tail とかで)でコピーしなくていい ようにするためらしい。 で、index が遅いのは、Unicode のサロゲートがらみみたい。index s n の n が文字数なので、サロゲートがあると配列のインデックスとずれてしまうせい で、先頭か最後から順番に数えてるようだった。length が O(n) なのも、たぶ んそれが理由。 ちょろっと眺めただけなので、まちがってるかも。 とりあえず String より遅くはなさそうなので、もうちょっと試してみます。
537 名前:デフォルトの名無しさん mailto:sage [2012/02/08(水) 12:05:29.10 ] とにかくでかいデータ用だぜ。
538 名前:デフォルトの名無しさん mailto:sage [2012/02/08(水) 12:10:04.92 ] 時代はUTF32
539 名前:デフォルトの名無しさん mailto:sage [2012/02/08(水) 12:35:16.38 ] UTF48
540 名前:デフォルトの名無しさん mailto:sage [2012/02/08(水) 13:42:13.86 ] >>515 じゃあパズルをとこうぜ。 www.amazon.co.jp/gp/product/0486281523/ www.amazon.co.jp/gp/product/0486653552/
541 名前:デフォルトの名無しさん mailto:sage [2012/02/08(水) 18:37:49.70 ] >>539 warota
542 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 21:18:58.47 ] QuickCheck って Monad もテストできるのずっと気づかなかった
543 名前:デフォルトの名無しさん mailto:sage [2012/02/10(金) 23:30:34.09 ] 本屋に行ったけど、RWHしかなかった 人気ないのかな…
544 名前:デフォルトの名無しさん mailto:sage [2012/02/11(土) 02:30:53.27 ] >>543 人気の定義による。 ・プログラマー人口内のシェア? →世間のビジネスの9割以上は単純な事務作業なので、 そういう処理を書ける言語はHaskell以外に沢山ある。 ちなみに、書店はシェア重視。 ・ある問題領域で解決したい課題を持つ者にとって、ロジックを実装しやすいか? →自分と同様の問題領域の人を探したほうがいい。
545 名前:デフォルトの名無しさん mailto:sage [2012/02/11(土) 08:27:54.18 ] >>543 RWHの和訳って前半部分がいまいちわかりにくいのが残念。 また、あのままでGHC7以後で動かそうとすると、ちょっと面倒なところ が出てる。だから、改訂版に期待したいんだがな。
546 名前:デフォルトの名無しさん mailto:sage [2012/02/11(土) 08:30:21.86 ] ・Haskell高速化テクニック なんて本がでないかな?
547 名前:デフォルトの名無しさん mailto:sage [2012/02/11(土) 08:31:18.34 ] 言いだしっぺの法則
548 名前:デフォルトの名無しさん mailto:sage [2012/02/11(土) 08:40:30.32 ] オライリーが投資を回収できてれば次も期待できると思うが、どうなんだかね
549 名前:デフォルトの名無しさん mailto:sage [2012/02/11(土) 09:05:15.98 ] yesod本がでるくらいだから、RWHは収益が上がってるんじゃないかと? >>547 残念だけど、教えて欲しい立場。人にチューニングを語れるほどじゃないし。
550 名前:デフォルトの名無しさん mailto:sage [2012/02/11(土) 09:23:04.02 ] Haskell wikiのPerformanceの項とかmkothaさんの記事 ghcのドキュメント ghcのプロファイリング機能とかcriterionパッケージ thread scope 最終的には諦めてC++/Asmで書く
551 名前:デフォルトの名無しさん mailto:sage [2012/02/11(土) 12:12:58.97 ] クリテリオンんて何かワクワクする語感だな アニメでいうとロボものだろう
552 名前:デフォルトの名無しさん mailto:sage [2012/02/11(土) 12:46:57.36 ] クライテリオンな まぁ別にどっちでもいいことだけど
553 名前:デフォルトの名無しさん mailto:sage [2012/02/11(土) 13:56:27.61 ] 超聖判規クライテリヲン
554 名前:デフォルトの名無しさん mailto:sage [2012/02/11(土) 19:24:57.36 ] あ、関節の病気か。
555 名前:デフォルトの名無しさん mailto:sage [2012/02/11(土) 23:32:33.40 ] 2日に GHC のバージョンが 7.2.2 から 7.4.1 に上がってたのか ghci 上で data や instance なんかの宣言ができるようになってた これは便利 それはそうと、さっさと実行時に利用コア数を変えられるようにしてほしいものだ
556 名前:デフォルトの名無しさん mailto:sage [2012/02/11(土) 23:50:35.15 ] setNumCapabilities 増やせるだけで減らせないみたいだけど
557 名前:デフォルトの名無しさん mailto:sage [2012/02/11(土) 23:54:08.17 ] we recommend installing the Haskell Platform instead of GHC. The current Haskell Platform release includes a recent GHC release as well as some other tools (such as cabal), and a larger set of libraries that are known to work together. と書いてるからさ、5月まで待ったほうがいいんじゃない? <7.4.1
558 名前:デフォルトの名無しさん mailto:sage [2012/02/11(土) 23:59:10.81 ] GHCの代わりにHaskell Platformをインストールするのを薦めとくわ。いまの Haskell Platformは最近のGHCを含んでいて、おまけに、他のツール(cabalと かね。)も動くし、よく使われてるライブラリも動くからさ。 だとさ、と意訳しとく。
559 名前:デフォルトの名無しさん mailto:sage [2012/02/12(日) 00:00:24.87 ] 既存プロジェクトの移行はライブラリが7.4に対応するまで待つとしても、 普段は最新版使った方が楽しい
560 名前:デフォルトの名無しさん mailto:sage [2012/02/12(日) 00:03:51.27 ] Debian系統だとHaskell Platformは単なる仮想パッケージ。
561 名前:デフォルトの名無しさん mailto:sage [2012/02/12(日) 00:06:35.18 ] >>559 まあ、こなれた人ならそうかもしれない。でも、ここって、いろんな人が いるから、一応書いといた。こなれた人ならトラブルに出会っても、解決 できるだろうし、それが楽しいもんな。 https://groups.google.com/forum/?fromgroups#!forum/haskell-jp でも、しんさんがリリースのメールに注意書きがされているけどね。
562 名前:デフォルトの名無しさん mailto:sage [2012/02/12(日) 08:01:47.18 ] someRecord{someField = f $ someField someRecord} haskellのレコード構文って何でこんなきもちわるいの フィールド一つ書き換えただけの新しいレコードが欲しいだけなのに
563 名前:デフォルトの名無しさん mailto:sage [2012/02/12(日) 08:17:24.52 ] ご覧下さい このクランケの症例では ・碌に調べもしない ・煽る事で住人達に答えさせようとしている 点が伺えます これらは怠慢横柄病患者に共通に見られるのです
564 名前:デフォルトの名無しさん mailto:sage [2012/02/12(日) 08:37:41.32 ] バレたか・・・ いやまあ、自分で調べなかったわけでもないんだけどな ほぼ無理なのは分かってる
565 名前:デフォルトの名無しさん mailto:sage [2012/02/12(日) 08:40:12.60 ] 本当の地獄はレコードをネストさせてからだ…
566 名前:デフォルトの名無しさん mailto:sage [2012/02/12(日) 11:11:24.92 ] >>562 どういう書き方ができると良かったの?
567 名前:デフォルトの名無しさん mailto:sage [2012/02/12(日) 11:22:02.57 ] >>556 増加だけでもできるようになったのか リリースノートを斜め読みしてたから見逃してた
568 名前:デフォルトの名無しさん mailto:sage [2012/02/12(日) 11:34:11.27 ] ネスとされたレコードの書き換えはdata-accessorとかlenseとか使うと少しは楽になるけど これパフォーマンスどうなるんだろうという不安が出てくる
569 名前:デフォルトの名無しさん mailto:sage [2012/02/12(日) 11:35:43.98 ] >>568 神に従え
570 名前:デフォルトの名無しさん mailto:sage [2012/02/12(日) 12:17:15.85 ] >>566 SomeRecordとSomeFieldを二回も書きたくないというか フィールドと同名のgetterを自動生成するような動きを許容したのなら もっとはっちゃけて欲しかったというか テンプレート? テンプレートなぁ・・・
571 名前:デフォルトの名無しさん mailto:sage [2012/02/12(日) 12:29:24.18 ] TemplateHaskellの有用性はlispが示している
572 名前:デフォルトの名無しさん mailto:sage [2012/02/12(日) 13:23:20.06 ] >>570 そうは言っても、「汎用的にするなら」 少なくとも 1. 何のデータ型の(値の) 2. 何のフィールドを 3. どう変えるのかを この3つのは何らかの形で指定する必要があると思うが
573 名前:572 mailto:sage [2012/02/12(日) 13:31:17.15 ] >>570 すまん、不満点をちょっと勘違いしてたみたいだ こういうことか someRecord { someField = f $ someField someRecord } {} 前の someRecord の部分が型構築子じゃなく値構築子の場合、 f $ someField someRecord の someRecord 部分は明白だから省略可能 こうなれば、幾分スッキリするな
574 名前:デフォルトの名無しさん mailto:sage [2012/02/12(日) 15:04:59.49 ] Cabal でライブラリをインストールする時、 オプションで library-profiling を有効にすると、 そのライブラリもプロファイリングの対象にできるよね これって、プロファイリングしないで普通に使う時は 遅くなったりしない?
575 名前:デフォルトの名無しさん mailto:sage [2012/02/12(日) 15:11:00.59 ] -pを使うとパッケージを二通りコンパイルする ので遅くならない
576 名前:デフォルトの名無しさん mailto:sage [2012/02/12(日) 15:31:06.20 ] >>575 そっか、安心した ありがと
577 名前:デフォルトの名無しさん mailto:sage [2012/02/12(日) 19:23:37.68 ] Yampa の par 関数の型について質問です。 (他のパラレル系関数もですが、代表して par を選びました) par :: Functor col => (forall sf. a -> col sf -> col (b, sf)) -> col (SF b c) -> SF a (col c) このルーチン関数の sf という型変数には、SF b c 以外入ることは無いと思うのですが、 単純に a -> col (SF a b) -> col (b, SF a b) という型では何がいけなかったのでしょうか
578 名前:デフォルトの名無しさん mailto:sage [2012/02/12(日) 21:52:55.77 ] Cabal で --enable-documentation とやっていっしょにインストールされるドキュメントに、 ソースコードへのリンクが貼られるようにする方法はないのでしょうか? HackageDB のサイトで見られるドキュメントみたいにしたいです
579 名前:デフォルトの名無しさん mailto:sage [2012/02/13(月) 10:41:10.37 ] >>577 スライドとか論文だと確かOpacity(透過性?)のためとか書いてあって、 俺も正確な意味はよくわからなかったんだけど、 SFを書き換えられるような関数を渡せるのを防止してるんじゃないかな。 route a xs = [(a, identity)] みたいな、コレクションの中身を無視して出所不明のSFにしちゃうような。
580 名前:デフォルトの名無しさん mailto:sage [2012/02/16(木) 05:11:31.94 ] F#を始めたのだが、モナドで行き詰まっている。 F#の本にはモナドのことが書いていない。 で、ネットでモナドのことを収集すると、ハスケルのがほとんど。 F#での説明もあるが、なんか解りづらい。 で、モナドって何ですか? 関数型プログラミングをやるにはモナドが必須ですか? どなたか教えてください _o_
581 名前:580 mailto:sage [2012/02/16(木) 05:15:46.89 ] ちなみに数学科出身ですが、圏論は知りません。 習った覚えがありませんし、仮に習っていても記憶にないのだから、習っていないのと同じです。
582 名前:デフォルトの名無しさん mailto:sage [2012/02/16(木) 05:48:37.15 ] モナドはモナド則そのもの。 使い方としてはモナド則を頭に入れてからListモナドとStateモナドを理解すれば後は大体類推が利く。 F#でどうなのかは知らないが、少なくともHaskellで何か書こうと思ったらモナドは必須。 まあ「モナドとは何か」みたいな話は過去スレ遡ればいくらでも出てくるよ。
583 名前:デフォルトの名無しさん mailto:sage [2012/02/16(木) 08:10:51.47 ] わかればわかるけど、モナドはモナド則そのものってのが禅問答みたいで わかりにくいんだよなぁ。。 Haskellのクラスは、C++でいう抽象クラス見たいなもので、 Haskellのモナドがクラスでどう定義されてるか調べていけば、 意味はわからなくても、使い方はわかると思うよ。 モナドの意味は使っている内に、なんとなくわかるようになる、、、と思う。
584 名前:デフォルトの名無しさん mailto:sage [2012/02/16(木) 09:19:10.08 ] コンポーネントのようでコンポーネントでない 象のようで象のようでない さてはモナドって南京弾簾だろ!
585 名前:デフォルトの名無しさん mailto:sage [2012/02/16(木) 09:37:41.55 ] Haskell 最大の失敗はモナドにモナドという名前をつけたことにある。 もっと「もこもこ」みたいな可愛い名前にすれば大流行していた。 とか講演でいってたな。
586 名前:デフォルトの名無しさん mailto:sage [2012/02/16(木) 09:48:34.02 ] 名前はモナドのまま、バインド演算子を ( ´∀`)みたいなのにすれば良かったのではなかろうか
587 名前:デフォルトの名無しさん mailto:sage [2012/02/16(木) 09:51:36.68 ] ガンダムで頼む
588 名前:デフォルトの名無しさん mailto:sage [2012/02/16(木) 10:16:54.54 ] >>585 そのソースはどこよ?w
589 名前:デフォルトの名無しさん mailto:sage [2012/02/16(木) 13:28:49.11 ] >>588 元ネタはこれのはず。 Wearing the hair shirt: a retrospective on Haskell (2003) Simon Peyton Jones, invited talk at POPL 2003. research.microsoft.com/en-us/um/people/simonpj/papers/haskell-retrospective/ Our biggest mistake Using the scary term "monad" rather than "warm fuzzy thing"
590 名前:デフォルトの名無しさん mailto:sage [2012/02/16(木) 14:37:03.09 ] 2011年版はビデオで見られる。ちょっと重いけれど。 Escape from the Ivory Tower: The Haskell Journey, from 1990 to 2011 yow.eventer.com/events/1004/talks/1054 簡単だけど32分あたりに "warm fuzzy thing" が出てくる。 各銀行が秘密の Haskell 部隊を雇ってるって話はどこまで本当なんだろう。
591 名前:デフォルトの名無しさん mailto:sage [2012/02/16(木) 15:37:45.12 ] >>583 なんでこのなものが要るのか直感的に分からないってこと?
592 名前:デフォルトの名無しさん mailto:sage [2012/02/16(木) 15:56:24.13 ] >>585 そして処理が一本道だから もこもこで一本道 略して もこみち とかどうよ?
593 名前:デフォルトの名無しさん mailto:sage [2012/02/16(木) 16:21:24.02 ] >>583 Haskellの型クラスはC++の抽象クラスとは全く違うよ。 オブジェクト指向の考え方は捨てるべき。
594 名前:デフォルトの名無しさん [2012/02/16(木) 18:14:54.42 ] Haskellとオブジェクト指向は根本的に違うから例えて考えるのは実際の処理挙動ぐらいにしたほうが……
595 名前:デフォルトの名無しさん [2012/02/16(木) 18:27:40.48 ] C++にはクラスという機能を用いて現実世界の概念を抽象化することに成功し、直感的な設計・実装が行えるようになった Haskellでは、どのようなパラダイムがこれから出てくるのか 私はそれが楽しみでならないのです って去年死んだおじいちゃんが死ぬ間際に言ってた
596 名前:デフォルトの名無しさん mailto:sage [2012/02/16(木) 18:49:29.40 ] ぷうぷう!
597 名前:デフォルトの名無しさん mailto:sage [2012/02/16(木) 19:05:35.61 ] もこもことかモコナとかそういうかわいいのはいらない モサドにしよう
598 名前:デフォルトの名無しさん mailto:sage [2012/02/16(木) 19:24:01.77 ] >>595 Haskellは遅延評価という機能を用いて現実世界の手順を隠蔽することに成功し、 宣言的な設計・実装が行えるようになりました。 しかしHaskellは関数型言語からは踏み出さないだろうから、新しいパラダイムは Ozのようなマルチパラダイム言語に期待すべきだろうと思えてならないのです。 って友達がさっき言ってた。 コンピュータプログラミングの概念・技法・モデル toro.2ch.net/test/read.cgi/tech/1196257692/
599 名前:デフォルトの名無しさん mailto:sage [2012/02/16(木) 19:27:51.75 ] Ozはオワlan
600 名前:餃子チョコレート ◆8X2XSCHEME mailto:sage [2012/02/16(木) 20:52:04.09 ] うまいな。 一瞬「終ったランゲージ」と思わせといて実は「終わらん」というダブルミーニングですね!!
601 名前:デフォルトの名無しさん mailto:sage [2012/02/16(木) 22:13:47.28 ] >>593 そう? 「Learn You a Haskell for Great Good!」には、JavaのInterfaceみたいなのと 考えたほうがいいって書いてるけど。 全く違うっていうならどう考えればいいか説明してほしいな。
602 名前:デフォルトの名無しさん mailto:sage [2012/02/16(木) 22:27:34.65 ] >>591 最初、(>>=)はただ関数に引数にして渡すだけじゃないか、なんで必要なんだとか思ってた。 他のもなんでこんなのが必要か理解できなかったよ。 変な型修飾付けるせいで、型が違うって怒られるし。 でもそうやって好き勝手書けないようにするのが狙いなんだな。
603 名前:デフォルトの名無しさん mailto:sage [2012/02/16(木) 22:46:41.67 ] デザインパターンみたいなもの、でいいと思うけどな > モナド
604 名前:デフォルトの名無しさん mailto:sage [2012/02/16(木) 22:56:34.58 ] 私は >>593 ではないのですが、逆に訊きたいです Haskell の型クラスと Java のインターフェイスにおいて、 考え方の共通点とは何でしょうか それは、コンパイル時にどう解釈されるかというレベルの共通点でしょうか それとも、アプリケーションを作る上での指針となるくらいのレベルの共通点でしょうか
605 名前:604 mailto:sage [2012/02/16(木) 22:57:13.58 ] >>604 すいません、>>601 に対しての質問です
606 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 03:06:37.40 ] Haskellのclassはplatformに改名しろ
607 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 04:24:56.80 ] 型を集合だと考えれば型クラスって命名は自然
608 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 04:41:03.84 ] 型(type)のメタ概念として類(class)という名前を採用することは間違っていない ただし、これだけオブジェクト指向の概念が普及しているのが現実なのだから、 それを配慮した命名が望ましかった(かもしれない)ということ これをHaskellの傲慢さと見るか、それとも数学的に正しい命名であると見るかは 判断が分かれるところ
609 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 04:50:13.16 ] オブジェクト指向のclassが類と無関係だと思ってるっつーか、 類をモデルにしているのはtype classだけだとか思ってるところが Haskellerの傲慢さじゃないの?
610 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 05:12:11.76 ] simula(I,67) staff.um.edu.mt/jskl1/talk.html smalltalk(80) web.cecs.pdx.edu/~harry/musings/SmalltalkOverview.html#The%20Smalltalk%20Object%20Model これ参考にCからC++とObjCができたのか。
611 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 06:49:42.48 ] >>609 オブジェクト指向のclassって命名にケチつけてるなら Haskellerは傲慢だけど、そうじゃないよね?
612 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 07:36:36.25 ] オーバーロードは必要でオーバーライドは不要だと思ってるところが傲慢だ
613 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 09:25:13.67 ] >>580 ここは読んだか? www4.atwiki.jp/fsharpmaster/m/pages/13.html
614 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 09:28:48.05 ] >>550 Johan TibellのHaskell Performance Patterns talkのスライドも このリストに追加の資料になりそう。
615 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 11:31:01.99 ] >>604 全く同じとまでは言わないけど、 Haskellのtype ≒ Javaのclass と考えたときに、 Javaのinterfaceがclassにまたがって横断的に制約を作れるというところが、 Haskellの型クラスがデータ型を横断して共通の「クラス」を作れるところ と似てるって言ってるんじゃないの。 とりあえず最初の入り口から何でも違う違う言ってたら、誰もHaskell始められないよ。
616 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 11:43:00.28 ] >>615 このスレを見て面白そうなので僕は今日から始めました。
617 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 12:42:29.71 ] >>615 ということは、それはコンパイル時の解釈の問題ですよね >>593 は > オブジェクト指向の考え方は捨てるべき と言っており、これはアプリケーションを作る指針となる考え方において、 抽象クラスとは違うことを言っているように思えます もしそうなら、それに対する反論としての >>593 は的外れだと思います >>583 も、わかればわかるけど、モナドはモナド則そのものは解りにくいと言ってることから、 入門レベル(最初の入り口)は通り過ぎているものと思われます。 > とりあえず最初の入り口から何でも違う違う言ってたら、誰もHaskell始められないよ。 それはそうですが、それとは別問題として、話が噛み合っていないような気がします
618 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2012/02/17(金) 13:03:38.71 ] 俺もあんまり「××のようなもの」っていう解釈はしない方がいいと思ってる。 部分的に機能がかぶるだけで類似性を見出していたのではそれに引き摺られて根本的なパラダイムの理解に進み難い。
619 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 13:25:22.45 ] type classってオーバーロードと型推論を両立するための妥協だから パラダイムみたいな高尚な概念じゃないよ
620 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 13:34:40.12 ] そんなこと言ったらOOPにだってパラダイムなんて高尚なもん 一つも無ぇっつーの
621 名前:615 mailto:sage [2012/02/17(金) 14:08:40.22 ] >>617 話の流れ見てなかった。すまんかった。 だからケンカしないで。
622 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 14:17:39.16 ] >>617 横レスだけど、 ・オブジェクト指向のクラスもHaskellの型クラスも 「抽象データ型」の実現という意味では似ている(>>615 ) ・オブジェクト指向の「インヘリタンス」とHaskellの「アドホック型多相」とは 型システム理論という意味では全く違う(>>593 ) ということじゃないのかな? 各用語の意味は、自分で調べてね
623 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 14:31:40.54 ] >>622 OOPの「継承」は部分型多相では?
624 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 14:34:40.69 ] >>623 オーバーライトや疑似変数selfなんてのは、部分型多相には存在しない概念/理論
625 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 14:46:11.83 ] >>623 なるほど。型理論勉強します。
626 名前:625 mailto:sage [2012/02/17(金) 14:46:38.91 ] >>624 だった
627 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 14:58:14.86 ] >>619 型クラスにはアドホック型多相という理論的基盤があるから、 それはいわゆる「高尚」と表現してもかまわないんじゃまいかと思う >>620 OOPの継承というのは直感的かつ曖昧なもので、その足場は非常に不安定 だからオブジェクト指向について10人に尋ねれば、10人それぞれが異なった解釈を返す そんな代物を「高尚」とは、とても呼べないんじゃまいかと思う
628 名前:627 mailto:sage [2012/02/17(金) 15:10:40.81 ] 訂正 X: OOPの継承というのは.... O: OOPというのは....
629 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 15:18:03.49 ] >>624 概念/理論は存在したり存在しなかったりするんだな・・・ それなら概念/理論を教えるよりも実装を教える方が良い
630 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 15:22:36.71 ] 例えばC++で言うところのオブジェクト指向とは ・情報隠蔽 ・継承 ・ポリモーフィズム でした
631 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 15:26:42.34 ] オーバーロードをアドホック多相と言いかえると何か凄そうに見えるテクニックはテストに出ます
632 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 15:39:17.02 ] >>629 >概念/理論は存在したり存在しなかったりするんだな・・・ え、オーバーライトや継承の概念を含む、いわゆる「継承の型システム」に関する理論は、 いくつか存在しているよ 足りないのは動的なメソッド結合(ダックタイピング)や動的な型付け(メタプログラミング)の理論 そんな完成した静的型付けな型システムの一つを実装したのがObjective-Caml ただし、(Objective-CがOOとCのハイブリッド言語であるように) 部分型多相と継承は理論的に全く違うから、両者のハイブリッドになっている 結果として、残念ながら「関数型パラダイムにおけるオブジェクト指向」という理想には程遠い
633 名前:632 mailto:sage [2012/02/17(金) 15:41:17.07 ] また訂正 X: オーバーライトや継承の概念を含む、.... X: オーバーライトや疑似変数selfの概念を含む、....
634 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2012/02/17(金) 15:48:26.21 ] >>633 また訂正ですね!!
635 名前:632 mailto:sage [2012/02/17(金) 16:17:42.90 ] >>634 ...orz すぐに分かってくれたようだから、あえて訂正しないw >>631 MLやHaskellでは、JavaやC++のようなNullPointerExceptionやBusErrorは発生しない 型に関するミスは、コンパイル時にすべて検出できる それが、理論的背景のある型システムの「凄さ」だと言える 次のテストに出すかもしれないから、よく復讐しておくように
636 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 16:40:57.39 ] 別に凄くない むしろ、すべてに責任をもつことはできないから責任を限定する理論が必要になる 型に関するミス以外は管轄外だし プログラマーが勝手に Nothing とか [] を使うのは自己責任
637 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 16:47:11.46 ] 言語の中でNullを扱わなくなっただけで、Nullみたいな値の濫用の余地は残るわけですよね。 昔のCOBOLはNULLが扱えなくて0000や9999などの値で成功失敗とか表現していましたし、そういうシステムはかなり多いと聞いています。 つまり、NULL無いんなら0000や9999でいいやと思うような人には型システムなんて意味ないんじゃないでしょうか?
638 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 16:56:36.58 ] >>611 他パラダイムや他言語を矮小化する一方で、 「無秩序でいい加減な」という意味のアドホック多相を あたかも高尚なものであるかのように 誇張しているだけだから、傲慢じゃなくて 滑稽だね。
639 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 17:06:52.05 ] ad hoc adv., adj. (特に)このために[の], 特別に[の], この場限りで[の], その場限りで[の]. 研究社 新英和大辞典 第6版
640 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 17:20:15.57 ] www.youtube.com/watch?v=z5rRZdiu1UE
641 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 17:21:05.17 ] カズヤマモトサンかっけー
642 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 18:09:29.51 ] この流れで質問させてください 型クラスってのは代数的構造のことではないんでしょうか?
643 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 18:48:32.83 ] >>642 そんなようなものだけどもうちょっと一般的 C aというインスタンスのメソッドの戻り値の型はa以外になり得る OrdとかShowとか
644 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 18:57:33.81 ] >>635 ヌルポは値に起因するバグで、型システムによる安全性の保証外なのはML系でも同じだよ。 MaybeはまんまC#のnullable<T>だし。 Haskellはパターンマッチでパターンを網羅してないとちゃんと警告出してくれたり、 Maybeモナドみたいな明示的にチェックを書かなくても済む仕組みその他諸々のおかげでバグりにくいって話で、 コンパイルで検出出来てるわけじゃないし、発生しないわけでもないよ。
645 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 19:12:32.81 ] >>642 型クラスもデータ型もメモリ上のビットも代数的構造
646 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 19:24:43.41 ] NullPointerExceptionはバグなの?
647 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 19:29:54.49 ] >>644 Maybeはぬるぽがっされないような、、、
648 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 19:43:26.86 ] >>645 そういう文脈で代数的構造と言った場合の「代数的」とはどういうものですか?
649 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 20:02:36.22 ] >>648 代入可能なこと 定数以外は代数的構造
650 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 20:55:05.10 ] >>647 トリビアルな例だけど、常にJustな事が期待されてる変数alwaysJust :: Maybe aがあったとして、 1) case alwaysJust of --これは警告がでるけど Just x -> x 2) let (Just x) = alwaysJust in x -- こんなドタコなコードは書かないけど… 3) -- fooの使用者からは定義かドキュメントを見ない限り、例外が上がってくる可能性がある事は知りようがない foo :: a -> a foo v = fromJust $ do -- fromJustってどういうケースで使うんだろか…。 x <- alwaysJust v' <- Just v ... return v' もし、alwaysJustがバグっててNothingだったら、上の例は全部例外あげてくる。 特に3番目みたいな外からは一見安全に見える型の関数でも、ガッされない絶対の保証があるわけでも、検出できるわけでもないよ。 (1番目以外は警告すらでないし) Maybeからそれると、Preludeの関数でもListのheadとか(!!)とか、Enumのsucc、predとかreadやArrayとか、 プログラマがちゃんと保証しなきゃいけない関数も結構あるし。
651 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 21:29:13.08 ] Maybeからそれると、Intも危険だよね オーバーフローして意図しない挙動をする危険性があるから プログラマがちゃんと保証(ry
652 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 21:31:32.72 ] RWHを買ってきました あしたRWHを一日かけて読み切ります 何か注意点とかありますか
653 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 21:35:16.99 ] 急いで読まない
654 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 21:59:05.59 ] コードを写経して動かなくても文句言わない
655 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 22:12:05.67 ] なんか、ものすんごい勢いでレスついてるね。 みんな暇か?
656 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 22:15:37.70 ] 詰まったり解らなかったり動かなかったら本家(>>5 の上)のコメントなんかも参照 一日で読み切れなくても泣かない投げない
657 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 22:19:09.47 ] >>652 最初からまじめに読んでいくと冗長度が高くて飽きる。飛ばして途中から見ると何言ってるのか分からない。 昆虫本には良くあることです
658 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 22:28:48.44 ] 今 GHC 7.4.1 の環境です デュアルコアのCPUを使ってて、GHC の RTS オプション -N2 で、 2スレッドが平行して動くことは確認できました 今 Intel のハイパースレッディング(HT)機能を持つ CPU に変更する検討をしていますが、 GHC のマルチコア機能はHTに対応するのでしょうか コア数を返す関数がHTを考慮した論理コア数を返す事はリリースノートで確認しましたが、 実際に平行して動くスレッドの数として正しく機能するかという質問です つまり、例えばコア数2のHT機能を持つCPUで -N4 を指定すれば、 ちゃんと4つのスレッドが平行して動くのでしょうか
659 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 22:30:08.58 ] RWH一日は無理だろ
660 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 23:04:02.43 ] >>658 >GHC のマルチコア機能はHTに対応するのでしょうか => Yes >ちゃんと4つのスレッドが平行して動くのでしょうか => No ちゃんとの意味にもよると思いますが 詳しくはwikipediaを
661 名前:デフォルトの名無しさん mailto:sage [2012/02/17(金) 23:25:23.88 ] >>660 > ちゃんとの意味にもよると思いますが 例えば RTSオプションで -s を指定して実行して得られる情報において、 コア数2のCPUよりコア数2HTのCPUの方が、 よりコア数4のCPUに能力的に近いと分かる結果が計測値として出るか、 という意味です
662 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 00:28:18.38 ] >>661 だったらあらためてNoです HTではほとんど性能向上しません(だったような
663 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 09:15:59.39 ] HTって遊んでるユニットを怠けさせないで酷使させる機能に過ぎないから 遊んでるユニットが登場しないサイクルでは機能しない なんちゃって2倍でしょ
664 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 09:36:00.16 ] カズ山本 ttp://redstar-s.blogzine.jp/redstar/images/softbank_hawks_store-img444x600-1121339119kazu_yamamoto.jpg
665 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 18:34:36.09 ] RWHどうなった?
666 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 19:03:40.00 ] >>662 コア数2のノーパソから手頃かに価格のコア数2HTのノーパソに買い換えようかと思ってましたが、 Haskell 絡みではあまり幸せになれなさそうですね コア数4くらいのがもう少し安くなるまで待つことにしました >>663 なるほど、妙に納得しました
667 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 19:09:24.78 ] 正確に2倍になるわけじゃないが、1.7倍ぐらいは楽勝でいくだろw
668 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 19:38:41.19 ] 1.7倍どころかインテル自称で20%増し程度じゃないのか その上、場合によっては遅くなったり、不具合出るオマケ付きっつー… まぁHTとHaskellは殆ど関係ないんじゃないか?
669 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 21:01:38.89 ] HTで速くならないのはコンパイラがそういう最適化をしてないからだろ 1ヶ月ぐらいCPUぶん回す数値計算ならHT向けの最適化をやる意味はあるだろうが、 特に用途も決まってないHaskellが特定のCPU命令セットの最適化して意味があるとは思えないが
670 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 21:15:03.37 ] インテルの発表で sandybridgeで8割に上がったような話があったような気がする。 たしか、HT:ONの場合、 マルチコア全部使い切るようなプログラムのスループットは1->0.8x2x(smp8コア/4コアの効率比が1として)=1.6ぐらい。 ただし、シングルプロセスの実行部分は、 邪魔されて0.8ぐらいまで落ちる場合があるが、 OSのプロセス管理で、なるべく占有できるところに配置される。
671 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 21:16:07.06 ] いままでは、7割、7.5割と上がってきてたのが8割。
672 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 21:19:56.22 ] コンパイラがいくらがんばっても演算密度が十分濃ければSMTで性能は上がらないでしょ
673 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 21:21:34.04 ] >>669 HTの効果を利用するには専用の命令セットを叩く必要があるのでしょうか 今までずっと、特に意識すること無く自動的に各HTに処理を割り振ってくれると思ってました repa を使ってるとダイレクトにマルチコアの恩恵を受けるので、 HTで更に2倍になるならいいなぁと思ってたんですが・・・
674 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 21:25:55.33 ] ようするに、HTで4PC/8VCなら、 OFF:1-4が、 ON:0.7-5.6、0.75-6.0、0.8-6.4 とP4のころに比べて進化してきてるような話だったと思う。
675 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 22:14:43.49 ] >>673 すまん。HT用のインストラクションじゃなくて、HT用に処理をマルチスレッドに分解したり、 スレッドに適したキャッシュ配置にするような特定のCPUアーキテクチャ実行モデルを仮定した最適化という意味だった ICCとかがそういう最適化を前面に出してるが、実際にはそれほど単純には速くならない
676 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 22:50:19.80 ] >>675 なるほど、でも > HT用に処理をマルチスレッドに分解したり この部分は、元々シングルスレッドだったものを、 コンパイラが「勝手に」上手くマルチにしてくれることは無い という意味ですよね もともとマルチスレッドで Haskell のソースコードを作っていたら、 実行時に勝手に HT に振り分けてくれないのですか? そんな単純ではない?
677 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 23:00:34.29 ] 文字列で日本語使えないのでしょうか?
678 名前:675 mailto:sage [2012/02/18(土) 23:03:27.58 ] >>676 近所でICCでMPIをやってる人がいたが、期待したほど速くならなくて困ってた なので、Haskellもそんなにうまく速くなるわけではないと思ってるけど、 速くなるのなら型システムよりもすごいことなんじゃないかと思う
679 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 23:11:59.78 ] >>677 もう少し問題をハッキリさせようか 今の Haskell は標準で UTF-8 でエンコードされた文字データを処理できる ここでいう処理というのは、Char 型の変数にデータを束縛できるという意味 >>677 は何が問題だと感じている? あと環境も教えてくれ(OS やコンパイラのバージョンなど)
680 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 23:19:22.20 ] >>678 例えば、Haskell で repa を使って画像データを配列に読み込んで、 それに対してぼかし処理とか FFT 処理とか施したりする場合、 2コアCPUを使って RTS オプション -N1 と -N2 とでは全く処理速度が違う 驚くと同時に感動すら覚える HTを持つCPUも、コアが増えたのと同程度とは期待していないが、 1.5倍程度は速くならないかなと思ってたんだけど だれか試してくれないかな
681 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 23:25:09.94 ] >>679 CSVファイル(Excelで出力したShift_JIS)を読み込んで、lines関数で分割した後、id関数に入れて、そのままunlinesしてファイルに出力したら日本語の場所が文字化けしてるです Haskellそのものの仕様で使えないのか、入力系かParsecか出力系のエラーで使えないのか、特殊な文字列データ型を入れれば使えるのか知りたいです Windows7、The Glorious Glasgow Haskell Compilation System, version 6.12.3 です もしHaskellそのものの仕様で日本語が使えないのならCSVファイルを編集して日本語部分を全部ASCIIコードでローマ字にします
682 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 23:44:47.47 ] >>681 下記のコードで全く問題なく Shift_JIS をロードして Shift_JIS で保存された writeFile "test2.txt" =<< return . unlines . id . lines =<< readFile "test.txt" [環境] Windows7 GHC 7.4.1
683 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 23:49:00.05 ] >>680 repaすごいな ここまでマルチコア意識してるなら速くなりそうな気がするな
684 名前:682 mailto:sage [2012/02/19(日) 00:40:54.82 ] >>681 ちなみに、>>682 のコードの id の部分を map (take 3) とかにした場合、 保存されたテキストを Shift_JIS として解釈する(開く)と文字化けして見える 何も加工しなければ、読み込んだデータの形のまま保存される (例えば SQL で Shift_JIS の文字列を読み込んでそのまま出力する場合も含む) 文字単位で加工したければ、 読み込み前に CSV ファイルを予め UTF-8 に変換しておくか、 あるいは読み込んだ後に UTF-8 に変換する必要がある (例えば iconv パッケージを使う) そして、例えば Data.String.UTF8(utf8-stringパッケージ)を使って加工するとか
685 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 01:50:54.96 ] >>684 ParsecでCSVファイルの解析をためしたら文字化けしてたから、idとかに変えていろいろ試してました これ結局、Parsecを間に入れてファイル入出力する場合は文字コードの変換を明示しないとダメということなんですね
686 名前:682 mailto:sage [2012/02/19(日) 02:13:53.28 ] >>685 そう Parsec で日本語を処理したいのなら、処理前に UTF-8 にエンコードしないとダメ 参考になりそうなページ snak.tdiary.net/20110104.html
687 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 09:55:24.28 ] あれ、Hackage落ちてる?
688 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 15:43:45.81 ] 諸君、お薦めのライブラリは何かね?
689 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 15:51:43.82 ] prelude
690 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 15:58:31.27 ] Data.List もなかなか
691 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 15:58:44.91 ] こやつめ!ハハッ!
692 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 16:00:51.90 ] 僕はForeignちゃん!
693 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 21:52:36.96 ] すみません、質問させてください。以下のコードが、なぜか意図した通りに動作しません。 (一応なるべく簡略化したので、このコード自体に深い意味はないです) combination n r =div (product [1..n]) (product [1..r] * product [1..n-r]) f n = length (takeWhile (<=4000) (map (combination n) [1..5] )) hoge = [n - f n | n<-[20]] 私はこの hoge を [20 - f 20] のつもりで書きました。GHCで [20 - f 20] と入力すると 17 と返ってくるので、 hoge は [17] になっていてほしいです。 なのに、なぜか hoge と入力すると [15] が返ってきます。どなたかどこが誤っているのかわかる方がいらっしゃったら教えていただけないでしょうか。
694 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 22:36:50.85 ] >>693 product [1..20]がオーバーフローしている。 ghciで [20 - f 20] としたときはたぶんf 20の20がIntegerとして評価されているからオーバーフローが生じていない。 ghciで[20 - f (20 :: Integer)]と[20 - f (20::Int)]を比較して、考えれば、言っていることが分かるだろう。
695 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 22:39:24.02 ] >>693 原因は >>694 の通り 解決方法の一つは、f 関数内で length 関数の代わりに genericLength 関数を使う
696 名前:694 mailto:sage [2012/02/19(日) 22:43:26.21 ] import Data.ListしてlengthのかわりにgenericLengthを使えば解決するみたい
697 名前:695 mailto:sage [2012/02/19(日) 22:43:45.05 ] すまん、 その >>693 の(型シグネチャを省いた)例なら、 genericLength 関数を使えば自動的に全て解決するという意味 実際のコードで型シグネチャを書いてる場合、 例えば combination 関数の型が Int -> Int なら、 それも Integer に直す必要がある
698 名前:694 mailto:sage [2012/02/19(日) 22:44:07.36 ] だから、リロードしろとorz
699 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 22:54:59.05 ] やっぱりIntは撲滅すべきだわ
700 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 22:58:28.08 ] 単一の式では、nとnは同じ型でないといけないけど、 20と20が同じ型である必要はないってことだね 「lengthがIntegral a => a型ではなくInt型を返すのはまったく馬鹿げたこと」 だっけか
701 名前:デフォルトの名無しさん mailto:sage [2012/02/19(日) 23:21:56.89 ] >>699 それは無い ただ、オーバーフローしたのならしたと分かるような、 デバッグ用の RTS オプションとかあるといいな
702 名前:693 mailto:sage [2012/02/19(日) 23:52:01.42 ] >>694-697 ,700 なるほど、そういうことでしたか。型宣言は省略していたので、おっしゃる通り genericLength という関数を(初めて見ました)使うことで解決しました。 質問前にコードを書き換えて実験していたとき、 hoge = [f n | n<-[20]] とするとちゃんと [f 20] に一致するのが不思議だったのですが、それも >>700 を読んで合点がいきました。 単に f n と書くと Integer 型として扱われるが、n - f n と書いた場合には n が Int 型になってしまっていたのですね。それでオーバーフローしたと。 自分では絶対に気づきませんでした…。お三方(お二方?)ご親切にありがとうございます。
703 名前:デフォルトの名無しさん mailto:sage [2012/02/20(月) 12:44:31.59 ] windowsでgtk2hsの最新版に-threadedつけたら普通にぶっ壊れてワロタ その問題は直ったって言ったじゃないですかー!
704 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 01:04:11.99 ] wondowにこだわってたら、面倒は多いだろうからな。
705 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 18:49:36.88 ] >>703 Haskellに限らず、gtk全般がwindowsと相性が悪いと思うのは私だけでしょうか?
706 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 19:12:47.80 ] wxWisgets の方が安定してるような感じはするな 今は wxpack もあって、Haskell で使うのも、 特別なことをしなければ gtk2hs 並に簡単になった
707 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 19:21:08.18 ] GUIはVBやVCでインターフェイス作って、パイプ通してHaskell使ってる
708 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 19:31:59.91 ] wxHaskellっててっきり開発止まってるんだと思ってたら 一月に新しいの出てんのね ちょっと移るか・・・
709 名前:デフォルトの名無しさん mailto:sage [2012/02/23(木) 21:38:20.07 ] permutationパッケージって不便じゃない? 重複もある要素群から組合せや順列作りたい時どうするの?
710 名前:デフォルトの名無しさん mailto:sage [2012/02/24(金) 00:08:55.34 ] Haskellの名前空間ってどうなってんの? 二つの別のモジュールで同名の関数定義してたらmoduleName.は略せない
711 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2012/02/24(金) 00:48:25.04 ] 候補が複数ある関数を使ったときだけエラーにすればいいと思うんだよな。 実際に使ってない関数で衝突があってもどうでもいいじゃん。
712 名前:デフォルトの名無しさん mailto:sage [2012/02/24(金) 03:21:55.39 ] >>710-711 それぞれのモジュールをインポートするときに インポートする関数名を明示的に指定するんじゃだめなのかね?
713 名前:デフォルトの名無しさん mailto:sage [2012/02/24(金) 07:30:30.90 ] >>710 指摘している問題箇所がよく分からない こちらの環境(GHC 7.4.1)で試したら、全く問題なかったんだが -----[ Mod1.hs ]----- module Mod1 (t1, t2) where t1 = (*3) t2 = (+7) -----[ Mod2.hs ]----- module Mod2 (t1, t3) where t1 = (*5) t3 = (+13) -----[ ModC.hs ]----- module ModC where import Mod1 import Mod2 f = t2 g = t3 ghci でエラーも無く ModC をロードできる 当然、関数 f や g は普通に使える また、ghc で実行ファイルやライブラリにコンパイルする事もできる ModC で関数 t1 を使おうとすると Ambiguous occurrence エラーが出る その場合はモジュールを明示するか、import でエイリアス名を指定すれば良い 何が問題なんだ?
714 名前:デフォルトの名無しさん mailto:sage [2012/02/25(土) 17:50:44.36 ] Cabal の挙動がいまいちよく分かりません *.cabal ファイルに例えば以下のような記述があった場合 flag ichigo default: False if flag(ichigo) ---[ A ]--- else ---[ B ]--- configure に [A] が通るのか [B] が通るのか、どちらなのでしょうか
715 名前:デフォルトの名無しさん mailto:sage [2012/02/26(日) 18:39:03.77 ] forallってオプションと共に用いて 型の決め打ちを段階的に遅延してもらうものだと思えばいいの?
716 名前:デフォルトの名無しさん mailto:sage [2012/02/27(月) 07:24:50.28 ] >>715 どうしてそう思う? (違うと言ってるんじゃなくて、単純にその考え方に興味があるだけです)
717 名前:デフォルトの名無しさん mailto:sage [2012/02/27(月) 08:03:50.64 ] id:: a -> a (\f -> (f 1,f "1")) id No instance for (Num [Char]) arising from the literal `1' at <interactive> Possible fix: add an instance declaration for (Num [Char]) In the first argument of `f', namely `1' In the expression: f 1 In the expression: (f 1, f "1") これがエラーになるのは コンパイル時に最初に評価したほうの型で固定しちゃうからでしょう? 最初に解釈した段階でid 1だから id::Int -> Int で固定しちゃう 次にid "1" をみてなんだこりゃ? id:: String -> Stringなんて聞いたこと無いぞ!とコンパイラが怒り出す この悲劇を回避するために 決め打ちは一段階待ってくれ a -> a のまま進んでくれ ってのがforallとXRank2Typesオプションのセットの役目なんじゃないの? 評価の遅延じゃん? 実行の遅延評価じゃなくてコンパイル時の型の遅延評価だから メタ遅延評価的な
718 名前:デフォルトの名無しさん mailto:sage [2012/02/27(月) 12:45:29.31 ] 評価順序によらないはずなのに「最初に評価したほうの型」ってなるのが面白いね。 値を遅延評価できても、型も遅延評価できるとは限らないんだな。
719 名前:デフォルトの名無しさん mailto:sage [2012/02/27(月) 13:20:52.44 ] あくまでコンパイル時の話だし 静的に型付けて片付ける型の言語だし そのくらい大目に見てやれよ
720 名前: [―{}@{}@{}-] デフォルトの名無しさん mailto:sage [2012/02/27(月) 17:39:59.79 ] 決め打ちするのはその通りだけど順番は関係ないよ どっちから型を付けても(エラーメッセージ以外は)同じ結果になる
721 名前:デフォルトの名無しさん mailto:sage [2012/02/27(月) 21:39:35.38 ] forall の話が出たんで、理解をより深めようと調べてたんだけど、 en.wikibooks.org/wiki/Haskell/Existentially_quantified_types このページで分からない部分がある [Explaining the term existential] のセンテンスの 「But we got almost the same behaviour above using datatypes. Let's declare one.」 の直前まではなんとか分かった forall = 積集合 exists = 和集合(Haskell の構文には無い) というのも、納得はできないが、とりあえずそういうものだと見なす事にする で、そのすぐ下の「MkT :: forall a. a -> T」 の意味を説明している部分がよく分からない これまでの話の流れからすると、forall a. (a -> T) というのが、 どういう型(を意味する集合)の積集合になるかを考えれば良いんだよな つまり、 Int -> T という型を意味する集合が持つ要素 String -> T という型を意味する集合が持つ要素 ・・・ などに共通する要素だけを持つ型が forall a. a -> T なんだよな ここまでは合ってる? で、その共通する要素って、ボトム以外に具体的にどういうものがあるのかな と考えてみると・・・ よく分からない 「何かを入力して型 T の値を得る関数」というのがそれかなと初め思ったけど、 じゃあこれは例えば「Int -> T という型を意味する集合が持つ要素」に含まれているのか と考えると、なんか違う気がする
722 名前:デフォルトの名無しさん mailto:sage [2012/02/27(月) 23:11:20.23 ] エラー (\f -> (f 1, f "1")) id 積集合 (\(f,f') -> (f 1, f' "1")) (id,id) 和集合 id' (Left x) = Left (id x) id' (Right x) = Right (id x) (\f -> (f (Left 1), f (Right "1"))) id' 集合が有限なら、forallとexistsは不要です。
723 名前:デフォルトの名無しさん mailto:sage [2012/02/27(月) 23:52:14.92 ] 時間の無駄
724 名前:デフォルトの名無しさん mailto:sage [2012/02/28(火) 00:04:14.04 ] 無限リストを扱えるから限定子が必要 という説明からはじめてくれないと困る
725 名前:デフォルトの名無しさん mailto:sage [2012/02/28(火) 03:02:25.61 ] >>721 俺は共通する要素とか集合って考えるより、 特定の型に依存しない性質を含んだ関数って考えた方がピンとくるな。 >で、その共通する要素って、ボトム以外に具体的にどういうものがあるのかな 要するにT aという型のコンテナTに対して、格納しているa型の値に直接触れずに、 コンテナの構造だけを変えたり(flatten :: forall a. Tree a -> [a]、tail :: forall a. [a] -> [a]とか)、 コンテナ自体の情報を返す(length :: forall a. [a] -> Int)類の関数。 特にリストのhead、(!)とか、タプルならfst、sndみたいに値を取り出すような関数も、 中身に触れなければ型に依存しない性質は保たれるってのは重要。
726 名前:デフォルトの名無しさん mailto:sage [2012/02/28(火) 07:44:27.79 ] >>722 それは俺(>>721 )に対する返信? もしそうなら、>>721 のページで言ってる forall = 積集合 という場合の集合は、 {⊥, 0, -1, 1, -2, 2, ...} を要素に持つInt型という名前の集合 {⊥, True, False } を要素に持つBool型という名前の集合 {⊥, "kyu-ri", "daikon", ...} を要素に持つString型という名前の集合 ・・・ という意味の集合だと思うんだけど で、例えば forall a. a は「全ての型(集合)の積集合」だから、 {⊥} を要素に持つ集合、つまり⊥しか値を取り得ない型になる これと >>722 との繋がりがよく分からない(繋がった話ならという場合だけど) >>725 同じだ、俺も今まで似たような考え方でやってきたんだ それはそれとして、では >>721 のページに載っている考え方だと、 MkT :: forall a. a -> T はどう説明できるのかなという話
727 名前:デフォルトの名無しさん mailto:sage [2012/02/28(火) 10:03:32.17 ] >>726 Int型はIntの値の集合ではなく、Intの値を取り出せるデータ構造の集合だ、と定義すればいい。 例えば、0というデータから取り出せるのはIntだけでなく、Doubleも取り出せる。 forall a. a->TからはInt->TやDouble->Tなどを取り出せる。
728 名前:デフォルトの名無しさん mailto:sage [2012/02/28(火) 12:47:20.41 ] >>727 いや、ちょっと待って そうやって勝手に話の前提を変えた場合、>>721 のリンク先の話は ちゃんと整合性を保って説明できるのだろうか (整合性を保って説明できるように隠れた定義を暴き出してくれたのなら大変有り難いが) リンク先ではハッキリと Bool is the set {True, False, ⊥}, Integer is the set of integers (and bottom), String is the set of all possible strings (and bottom), and so on. と定義されていて、これを前提にしてその後の話が続いている > forall a. a->TからはInt->TやDouble->Tなどを取り出せる。 もしそうだとすると、forall a. a からは Int も Double も取り出せるということ?
729 名前:デフォルトの名無しさん mailto:sage [2012/02/28(火) 13:07:28.91 ] ⊥しか取りえないってのは間違い。 MkT :: forall a. a -> Tはどんな値でも取ってT型を返す関数。 全称量化することで、型パラメータaが取り得る全ての型に共通の性質だけにしか言及できなくなる。 で、結局の所、⊥か、それ以外の何かが入ってる、としか言えなくなる。 (もちろんisBottomみたいな関数は定義できないから、実質何が入ってるかは不明) forallが積集合云々ってのは、このことを言いたいんじゃないかと思う、多分。 一応、 foo (MkT x) = x :: T -> a bar (MkT x) = id x :: T -> a dup (MkT x) = (x, x) :: T -> (a, a) みたいな関数は定義できる。 まぁT型の定義じゃ意味のある関数は定義できないけれど、値を取り出して関数適用するだけならおkだから、 型制約付けといたり、関数とセットで入れとくと、OOPっぽいポリモーフィズムできるようになったりする。 ttp://www.kotha.net/ghcguide_ja/latest/data-type-extensions.html#existential-quantification (件のページのNotesみて初めて知ったけど、WHNFに簡約はできるって発想は無かった…)
730 名前:デフォルトの名無しさん mailto:sage [2012/02/28(火) 13:59:49.98 ] 初心者で申し訳ありません。 ggrksとか言わないで下さい。ググッた結果↓ ⊥ に一致する情報は見つかりませんでした。
731 名前:デフォルトの名無しさん mailto:sage [2012/02/28(火) 20:16:28.02 ] >>730 ⊥ はボトムと読みます
732 名前:デフォルトの名無しさん [2012/02/28(火) 21:17:38.37 ] * LLクズがウォーミングアップを始めたようです! *
733 名前:デフォルトの名無しさん mailto:sage [2012/02/28(火) 23:59:59.80 ] 学部時代にHaskellに没頭していた俺ですが、今では立派なPython厨です
734 名前:デフォルトの名無しさん mailto:sage [2012/02/29(水) 02:29:52.31 ] Web+DB誌に山本和彦によるHaskell入門が載ってるみたいだけど、読む価値ありますか?
735 名前:デフォルトの名無しさん mailto:sage [2012/02/29(水) 03:25:58.19 ] 雑誌の言語紹介記事なんてのは布教用だから、 Haskellerが読むようなものじゃない。
736 名前:デフォルトの名無しさん mailto:sage [2012/02/29(水) 06:23:56.45 ] その記事で、Learn You a Haskell for Great Good!の訳本出るって書いてる 『すごいHaskell たのしく学ぼう!』 * 田中英行、村主崇行訳 * オーム社 * 2012年5月発売予定 まあいいんだけど、タイトルダサいな。
737 名前:デフォルトの名無しさん mailto:sage [2012/02/29(水) 07:53:36.61 ] >>729 > 全称量化することで、型パラメータaが取り得る全ての型に共通の性質だけにしか言及できなくなる。 >>726 でも言ったが、俺も普段は似たような考え方で forall を扱っている しかし、この考え方とリンク先のページで述べられている考え方との整合性がなんか上手く取れないんだ (たぶん同じ forall について我々とリンク先は別の視点、捉え方で見ていると思うんだ) > ⊥しか取りえないってのは間違い。 例えば >>726 を繰り返すが (読み返してみて、誤解を与える表現に気づいたので括弧は外した) ⊥, 0, -1, 1, -2, 2, ... を要素に持つInt型という名前の集合 ⊥, True, False を要素に持つBool型という名前の集合 ⊥, "kyu-ri", "daikon", ... を要素に持つString型という名前の集合 ゆえに forall a. a は ⊥ を要素に持つ(名前は知らん)集合 という考え方を取っている(これはハッキリ書かれている、と俺は思う) 貴方や俺が普段取っている「型パラメータaが取り得る全ての型に共通の性質」という考え方ならば、 例えば forall a. (Show a) => a とすれば、その共通する性質をさらに (Show a) と絞り込む という風に素直に考えられ、実際のコンパイラの挙動とも合致する しかし、リンク先の考え方だと、forall a. a で {⊥} という集合なら、 これに対して (Show a) という性質で絞り込むことがちょっと想像できない forall a. a -> T についても同じ リンク先の言いたいことは何なんだろうというのが疑問なんだが、 申し訳ない >>729 でもまだ疑問が解消されない (やっぱりそう考えた方が今はまだ分かりやすいな、という気持ちは再確認できたが)
738 名前:デフォルトの名無しさん mailto:sage [2012/02/29(水) 16:00:11.89 ] 729は「aの性質に言及するのをやめれば、共通の要素を作れる」と言っている 737は「aの性質を考えると、共通の要素は⊥しかない」と言っている つまり、型を考えるのをやめれば便利なものを作れるが、 型を考えると、そんな便利なものは存在しないということを証明できる
739 名前:デフォルトの名無しさん mailto:sage [2012/02/29(水) 19:01:47.59 ] >>738 ごめん、どういうことなのか、ちょっと分からない 混乱してる >>737 (俺)が言ってるんじゃなくて、言ってるのは俺が示したリンク先のページだよ そして、aの性質を考えるとじゃなくて、forall の性質=積集合を考えると、ね a は単に forall に束縛された型変数で、重要な性質を持ってるのは forall の方だと俺は思う よく分からないけど、俺の疑問の解消に少しでも繋がるような 何か証明ができるのなら、是非してみてほしい お願いする
740 名前:デフォルトの名無しさん mailto:sage [2012/02/29(水) 20:01:40.01 ] >>739 じゃあMkTという関数があってMkTの型(a->T)は(aに関しては)重要ではないとする 重要ではないので適当に MkT ∈ (Int->T) MkT ∈ (Bool->T) MkT ∈ (String->T) ・・・ ということにすればMkT ∈ (forall a. (a->T)) だから(forall a. (a->T))には⊥以外の要素が入っている
741 名前:デフォルトの名無しさん mailto:sage [2012/02/29(水) 20:17:30.41 ] >>740 確認したいんだが、 MkT ∈ (Int->T) MkT ∈ (Bool->T) MkT ∈ (String->T) ・・・ これは全て AND で結ばれているんだよな つまり、全ての積集合を意味しているんだよな {MkT ∈ (Int->T)} AND {MkT ∈ (Bool->T)} AND {MkT ∈ (String->T)} ...
742 名前:デフォルトの名無しさん mailto:sage [2012/02/29(水) 20:46:56.98 ] >>741 そうだね ANDだね
743 名前:デフォルトの名無しさん mailto:sage [2012/02/29(水) 20:58:30.82 ] 積じゃなくて直積じゃね?
744 名前:デフォルトの名無しさん mailto:sage [2012/02/29(水) 21:00:47.10 ] >>743 どうして?
745 名前:デフォルトの名無しさん mailto:sage [2012/02/29(水) 21:21:11.49 ] ごめん勘違い、そこは積集合であってる
746 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 02:57:49.52 ] (Int -> T)は { ⊥, (\x -> T), (\x -> let _ = x + 1 in T), ... } (String -> T)は { ⊥, (\x -> T), (\x -> let _ = x ++ "foo" in T), ... } forall a. (a -> T)は { ⊥, (\x -> T) }
747 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 03:05:14.44 ] ちょっと間違い forall a. (a -> T)は { ⊥, (\x -> T), (\x -> let _ = x in T), ... } だった つまり書く集合の内xをIntなどの具体的な型として 扱っていない項だけが残る
748 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 07:23:19.60 ] >>746 , >>747 すげー分かりやすかった なるほど、forall a. a の時のように、 ちゃんとそれぞれの型の場合の取り得る値の集合の積で考えられるんだ 合点がいった ありがと スッキリしたから、もう少し先まで読み進めてみる
749 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 12:01:47.26 ] 【言語別成果物】 PHP「掲示板作りました!」 Ruby「Railsで住所管理アプリ作りました!」 Java「帳票管理ソフト作りました!」 ActionScript「ゲーム作りました!」 Lisp「Lisp作りました!」 Haskell「美しい言語だ…(成果物無し」 Haskellやる理由ってエンジニアとしてのステータスなんだよね 昔の言語LISPに触れるとか、古参気取ったり インテリンゲンジャを気取るためにHaskellやってますとかね 馬鹿じゃねーの?wwwwwwwwwwwww 死ねよいいから お前ら目さませよクズ!?!!? 本当に!! おまえらさ!? Haskellやってて 名に作ったの? クズHaskell使い「作ったとかじゃなくて・・・そもそも何故作るのか」 スキルアップ(笑)で終わってると思うよお前ら Matzの布教活動に釣られたクズ当然だなwwwwwwwwwwwwwwwwwwwwwwwwwwww
750 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 12:07:21.59 ] > インテリンゲンジャ これは新しい
751 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 12:09:43.91 ] 難しいがかっこいい マイナーがかっこいい とか美徳感じてるクズばっかりだからな
752 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 12:22:52.87 ] また、pearl忍者が復活したのか。偏狭な視点と幼稚臭い書き込みですぐ分かる。
753 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 12:34:25.86 ] インテリゲイシャとかいいな 高学歴娼婦みたいで
754 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 12:46:48.45 ] テルマエ・ロマエにそんなのが出てくるな
755 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2012/03/01(木) 13:27:09.96 ] 「験者 (げんじゃ)」かな? 僧侶や修験者のこと。 「げんしゃ」だと資産家のことを意味する方言 (古語) 。 www.weblio.jp/content/%E3%81%92%E3%82%93%E3%81%97%E3%82%83 お高くとまっている様子を言うこともあるのでこの場合はこっちの方が妥当かも。
756 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 13:34:42.64 ] >>753 AVで笛吹いたりするのか
757 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 14:11:47.76 ] >>752 >>Lisp「Lisp作りました!」 この一行の手抜きで、忍者ではないと判る。
758 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 14:42:54.03 ] ダークス創ったじゃないか
759 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 16:02:15.78 ] お前が作ったわけじゃないだろ 話の主軸を見誤るな
760 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 16:34:30.58 ] 成果を増やすより無駄を減らすことに興味があるんだろう 特に、数学を知らないことで無駄に遠回りしてしまうことを恐れている
761 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 16:40:52.53 ] 無駄を減らす事は重要だな。 パイオニアがやる事とは違うが。
762 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 17:01:30.78 ] 山本和彦のLISPにいた頃には得られなかった悟りが開けたみたいだなHaskellのおかげで
763 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 17:07:15.13 ] こんにちは Haskellできる人は凄いと聞きました macintoshgarden.org/sites/macintoshgarden.org/files/screenshots/Traitor_heads_0.jpg このゲームをWindowsに移植してください お願いです;;
764 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 20:36:10.70 ] Macでこんなゲームがあったんか
765 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 21:40:37.11 ] >>749 掲示板とか住所管理とかしょぼいのばっかだな、、、
766 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 21:48:26.24 ] yesodのチュートリアルでblogとかtwitterもどき作る例みたいなものぐらいはあっていいかもな そういえばrailsが出た頃は15分でblog作るデモとかあったな 実用性のアピールにはあぁいうインパクト大事
767 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 21:54:11.82 ] だよな なんかさ 高速化〜言語がどうたら とか難しい話言われてもちっともうれしくねえし そういうのつまんなくね ゲームとかブログとか作るとかの法が楽しいし 本当に馬鹿だよな 最適化とか高速化とかつまんね 〜〜を返してみる とか やめて欲しい 実用性のインパクトが大事 ニコニコ動画はフラッシュプレイヤー作ってますとかインパクトなさすぎるのとおなじだね
768 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 21:54:55.57 ] 正直さが足りない 無理してる布教に釣られたクズばっかり
769 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 22:02:06.47 ] O'REILLY の「Developing Web Applications with Haskell and Yesod」って、 O'REILLY のサイトだと 300 ページって書かれてるのに、 他の Amazon とかだと 100 ページつて書かれてるんだよな どっちだよ 100 ページってハンドブック?
770 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 22:11:32.18 ] >>755 インテリゲンチャのタイポだろ。なんだ修験者って。
771 名前:デフォルトの名無しさん mailto:sage [2012/03/01(木) 22:50:53.25 ] それも淡々と作るというより バグやエラーをあえて発生させそれを強い型付けとかランダムテストを使いながら 確実に取り除いていく様子を見せるようなデモがいいだろうな 簡単に作れるとかだと「じゃあrailsでいいよね」とかいうオチになるから
772 名前:デフォルトの名無しさん mailto:sage [2012/03/02(金) 01:29:04.91 ] それよりKent BeckとかtwadaあたりがHaskellに乗り換えたけどいいよって言うだけで十分じゃないか? あとはIIJあたりも社内Haskellで統一して、MOGOKやめてYesodのサービス始めれば援護になる。 なんでそうならないんだろうね。
773 名前:デフォルトの名無しさん mailto:sage [2012/03/02(金) 09:06:18.04 ] 「しゅげんじゃ」も知らんのか。
774 名前:デフォルトの名無しさん mailto:sage [2012/03/02(金) 10:06:46.62 ] インテリ顔射
775 名前:デフォルトの名無しさん mailto:sage [2012/03/02(金) 21:14:41.55 ] NumでないとBitsに成れないって不条理じゃね? 別に四則演算なんてしなくても ビット演算したいケースなんて普通にあるだろ Word32でnewtipeした型をBits宣言したいけど 四則演算は禁止したい こんなときどうすれば良いの?
776 名前:デフォルトの名無しさん mailto:sage [2012/03/02(金) 22:47:19.28 ] ttp://snak.tdiary.net/20091020.html これ↑を読んでたんですけど Functorのインスタンスを説明するところで((->) e)はファンクタだって記述がありました。 GHCIとかで:typeしてもエラーにしかならないんですけど (->)ってのは普通の演算子じゃなくて、型宣言のところに出てくるアレって解釈であってますか? よくわかってないですが、型より一段階メタな種を扱う演算子みたいな扱い?? もし可能であれば、((->) e)のFunctor実装がどんな感じになるか教えてもらえないでしょうか。
777 名前:デフォルトの名無しさん mailto:sage [2012/03/02(金) 23:25:53.07 ] >>775 Bitsクラスをただのビット列表現と解釈しているから不条理に思えるのでは? ライブラリドキュメントにはこうハッキリと書かれている The Bits class defines bitwise operations over integral types. これは、integral types に対してビット演算を提供するクラスなんだよ だから fromIntegral 関数を持つ Num クラスのインスタンスである必要がある integral types ではない型に対してビット演算を提供するクラスは、 今のところ標準ライブラリには入っていない (HackageDB にも、貴方の望むライブラリは今のところなさそうだ) また、Num のクラスメソッドを使用した場合に実行時にエラーを出す方法はあるが、 GHC によるコンパイル時にエラーを出す方法は、これまた今のところない よって、そのようなビット列表現および演算するクラスが必要なら、 残念ながら自作するしかない
778 名前:777 mailto:sage [2012/03/02(金) 23:27:31.24 ] >>777 訂正 誤) だから fromIntegral 関数を持つ Num クラスのインスタンスである必要がある 正) だから fromInteger 関数を持つ Num クラスのインスタンスである必要がある
779 名前:デフォルトの名無しさん mailto:sage [2012/03/02(金) 23:29:54.57 ] サンクス エニウェイ
780 名前:777 mailto:sage [2012/03/03(土) 00:09:57.84 ] >>776 > GHCIとかで:typeしてもエラーにしかならないんですけど では、そのすぐ上に Either e も「Functor のインスタンス」だという説明がありますが、 これも :type を試されましたか? エラーが出ますよね だって、Either も (->) と同じように関数や演算子じゃないから 「〜は*のインスタンス」と言った場合、〜の部分には「型」がきます 型の情報は :type では得られません(:type は値の型情報を得るもの) 型の情報は :info などで得られます ただし、正確には :info には型ではなく型構築子を指定しないといけません (たとえば :info Either e ではなく :info Either) と言うことで、((->) e) は単なる型であり、意味上は何も特別なことはありません 試しに :info (->) をすれば、((->) r) 型が Functor のインスタンスだと分かります 正確に言えば (->) が種 * -> * -> * の型で、((->) e) が種 * -> * の型です ((->) e) 型のFunctor実装は処理系依存でライブラリでは公開されていませんが、 次のように解釈できるような実装になっているはずです instance Functor ((->) e) where fmup f g = f . g
781 名前:780 mailto:sage [2012/03/03(土) 00:15:43.68 ] >>780 くそっ、また訂正だ 誤) fmup f g = f . g 正) fmap f g = f . g
782 名前:デフォルトの名無しさん mailto:sage [2012/03/03(土) 00:31:28.38 ] >>776 instance Functor ((->) e) where fmap = (.)
783 名前:デフォルトの名無しさん mailto:sage [2012/03/03(土) 00:37:41.58 ] サンクス エニウェイ
784 名前:デフォルトの名無しさん mailto:sage [2012/03/03(土) 00:48:51.17 ] >>780 >>782 なるほど、型と値をごっちゃに考えてたせいで要領を得ない質問になってました。 手がかりは頂いたので、もうちょっと考えてみます。 詳しい解説ありがとうございました。
785 名前:780 mailto:sage [2012/03/03(土) 00:56:05.16 ] >>784 手がかりついでに >>776 > (->)ってのは普通の演算子じゃなくて、型宣言のところに出てくるアレって解釈であってますか? > よくわかってないですが、型より一段階メタな種を扱う演算子みたいな扱い?? (->) が演算子(関数)ではなく、種 * -> * -> * の型であることは先ほど言いましたが、 これは同時に「型構築子」とも暗に言いました((->) e は型構築子ではありませんよ) 意味上は特別なことはありません、単なる型構築子です だから例えば f :: Int -> String -> Bool -> Maybe Char という型の関数は、 本当は f :: (->) Int ((->) String ((->) Bool (Maybe Char))) と型シノニムを書くべきで、 でも何も特別なことをしなくても中置演算子のように書けるのは一種の構文糖衣なんです 本来、アルファベットではなく演算子の形をした識別子を型構築子として使って中置したかったら、 識別子をコロンで始めないといけませんから(:* とか :+: とか :-> とか)