関数型プログラミング言語Haskell Part19
1 :
デフォルトの名無しさん :
2012/06/27(水) 10:21:10.18
2 :
デフォルトの名無しさん :2012/06/27(水) 10:25:01.40
はじめてのCとか(´・ω・`) すごいHとか(´・ω・`) なんなの男の子って(´・ω・`)
H本、俺も欲しくなってきた (*´д`)
7 :
デフォルトの名無しさん :2012/06/27(水) 13:50:58.03
■ C for( const char *s="12345"; *s; ++s ) if( '2'<*s&&*s<'5' ) printf( "%d", (*s-'0')*2 ); ■ JavaScript console.log([1,2,3,4,5].filter(function (i){ return i > 2 && i < 5 ; }).map(function(i){ return 2 * i; })); ■ Python print(map(lambda x: x*2, filter(lambda x: x>2 and x<5, [1,2,3,4,5]))) ■ Ruby puts [1,2,3,4,5].select{|i| i > 2 and i < 5}.map{|i| i*2} ■ C# new{}{ 1,2,3,4,5 }.Where(x => 2 < x && x < 5).Select(x => x*2); ■ Common Lisp (print (loop for x in '(1 2 3 4 5) if (< 2 x 5) collect (* x 2))) ■ Haskell print [x*2| x <-[1,2,3,4,5], x > 2, x < 5]
すごいH、アマゾンで注文したけど、なかなか発送こない
どうして
>>7 のPythonは
print [x * 2 for x in range(1, 5) if 2 < x < 5]
ではないのですか?
>>12 単に自分が未だに2を使ってて、癖が抜けないってだけです
>>7 ■ Perl
print map {$_*$_} grep {2<$_ and $_<5} 1..5;
>>7 短く書くことでプログラムが分かりやすくなるから短く書くというのなら理解できるんだけど、
C言語のヤツみたい分かりにくくしてまで短く書く理由って何なの?
算術演算なのに int で定義しない理由を知りたい
int i, x[]={1,2,3,4,5}; int n = sizeof(x)/sizeof(x[0]); // 配列の要素数 for(i=0; i<n; i++) { if( (x[i]>2) && (x[i]<5) ) printf(" %d", x[i]*2); }
>>7 ■ Ruby
puts [1,2,3,4,5].select(&(2..5).method(:cover?)).map(&2.method(:*))
python3の失敗を忘れてはならない
>>20 Cはインデント必要ないから、マクロ以外は全部ワンラインにできると思う
C使いは一時変数やカンマ式やビットシフトを無闇に使ってしまい 式の美しさを追及しない傾向があるからねー 母数が多くダラダラコードが目に付きやすいってのがあるかもしれんけど
いいかげん他言語の話はやめれ。
コードは美しくなくていい 頭を使わず読めて、一目で正しさを実感できるコードが良いコード
import Control.Monad.Par.Class import Control.DeepSeq このどちらにもNFData クラスがあり この両方をインポートするソースファイルをコンパイルしても コンパイラは両者が同一の物を指すのだと突き止め 曖昧性などないのだと断定する筈です というのはこの辺のことがリワハの601ページに > Haskell標準によれば、Haskellの処理系は、 > 複数の名前が同じ「もの」を指していることがわかる能力を持たなければなりません。 との記述があるからです しかし Ambiguous occurrence `NFData' It could refer to either `Cotrol.DeepSeq.NFData', imported from Control.DeepSeq at Cotrol\Monad\Par\AList.hs:28:1-22 or `Class.NFData', imported from Control.Monad.Par.Class at Cotrol\Monad\Par\AList.hs:33:1-30 以上はmonad-par-extras-0.3.2 をビルドする途中で出ました 何が起こったのでしょうか?
正しくは deepseq-1.3.0.0 パッケージの Cotrol.DeepSeq モジュールの NFData を abstract-par-0.3.1 パッケージの Control.Monad.Par.Class モジュールで再エクスポートしているようです 両モジュールを monad-par-extras-0.3.2 の AList.hs が全部インポートしているのですね
>>24 コードが美しいってそういう意味じゃないの?
芸術的な意味で美しいなんていってるやつはいないだろ
僕には理解できないコード=美や技巧に走ったコード というケースが多いのが問題なのです。
まずは芸術的な意味を定義しましょう
抽象画と具象画から議論するか
芸術とは爆発だ
人が作ったとは思えない美しさというのがある それは誰かが意図的に読みやすくしたり逆に読みにくくしたものではない
昔、絵描きやってる知り合いに、プログラマとか理解できない「このコードは美しい」とか言ってんのマジ気持ち悪い、とか言われたな…。
重要なのはコードじゃなくて式の美しさだよバカ
だから何? 数学ができない奴が、数学者の美意識をバカにしたところで、 そいつがバカなだけ。それと同じ。
現代絵画なんてプログラマよりニッチな市場しかないのある。
そういえば2年くらい前、Haskell初めて間もない頃はJavaプログラマから「Haskellってアレだろ?クイックソートを分け解らん式で書いて美しいとか悦に浸ってる言語」とか言われたな…。 まぁ当時は俺もアレの何が素晴らしいのか全く理解できなかったが。
>>30 理解できないコードなら逆に問題ない
「汚いから作り治せ」でOK
理解はできるが、一瞬「うん?」と引っかかるコードが一番腹が立つ
作った方は毎週1個の日曜パズルのつもりかも知れんが、こっちは毎日数万ステップのレビューしてるんだから、そんなのコードが連続してたら殺意がわく
>>37 数学において式は文の一部でしかない
式の美しさと論理の簡潔さを混同する人間は数学者ではない
シュレティンガーの波動方程式は美しいの?
>>42 表現が過不足なく内容を表現していてそれ以上は簡潔にできない、という意味なら美しい
>>40 お前のアホっぽいレスも同様の代物と知れ。
Simple is beautiful.
すごいH超いいわこれ どのくらいすごいかって言うと PinH三日で挫折した俺がこの本なら一週間で読破できそうなレベル
だからいいって言ったじゃん
>>46 3週間家にこもってRWHを読破した後だと内容が軽すぎる
ふつうのH → RWH(挫折) → すごいH → 関数プログラミングの楽しみ → RWH(再挑戦) の順序が一番おすすめ
やさしい Haskell 入門(完全に挫折) -> The Craft of Functional Programming -> モナドのすべて(挫折) -> Real World Haskell -> 関数プログラミングの楽しみ -> Arrowの論文 (イマココ)
Haskellの文法の簡潔さを実感するには、2次元配列を使う数値計算の例題が一番ふさわしい しかしオーバーフローにビビってるのか、数値計算と行列演算はHaskell入門書では亜流
今日からxmonadを使うだけの人になります これだけは代わりがない
53 :
デフォルトの名無しさん :2012/06/30(土) 07:11:59.56
プログラミングHaskell(モナドで挫折)->ふつうのH(モナドで挫折)->RWH(挫折)->RWH(モナドで挫折)->RWH(わかった気になる)->RWH(モナドで挫折)->ある日モナドを悟る->RWH->すごいH
ここまでにプログラミングHは列挙されない。やっぱり悪いのか?
モナドを悟る->物欲を持て余す->おじいちゃんさっき悟ったばかりでしょ なぜなのか
つまらないスレだな 生産性0 何も生み出せない ゴミクズ 早く死ねよ プログラミングやってる者同士馴れ合ってるだけじゃねーか つまんねーから わかったか? 死ね まあお前らががんばってもGoogle以下だよね ゴミクズだな なんか驚くもの作ってみろよ レゴとかドラクエ風マップとか つまんねーやつばっかりだな モテなさそう
> レゴとかドラクエ風マップとか 貧弱な発想にクッソワロタwww
>>56 Rubyスレにお帰りください
Ruby初心者スレにはこなくてもいいです
今ならminecraftクラシックもどき作るだけでも大絶賛されると思うのでやれる人は是非やって欲しい なにせライバルがpongのようなデモゲーム、nikki robot(クソゲー)とかlambda cube(ゲームですらない)ぐらいしかいないので
あれ、Haskellでマリオやグラディウスなかったっけ
そういえばモナディウスとnarioがあったか narioは多分今のghcでは動かない
fragっつうFPSもあるよっ
>>60 名前:デフォルトの名無しさん[sage] 投稿日:2012/06/30(土) 13:06:55.33
あれ、Haskellでマリオやグラディウスなかったっけ
っで?fragみた
別にHaskellでやることじゃねーよなあ?なんなんだ?
結局Haskellで作ってスゲーってのりじゃん?意味がわかんねー
ベスプラティクスってわかる?ゲーム作るのに何でHaskellで作ってるの?w
無理やりHaskellでゲームも作れるみたいにこじつけないでくれよなあwww強引すぎるよなあ?
だからお前はゴミクズなんだよなあw死ねよ シュシュ
>>60 名前:デフォルトの名無しさん[sage] 投稿日:2012/06/30(土) 13:06:55.33
あれ、Haskellでマリオやグラディウスなかったっけ
っで?あったとしてもそんなのほかの言語でてるだろ?
くだらねーwゲームでもゴミクズなHaskellどの言語でもゲームなんて作れるんじゃねーのw
無理やりこじつければなwPerlでゲーム、Rubyでゲームとかw
まじバッカーーーーーーーーーーwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
ゴミクズさんはHaskellやってないでためになることやってくださいよねええwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwきめえんだよなあ?wwwwwwwwwなにがモナドだよなあ?wwwwwwwwwww
しねぇwwwwwwwwwしねっ
>>59 名前:デフォルトの名無しさん[sage] 投稿日:2012/06/30(土) 13:03:53.05
今ならminecraftクラシックもどき作るだけでも大絶賛されると思うのでやれる人は是非やって欲しい
なにせライバルがpongのようなデモゲーム、nikki robot(クソゲー)とかlambda cube(ゲームですらない)ぐらいしかいないので
たしかになあwwwwwwwww
プライドがあるんだろうなwww
真似したらいけないっていう日本のプライドがなあwww
それか開発する技術力がねーだけだろうなあwwww
OpenGLバインドがあるから、サウンド関係を無視すれば基本的に何でも作れる むしろ、DSLとしてHaskellでゲーム作って、実装を他言語にトランスレートするのが通だと思う
>>63 > ベスプラティクス
ベストプラクティスって言いたかったんですね。わかります
ちなみに漏れがレスしたのは
>>59 であって
>>56 ではありません
Haskellで何も書けない部外者が 見当違いの意見を書くスレですか?
なにか嫌なことでもあったんでしょ
お前ら本当にゴミ なあ? Haskellとかしょべーんだよ セキュリティ系のハッカーみたいにかっこよくて凄いわけじゃない クラッカーみたいに悪ぶってもない なんかゲーム作るやつとか凄いソフト作るやつみたいに 驚きも与えてくれない お前らは何も生み出せないゴミ ただの言語学者 ゴミ
そうだねPolyKinds、DataKind、PromotionもAgdaのuniverse polymorphismの超劣化だし Singletonもc++のライブラリであるBoost.Fusionが10年以上前に歩いた道だし 実用を捨てた研究用言語としても遅れてる感が否めないよね
同じロジック(haskellのソース)でいろんな言語(機械語)のツールを自動生成できるから、クラッカー向きだと思うが
>>63 > 別にHaskellでやることじゃねーよなあ?なんなんだ?
まさにそれが楽しいんだよ。
「それまでの普通」ではない事に挑戦するのが面白い。
また frag なんかは、 FRP が研究からゲームという結果へ結びついたという面でもあり、
素晴らしいことなんだよ。
fragとかどう見てもQuake以下だがw 車輪の再発明乙wwなにがしたんですかねww あなたたちの目的はなんですかねえwww ないんですかねえ?w 何がしたいのかさっぱりですよww ええww
uyの頭はひどく悪い ということだな おk把握
誰が言ったか忘れたけど 静的型付けが役に立たないことを確認するという目的もある
誰が言ったか忘れた = 俺の脳内妄想
>>68 セキュリティ系のハッカーがかっこいいってどんな価値観だよ。
厨二病にも程があるだろ
触るなよ 大きくなっちゃうだろ
fragがQuakeII相当をわずか43ファイル(空白/コメント含む)10Kstep以下で実装してしまったという事実は 行数=仕事量の考えが染み着いてるIT土方にとって脅威でしかないからパニックになるのもしかたないな
>>72 DSL(Haskellコードの一部)から他言語へのトランスレート
つまり、自動プログラミングをやりたい
>>74 他人のコードを読むときと1年くらい後にコードを読むときに物凄く役に立つと思います
他人の目を気にしすぎ しかも縁もゆかりもない赤の他人のために神経を使ってる感じ
何言ってんだこいつ
不毛だからHaskellの話しよーぜ!
FRPっていつ勉強すればいいの? リワハ済んだだけの若造にはまだ早い?
FRPって y = f x を getY = do{x<-getX; return (f x)} にすればいいのか?
>>85 質問の内容と意図がいまひとつ分らない。
もう少し詳しく話してくれないか。
どういった状況において FRP をどう利用しようとしていて、
どういった文脈でそのコード片が出てくるのか。
少なくともそれくらいは離してくれないと、何ともレスしようがない。
>>84 RWH読んだなら十分
使うライブラリによってはApplicativeやArrowの知識が要ることがあるけど、
それは必要に応じてやればいい
THとかFRPとかIterateeとかみんな使ってるの?
89 :
デフォルトの名無しさん :2012/07/02(月) 15:38:37.38
そもそも誰もhaskellなんて使ってない 似非ハッカーが弄ってるだけの実用性0のオナニー言語
まずい似非だなあ
IOを使うより使わないほうがいい THを使うより使わないほうがいい 後の禅オブHaskellである
難しいもの=ハッカー とか勘違いしてる馬鹿がいるね
Iteratee系のライブラリは結構使われてるんじゃね 遅延IOはハンドル閉じるのが難しいっつー切実な問題があるからなぁ
>>92 ハッカー=弱い型
と勘違いしてる京都の社長さんもいたねぇ
発火!
97 :
デフォルトの名無しさん :2012/07/02(月) 21:49:34.66
>>89 断言するが、ハッカーしか使えない言語は有害
お前らがHaskellやっててもかっこいいと思わないよ シュシュシュ 知的優位立ちたがるためにHaskellやってんだろ???シュシュ 一般的名プログラミング言語をやってるやつに対して キモヲタ「関数型プログラミング言語って知ってる?(ドヤッ)」 人間君「うむむむ」 っで知的優位に立ちたがる マジゴミだな なあ?出せー世お前シュシュ お前らゴミクズよりなんかセキュリティハッカーのほうがまじすげーよ お前らはゴミ 実用性にかける 面白みもない派手さにかける カス
お前らは微生物以下の存在
コミュニケーションのためにHaskellやってんだろ? 素直に答えろよ
101 :
デフォルトの名無しさん :2012/07/02(月) 22:05:49.92
>>98 プログラミングでカッコよさや面白みを追及するヤツは有害
Haskellで話のネタつくってんじゃねーよゴミクズwww
Haskell における FRP の発展に興味があり、 おそらく原点であろう論文「Functional Reactive Animation」を読みましたが、 よく分らない部分があります。 data Behavior a = (Time -> (a, Behavior a)) (Ivl Time -> (Ivl a, Behavior a)) このビヘイビアの定義でインターバルを導入する意図は分ります。 (論文の最後のサンプルコードでなるほどと思いました) しかし、Behavior a 型の値をどうやって作るのでしょうか。 Time によって値の変わらない定数的なビヘイビアなら簡単に作れますが、 たとえば Time -> Bool という型の関数を Behavior Bool 型にリフトアップするには、 どうすればいいのでしょうか。 具体的には、どうやって Ivl Time -> (Ivl a, Behavior a) 型の関数を作るか、です。 論文にはこの辺りの事は何も書かれていなかったと思うのですが、 もしかして私は何かどんでもない勘違いをしているでしょうか。
105 :
デフォルトの名無しさん :2012/07/02(月) 22:36:55.11
>>104 仮に私と無縁ししましょう
そこら辺の零細ソフト会社のプログラマに、ハッカーしか使えない言語のメンテナンスができると思いますか?
そして、そのハッカーしか使えない言語を使えるようにするための教育コストのことを考えたことがありますか?
さらに、そんな言語が医療機器や金融関連のインフラに混入してたときの恐怖を想像できますか?
106 :
デフォルトの名無しさん :2012/07/02(月) 22:41:47.08
最近ハスケルの案件がきたのだが スパゲッティすぎて負えない
恐怖の正体は システムを作る人間とシステムを所有する人間が一致しないことなんだよな
>>105 C++のことですよね。たいへんよくわかります
adaは教育コストが高すぎる。あんなものがもし軍事関連機器に使われてるなんて考えたら、怖くて夜も眠れないよ。
金融でOCamlやHaskell使われてるけどな どうでもいいけど
>>110 2000年問題のときにATMのソースコードの一部を眺めるチャンスがあったけど、機械語の「ソースファイル」を見付けたときは吹いた
医療を例に出している以上、ここでいう金融は勘定系だろうけどな。
医療を例に出すなら、ここでいうハッカーはブラックジャックみたいなやつなんだろう
Haskellに興味ない => ふつう Haskellを使ってる => 変わり者 Haskellが難しくて習得出来なかったのが悔しくて煽りにくる => 低能
115 :
113 :2012/07/03(火) 08:55:36.05
>>114 変わり者って書くなよ
それが凄いことだと思ってはじめるやついるぞ
たとえば
xxxx=>HENTAI
とか書いちゃうと
世界で変態って言葉通じるだろ?
それもコミュニケーションで使えるし
変態は凄いことって定着してるから
そのxxxxを真似したくなるやつがでる
そういうのやめたほうがいい
それなら"ふつう”って書いとけ
人と違うことをやって ”「それまでの普通」ではない事に挑戦するのが面白い。”
つまりこいつらは ”奇特”、”超人的”にあこがれてるから
変態とか変わり者って書くと 普通から脱却したくて人間の個性の差別化を図りだすから
Haskellを使ってる=>”ふつう”ってかいとけ
わかったか?
でも”ふつう”って書くと、大衆に影響受けるやつは ”ふつう”なんだってなるだろ?
”ふつう”だから皆使ってるだろう 自分も使ってないと乗り遅れてるってなるだろ?
君の書き込みのせいでHaskellユーザーが増えたりする場合あるからやめろ
そういうのは書かなくていい
良かったな。
117 :
デフォルトの名無しさん :2012/07/03(火) 09:09:00.57
おまえら頼むから業務でつかわんでくれ 毎度スパゲッティしんどいんだわ
>>117 使っちゃったー。ショボイスクリプトだけどね
ガンガン使っていけば、
>>117 みたいなのを皆殺しにできそうだな!
副作用と型への万全の対策からスパゲッティが生まれるのが面白い
確かlift0とlift2が定義されてたんじゃない?
122 :
103 :2012/07/03(火) 12:53:21.95
>>121 私へのレスでしょうか。
インターバルを導入する前のただの Behavior a には、
表示的意味論として確かに liftn が示されています。
(ここからただちに Haskell の関数も書けるので、定義されたも同然ですね)
しかし、インターバルを導入した後の Behavior a には、
liftn がどういった意味論になるのか示されていません。
正確に言えば、意味論自体は先ほどとほぼ同じで言わずもがなだと思いますが、
実際に Haskell の関数を定義しようとすると、
インターバルの扱いをどうすればいいのかよく分らないのです。
これ、引数で渡した Ivl Time 型の値をもとに、
つまりどの区間の時間かをもとに戻り値を計算するわけですよね。
どうやって計算するのでしょうか。
data Spaghetti a = Spaghetti (Int -> ([a], Spaghetti a)) newSpaghetti xs = Spaghetti (\i->(take i xs, newSpaghetti (drop i xs)))
>>122 区間解析そのものの詳細は資料参考にしろってことじゃないの?
ここにはどうやらHaskellにコンプレックスを持った荒らししかいない様だ。
126 :
デフォルトの名無しさん :2012/07/04(水) 06:13:30.38
有能なプログラマはHaskellみたいな糞言語使わないからな もっと生産性の高いメジャー言語でバリバリコードを書く ここにいるやつらは漏れなく自分が頭いいと勘違いして人と違う言語を使いたいだけのアホ
パラドックスにコンプレックスを持つオーソドックス
オッスオッスオッスみたいに韻を踏むのはやめろ
>>126 Haskellでまともにコード書けない低能のお前には
他言語と比較してHaskellの生産性が低いかどうかすら
判断できないじゃん
130 :
デフォルトの名無しさん :2012/07/04(水) 12:06:39.18
>>129 低能にはhaskellは使えないっていう姿勢がまず間違いなんだよ
プログラミング言語は可能な限り平易であるべき
理論が先走っちゃってただ出入力するだけでもモナドとか訳のわからないものを使わなきゃいけないhaskellはただのオナニー言語でしかない
だいたいhaskellの売りである堅牢な型システムはチームでの開発でこそ威力を発揮するのに、低能は引っ込んでろじゃ意味ないだろバカ
131 :
デフォルトの名無しさん :2012/07/04(水) 12:08:13.67
>>126 じゃ、おまえは何がネイティブランゲージなの?
PHPとか?
低能に使わせなければいいだけ。 土方には必要ない。 土方は頭数仕事しりゃいい。
133 :
デフォルトの名無しさん :2012/07/04(水) 12:38:54.80
>>131 目的に応じて適切な言語を選ぶだけ
ネイティブランゲージ(笑)
くだらん事でスレ消費するのはこの辺にしておこうよ
>>130 Haskellが分からないなら分かるまで待とう
堅牢なシステムには余裕が必要なのに、可能な限り短時間で分かろうとするのは間違いだ
>>130 Haskell自体はさして難解でもないのに、大した努力もせずにすぐに投げ出したり意味がないと決めつけたりすることが低脳なわけ そんな人間はどこにいっても役に立たないから、引っ込んでてほしいの
なんか煽りさんが増えてるね
すごHディス作戦が不発に終わって(外に準備板まであった)奴らイライラしてるんだな
煽りにマジレスしちゃってる人たちもいい加減気づいて欲しい。
ラムダとポイントフリーは くだらない相手を名指ししないことで生産性を高める
142 :
103 :2012/07/04(水) 22:36:21.22
>>124 論文の参考資料をいくつか辿ってみました。
区間解析そのものがどういうモノかはそれで分りますが、
連続値を引数とする関数 f を、区間を引数として区間を返す関数 g に変換する
効率の良い方法は結局のところ分りませんでした。
非効率で不正確な方法ならすぐに思いつきます。
入力された区間を適当にサンプリングして関数 f を適用し、
戻り値の最小値と最大値を区間として戻すような関数 g を定義すればいいです。
(Bool 型なら最小値 = False、最大値 = True として計算)
しかし、Behavior a 型の値に関数 during を適用する度にこんな計算をしていては、
アニメーション処理が間に合わず、使い物になりません。
Functional Reactive Animation の Predicate Event Detection のコードでは、
Behavior Bool 型の値への関数 during の適用が効率よく行えることを前提としていますが、
どなたか何かアイデアはないでしょうか。
Functional Reactive Animation では入力となる時間が単調増加なので、
その辺りを上手く利用するのではないかと思うのですが、今の私には思いつきません。
あと、
>>122 で区間バージョンの Behavior a には liftn が定義されていないと言いましたが、
実際には同論文内で lift2 の意味論はちゃんと定義されていました。
ただ、肝心の関数 during は定義されていないので、実装的には情報不足です。
143 :
デフォルトの名無しさん :2012/07/05(木) 01:57:38.60
>>138 分からん人にとっては、宣伝の割につまらんという意味で韓流と同じだからな…
signatureっの訳語ってシグネチャ使わずに何が適切ですか?
>>145 Haskell の関数定義や式などで型を明示する時に使うのなら、
「型宣言」と訳すこともできると思います。
>>145 代数モデルなんかの文脈なら「指標」って訳語が一般的っぽいけど。(すげぇミスマッチな気がするけど)
ていうかどの文脈のsignature?
Could not deduce 〜 arising from a use of 〜 from the context 〜 bound by the signature for 〜 at 〜. の文脈です
>>148 その意味の「文脈」じゃねえよwwwwwwwww
そのsignatureは何に関する話題で出てきた用語なの?ってこと。
メールとか認証に使う「署名」だってsignatureじゃん?
名前と型のセットもsignature。
代数モデルなんかの文脈だと、「指標」って訳語が一般的みたいだけど、
普通のプログラマや、言語リファレンスで使われてるのは見たことない。
カタカナでシグネチャが普通じゃん?
もう型指標って訳します><
GHCiではコンパイル通るのにrunghc setup buildで通らないなんてあるんですね
型クラスが、自身を実装する関数を公開しないなら そのモジュールをインポートしたとき インスタンス宣言をする事は不可能なのですか? インポート → 再エキスポートする際に どうも隠す人がいるようです
>>152 型クラスが自身を実装する関数を公開しない
この文の意味がまず分らない。
自身を実装するというのは、その型クラスのインスタンスを定義する事だよね。
その関数を公開しないというのは、インスタンス内で定義されている関数の事?
それを公開するかどうかは型クラス側は全く関与しない事だと思うけど。
簡単なサンプルコードを出してくれないか。
156 :
デフォルトの名無しさん :2012/07/06(金) 11:23:57.16
継続渡しで遊ぼうと思って少し実験してたら、Haskellがいつの間にか手続き型っぽくなってしまった infixr 1 >::> (>::>) = flip ($) -- x >::> f = f x shift = id -- shift f = \x -> f x calc = shift $ \x -> x + 2 >::> \x -> shift $ \y -> y + x >::> \y -> x * y 意訳 calc{ x = shift; x = x+2; y = shift; y = y + x; return x * y; } shiftはperlのshiftみたいに、引数をとってくる Monadやらで do x <- hoge1 x <- hoge2 と書けるのと同じことだけどね
なぜモナドを使わないのか
モナドしか言えないか・・・ 芸が無いな
Haskellは実行時には型情報をなくしていると聞いたんだけれど、実行時にこのデータがこの型クラスを実装してるんだったらほにゃららっていうようなことは必要になる時ないの?
ない。 そもそも、アップキャストが無いんだから > この型クラスを実装してるんだったら はすべて静的に解決できる。
>>160 C#の話で悪いが、あるViewがINavigationAwareインスタンスを実装しているならNavigation=画面の遷移時にメソッドを呼ぶとか言うような場合、Haskellだとどうするの?
Haskellの場合は、複数の値構築子を持つ型を 値構築子でパターンマッチして処理を分岐するコードが、 実行時には何を見て分岐してるかってことになるのかな?
要はC言語と同じことをすればいいんだろ .NETじゃない方のWindowsプログラミングをするとか
C++のテンプレートの特殊化の方が近いんじゃないか?
100歩譲ってsubtype polymorphismは 時々使いたくなるとしても アップキャストは不要だろ
アップキャストとダウンキャストを間違えた...
値構築子 ねかまきずこ?
>>165 すまん、なんでダウンキャストいらないのか教えてくれ
オブジェクト指向でダウンキャストが必要なのは、メソッドを後から元のコードに手を入れないで(再コンパイル無しで)は増やせないからだ。 データの種類(クラス)に応じて振舞いを切り替えるには、 ・クラスの実装側でメソッドをオーバーライドする ・オブジェクトの使用側でダウンキャストする のどちらかになる。 ライブラリ側に親クラスがある場合、親クラスのメソッドは増やせないので、ダウンキャストが必要になる。 Haskellでは、代数的データ型を使って複数のデータの種類を表現するので、ダウンキャストが必要ない。 他の静的型付け関数型言語でも同じ。 ちなみに代数的データ型はScalaのオブジェクト指向の case classに対応する。
・ダウンキャストは型安全じゃない ・ダウンキャストは代替手段が存在する ・ダウンキャストを必要とするレガシーコードがあるわけでもない
多態なオブジェクトっぽいものは多くの場合 第一級の関数(というかHaskellならIO ()でも)で実現できる。 環境をクロージャに入れてしまえば、どんなデータでも関数の中で操作できてしまうからだ。 どうしても型に応じたディスパッチがしたいならば、型クラスと存在型が必要になる。ググれ。 それも流儀のひとつと言えなくもないけども、個人的にはあんまり要らない気がする。
Data.Typeable なんかはダウンキャストっぽい例だから調べてみるよろし でもそんなの使わないで済むほうが良い設計であることに疑いはない expression problemを Haskell の型クラスがどう解決するのかをググって見てみるとよい
>>169-171 ああHaskellではあとからある型クラスの実装をデータ型に追加できるんでしたっけ。
であれば、Viewクラスを管理するものであとからINavigatable的なものの実装を追加できるのでダウンキャストとかしないでできますか。
けどINavigatable的なものがもしも複数あった場合でViewの派生的なものが無数にある場合、インタフェースをあとから追加するならば必要な人だけ実装すればいいけれど、
代数的データ型や型クラスでのディスパッチの場合は全てに場合分けとか実装を書かなければいけなくて新たな機能追加時やViewの種類の追加時にコーディングする量が増えませんかね?
>>168 そもそも「引数がaで戻り値がbの関数」と「aをbに変換するキャスト」を
区別する必要がない
関数は必要だがアップ関数とかダウン関数などというものは不要
イメージとしてはUIのフレームワークを作っていて、Viewはユーザーがいろんな種類のものを自由に増やしてく。 でUIのフレームワーク側はViewに対してINavigatableとかあとから色々機能拡張をする可能性がある。 ユーザー側はあくまでもView派生であればUIフレームワークに組み込めるけれど拡張のインターフェースを実装しているならば、それに即した動作ができる。
>>174 自分が質問したいのは
>>175 のような場合のシチュエーションでいろんなViewがすでに色々作られてる中、別の拡張属性を追加したい場合。
その関数の例で言えば、すべてのViewの実装に新たな拡張属性についての関数を追加しなければとなりませんか?
それってViewが型クラスの場合、Viewに追加するメソッドに デフォルト実装があれば良いだけじゃない?
拡張なんてただの建前ですよ IUnknownとかを拡張するより最初から作り直した方が早いってのがC#の本音
ダウンキャストの欠点っていくつかあると思うんだが、 その一つとして、コードがそこら中分岐だらけになって拡張が難しくなる、ってのがあるじゃん。 代数的データ型もその点全く同様なのに、パラメータ多相と高階関数が組み合わさると、 あれだけの一般性が得られる、てのはちょっと驚きだった。 コンピュータサイエンス舐めたらイカンと思ったね。
>>173 ,175,177
既存の View に追加でuser-definedなデータを持たせるうまい(型安全な)やり方はあるか、
という質問であると理解した。
だとしたらそれはモデリングの問題で DCI (Data Context Interaction) とか当たってみた方がよろしんじゃないかしら
オレも
>>181 とたぶん同意意見で、フレームワークのユーザープログラマが、
setCallBack :: (View -> IO ()) -> IO () みたいな関数にView -> IO () な関数を渡さないといけないし、
またViewの定義もいじれない、っていうような状況を
>>161 は想定しているんだと思う。
そういう場合、フレームワーク側で、View じゃなくってView a みたいな型と、
userData :: View a -> a みたいな関数を用意しておくことにするのが簡単な解決かな。
wxHaskellは知らんけど、
>>182 の説明しているのも、そういう方向性の解決だと思う。
簡単でいいならHashTableが簡単。 lookup :: HashTable View INavigatable -> View -> IO (Maybe INavigatable)
haskell的にはHashTableよりも連想リストかMapじゃないの
>>187 永続データ構造使った方がいいんじゃないかな
個人的には同型対応する方がいいから普通の言語と同じ方がいい。
>>188 すまん、もう少し詳しく。
今回の件でなぜ永続データ構造の方が望ましいのか。
永続データ構造に比べて HashTable だと不利なるケースは何か。
という辺りを。
俺には今回の件で、永続データ構造でも HashTable 使っても、
プログラムの見やすさや効率の点で大して変わらないように思える。
というのも、
>>181 の意図であるなら、
永続データ構造を使ってもその値は結局 IO モナドを被せた方が、
プログラムがスッキリするような気がするのだが。
既存のGUIをFFIで呼ぶならmutableなHashTable使う以外の選択肢はないでしょー wxFruitみたくFRPっぽく宣言的にするならともかく
wxcoreで wxWidgets のC++の継承関係をHaskellで表現するやり方が面白い 一番親の(C++)クラス EvtHandler は Haskell の EvtHandler a という型で表し その子クラス Window は EvtHandler (Window a), さらにその子クラス Frameは EvtHandler (Window (Frame a)) というように パラメタ多相でうまく(?)エンコードしている ただ、既存のwxWidgetクラスをHaskellでどうやって継承するのか謎
既存のC++クラスがObjective-C++/CLIでどんな扱いを受けているか考えれば大体わかる
それはそれ、これはこれ
198 :
176 :2012/07/09(月) 00:43:57.30
ちょっと2ch離れてました。すみません。
自分的には
>>177 で言われてるデフォルト実装があればコード量の増大はなくなるかなーと納得。
>>181 ちょっとHaskellまだ勉強したてなので結論としてそういうふうに落ち着くのかちょっとわからず。
C++やC#でViewクラスを継承した色々なクラスで、View自体の実装とは関係のない別の性質を持たせたい場合、型クラスを使った時にコードが膨らまないかという意味。余計わかりにくいかもですが。
一つの方法として
>>181 のような外部から属性を追加するという方法でも実現は出来ると思います。
>>193 のやり方を具体的に理解してないですが、自分のイメージに近そうな予感。
いずれにしてもC++/C#的なやり方でなくて、他にうまいやり方がありそうな気が。精進してきます(´・ω・`)
UIって、自動コーディングできなのだろうか ロジックとViewを上手に分離したら、Viewの部分は仕様だけ用意すればあとは自動でhsコード出力できないのだろうか 上級者はやってるんだろうな…
文字実体参照の変換を取り扱うライブラリはありますか? &gt; ⇔ >
ParseCじゃ無理なん?
202 :
デフォルトの名無しさん :2012/07/09(月) 22:24:54.08
モナドわけわからん
モナドの「何が」わけわからん の?
モナドの利点とされるもののうち、どこまでがモナドの利点で、どこまでが型クラスの利点なのか ごっちゃになってわけわからん
205 :
デフォルトの名無しさん :2012/07/09(月) 23:09:32.93
機能毎に分割できるというところがモナドの利点 それ以外が型クラス
つ チラ裏
>>204 たしかに、わけわからなくなりそうな疑問だな。
不純な計算を形式化/モデル化できることがモナドという代数的構造の利点で、
実装の異なるデータの集合を代数的構造の面で抽象化・一般化してプログラミングできることが型クラスの利点で、
両者あわさって、実装/意味の異なる不純な計算を抽象化・一般化してプログラミングできることが
モナドという型クラスが存在する利点、といってみるテスト
不純でない計算も形式化できるよ > モナド
型クラスない言語でモナってるのを見れば?
簡約を遅延することと、IOを実行しないでおくことの違いを説明してください
>>210 着眼点がぜんぜん違うから、比較すること自体が困難だな。
例えるなら、ハローワークに行こうと決意するのを先延ばしにするのが簡約の遅延で、決意したけどなかなか行かないのが実行の遅延。
計算のシーケンスを代数で表現したのがモナド しかもモナドが必要十分の構造というわけでもない
簡約は式を評価する時になされることだから、式の値が要求されるまで簡約は遅延される IOも、その結果が要求されるまで遅延される どちらも遅延評価の結果 と考えています
>IOも、その結果が要求されるまで遅延される ダウト
215 :
デフォルトの名無しさん :2012/07/10(火) 08:58:05.68
Maybeは不純
218 :
デフォルトの名無しさん :2012/07/10(火) 22:11:47.43
純粋(pure)がどうたらこうたらというのはHaskellの存在意義として 重要なだけであって、モナドは関係ない。 計算(computation)もHaskellでは特筆する話ではない。なぜなら計算概念が 一体何のことなのか、いまのところ固まってないため。 モナドの利点は入出力、リスト、継続、環境、状態、例外処理などをそれぞれ ”切り分けることができるようになる”というところだ。 書くコード書くコード全部スパゲッティ化するプログラマでも、モナドの枠組みに合わせるように コードが書ければ、あら不思議、ちゃんと機能毎に切り分けられます、という理論。 そもそも疑念に思うべきところは、例えばリストモナドはリストのみで完結していて、他のMaybeモナド には一切影響がないというところだった。これは、よく考えると驚くべきことだ。
219 :
デフォルトの名無しさん :2012/07/10(火) 22:13:05.49
他のMaybeモナドには じゃなくて 他のMaybeモナド等には で。
それ型クラスの利点…
221 :
デフォルトの名無しさん :2012/07/10(火) 22:30:56.35
しばらくモナるわ
言い訳Maybe
223 :
デフォルトの名無しさん :2012/07/10(火) 22:45:04.56
224 :
デフォルトの名無しさん :2012/07/10(火) 23:24:08.47
先入観があると内容が意味不明に写ると思うのであらすじを書いておくと、 この論文の名前はSemanticLego(意味論的レゴ)という名前で 内容は、表示的意味論は理論としては強力だけれど、実際プログラミング言語を 実装しようと思うと、拡張性が悪すぎてちょっと機能を追加しようと思うと いままでのコードをかなり書き換える必要があってすごい実用性が低い ということをSchemeの実例コードを使って示していく。 そののち、モナドという枠組みを使って言語を組むと、拡張性も良くて 意味論的組合せもレゴのように自在に可能であることが示される。
225 :
デフォルトの名無しさん :2012/07/10(火) 23:25:09.93
すまん。推敲が足りなかった。
モナドを使って意味論定義をモジュラーにする話はよく知っているつもりだけど(一応専門なので) >218の > モナドの利点は入出力、リスト、継続、環境、状態、例外処理などをそれぞれ > ”切り分けることができるようになる”というところだ。 > 書くコード書くコード全部スパゲッティ化するプログラマでも、モナドの枠組みに合わせるように > コードが書ければ、あら不思議、ちゃんと機能毎に切り分けられます、という理論。 の意味はさっぱりわからない。
227 :
デフォルトの名無しさん :2012/07/11(水) 00:40:05.13
慌てていたので、別のところに投稿してしまって重複投稿になっていますが、
こちらが正しい投稿先です。
----
>>226 そう突っ込まれるとうまく返せん。しばし待て。
とりあえず意図としては、
1行目は個々の機能毎にモジュール化できるということを言っているつもり
2行目は機能毎にモジュール化できるということが具体的にどういうことか
言おうと思って出した例。そんなことができるかはわからない。
とりあえず、自分はこのように理解していて、説明しようとするとこういう風になる。
226が説明しようとするとどうなる?
そもそもHaskellのモナドって計算理論のモナドなのだろうか? なんか異和感がある
日々Haskellでモナニーしてるみなさんおはようございます mtlの道場的サイトを紹介してください 実例豊富なのがいいです^O^
>>218 だけ見ると構造化プログラミングか何かの話に見えてしまうな
モナドの利点って、今までとは違った観点で切り分けられることだと思うんだけど、うまく説明できない
んお?モナドって文脈を持ったものを普通の記述でスッキリかけてナイスってことじゃないん?
文脈ってのも曖昧だしなあ
自分的にはIOの事忘れてざっくりと"文脈"とくくったほうが理解しやすかった。 ファンクターは普通の関数を文脈持った値に適用する。 アプリカティブは文脈持った値?に文脈持った値を適用する。 モナドは文脈持った処理をくっつける。
なぜモナドの事を忘れて一般の型クラスを総括しないのかね。 忘れていい事と忘れてはならない事を見分ける方法はあるだろうか。
>>234 忘れていい事とは何かをちゃんと定義できれば集合は分割できる。
だから見分ける方法はちゃんと定義する事だ。
236 :
デフォルトの名無しさん :2012/07/11(水) 20:16:31.49
悪いがもう話をしたくない。
Repa でガウスぼかしみたいな畳み込み演算をしたいです。 一次元で言うと、 元データ [x0, x1, x2, x3, x4] カーネル [k0, k1, k2] 演算 [x0*k0 + x1*k1 + x2*k2, x1*k0 + x2*k1 + x3*k2, x2*k0 + x3*k1 + x4*k2] こんな感じの演算です。 今は traverse2 関数を使い、いちいち各配列のインデックスを指定して計算していますが、 他にも方法はあるのでしょうか。
238 :
237 :2012/07/11(水) 21:30:03.63
すいません。 他にもっと効率のいい方法はあるのか、という質問です。
239 :
デフォルトの名無しさん :2012/07/13(金) 22:21:32.07
>>228 一体何でそんな話になる?
分割できて自由に組み合わせできるという以上の話なんてないはずだ。
そもそも計算理論のモナドとはなんのことを指すのか答えろ。
>>234 じゃあお前が総括しろ。
>>239 そもそもと言ってるのだから、改めてより深いテーマを提起しているのでは?
計算理論のモナドとは何かというのは、私もぜひ聞きたいです。
おそらく圏論のモナドの事を言っていて、
これと Haskell で利用されているモナドとの間の相違点が気になる、
という話ではないかと思うのですが、違いますか?
私には、
>>239 がなんで命令形なのかよく分らない。
無駄に波風の原因を作らず、もっと普通に訊けばいいと思うんだけど。
241 :
デフォルトの名無しさん :2012/07/14(土) 06:48:22.16
失礼した。ただ、やはりもうあんたらに形式上でも話をするのはいやだ。
242 :
デフォルトの名無しさん :2012/07/14(土) 06:50:15.15
ということがわかった。
はあ、そうですか
Haskellの型クラスはMLのファンクタと同じで、名前空間を入れると名前空間が出てくる instance Monad Foo where ・・・で名前空間をインプットすると Monad a => の型をもつ全ての名前がアウトプットされる ただし、Haskellで演算子オーバーロードを多用するためには名前空間を明示したくない そこで型推論を改造して名前空間も省略できるようにしたのが型クラスだ
>>218 ”切り分けることができるようになる”というのは名前空間のことを言ってるだけだと思う
>>223 にsemanticsはcomputation ADTとlanguage ADTに分けられるが
computation ADTはmonadとmonad transformer使って切り分けられるからpolymorphicにできると書いてあるよ
型クラスは使い易くするだけ
>>223 のfigure 1.18のように
SemanticLegoではmake-computationsを使ってcomputation ADTの構築を手動で書くが
Haskellは型クラスの仕組みを使って自動的にやらせることができるから便利
ということだろう
accelerate-cuda パッケージを使ってみた人いますか? 私は今のところ生憎 CUDA 環境がないので、ネット上の CUDA に関する情報や サンプルコードなどを見て想像するしかないのですが・・・ [1] 全体の使用感はどんな感じなのでしょうか。 処理の速さは感じられますか。 [2] プログラマは CUDA のメモリなどの仕組みは全く、 あるいはほとんど意識する必要が無いのでしょうか。 [3] 実行ファイルにコンパイルしないと CUDA は働かないのでしょうか。 それとも ghci 上でも、Haskell のデフォルトのリストや配列よりも速いでしょうか。 特に [2] の質問でよい応えが得られれば、 ワークステーションクラスのノートPCをひとつ買ってみようと思います。
名前空間をインプット/アウトプットするという言い方は良くわからないし、あまり見たことも無い MLのファンクタならそういえなくもないけど
そもそもなんで
>>223 が出てきたのか謎
そういうのを今更じっくり読むくらいならもっとMonadTransなコード書いた方がいいんでないの??
関数的で高機能な物理エンジンない? 一通り探したけど,どれもc辺りへのbindingで剛体の位置得るだけなのにIO必須で好きじゃない haskellってこういうのに得意なイメージあったんだがなあ 関数型だと遅くて現実的じゃないのだろうか
そういう用途で使ってる人が少ないだけじゃね?
Haskellは型推論が得意 型には物理的実体がない どちらかと言えば、想定外の型を受け取りたくないという精神的なものを表現するのが得意
そうじゃなくて、函数プログラミングのパラダイムが物理演算に向いてるかどうかって事じゃねーの 型が精神的ってのも激しく謎だが
そもそもOpenGLが大々的に紹介されてときは関数型パラダイムだともてはやされてたのに…
>>251 > haskellってこういうのに得意なイメージあったんだがなあ
どこからそんなイメージが湧いてくるの?
自分で物理演算をちょっと試してみて
「お、結構いけそうかも」って思えたの?
何年か前までJavaScriptは関数型言語だった 関数型言語の集合は、国境や法律のように時々変わる
>>257 OpenGLとかもそうだけど、最近の物理演算エンジンはロジックがステートマシンであることを前面に出してるから
その宣伝を鵜呑みにすれば、Haskellが得意なはず
>>259 話をぶった切って悪いが、丁度よい機会だから訊いてみたい。
Haskell でステートマシンを組む際のよい見本となる解説を教えてほしい。
ネットも書籍も探してみたが、なかなか見当たらない。
ゲームを作ろうと思ってる。
ステージ切り替え、場面切り替えなどでステートマシンを使うと良さそうだが、
どうにも手続き型っぽくなってしまう。
状態を保存したりするのに、どうしても IORef に頼ってしまうんだ。
その手続きっぽいコードの例をお願い
>>261 自分のゲームの今のコードは複雑で長く、何より汚いから晒すのは正直恥ずかしい。
だから晒すのは、手続きっぽくて嫌だなぁと思うエッセンスの部分だけね。
簡単に言えば、[タイトル画面シーン] や [オプション画面シーン] などシーン毎に関数を作ってる。
この関数は、戻り値として「次のシーン」を返すようになっていて、
シーン内でプレイヤーが行った行動などによって次のシーンを決定する。
newtype SceneProc = SP (Time -> GamePad -> (ScreenDesc, SceneProc))
titleScene :: GameData -> SceneProc
titleScene gd = SP $ \t gp ->
let scr = makeScreenDesc -- 画面を構成する指示書を作る
in case 時間やゲームパッドなどの状態 of
オプション画面へ遷移するなら -> (scr, optionScene gd)
とくに何もしていないなら -> (scr, titleScene gd)
optionScene, playScene, gameOverScene・・・ :: GameData -> SceneProc
mainLoop :: SceneProc -> SceneProc
mainLoop (SP scene) = do
(t, gp) <- 現在時間とゲームパッドの状態
let (scr, next) = scene t gp
disp scr -- 画面表示
mainLoop next
(実際は GameData 型の中で IORef を多用してる。その方が記述がスッキリするから)
で問題は、こういう作りだと、titleScene などの各シーン関数で、
やたら if や case of で場合分けする羽目になるということ。
A なら B、C なら D、A でかつ B なら E などの記述が並んで、
ハッキリ言って、関数型特有の宣言的な記述からはほど遠く見える。
ごめん、mainLoop は IO ね。 でも雰囲気は分ってもらえると思う。
264 :
248 :2012/07/15(日) 20:23:42.91
OpenCL パッケージの方でもいいです。 使ってみた方はいるでしょうか。 パフォーマンスはどれほど出るものなのでしょうか。 このパッケージの github にあるサンプルコードを見てみると、 こちらは自分で OpenCL のコードを書かなければならないみたいですが、 DSL タイプの支援ライブラリは無いのでしょうか。
265 :
デフォルトの名無しさん :2012/07/15(日) 21:37:54.99
>>237 いろいろ試しているけど、
あなたが今使っているコードがどういうものか分からないので、
比較ができないぁ
あなたがいま実際に取り組んでいる実際の問題でなくても構わないので、
高速化をしたら比較できるような対象となるお題コードを、
http://ideone.com/ とかにアップしてURIを張り付けてよ
267 :
237 :2012/07/15(日) 23:00:10.71
>>265 http://ideone.com/l7Ina に私のコードを貼り付けました。
そのまま ghci でロードして頂ければサンプルデータで実行できます。
任意長の元データ b とカーネルデータ k (|b| >= |k|)に対して、
>>237 のような演算を行う関数 calc を定義しています。
このコードの (\i -> kp (Z:.i) * bp (Z:.ic+i)) の辺りが何とも間の抜けた感じです。
配列に対してインデックスで要素単体を指定して演算しているのが、
なんていうか Haskell らしくないというか、気持ちが落ち着かないというか・・・
traverse 系関数ではこういうインデックス指定に対して特に最適化して作られていて、
この方法が最も効率がいいというのなら仕方ありませんが、
もっと効率よくて見やすいコードになるのなら嬉しいです。
ちなみに
>>237 のような演算は、同じカーネルを対角線に階段状に並べたN重対角行列と、
元データのベクトルとの積の演算なので、hmatrix でやった方が速いかも知れませんね。
明日 hmatrix を入れて実検してみます。
268 :
デフォルトの名無しさん :2012/07/16(月) 00:55:59.93
>>267 http://ideone.com/e6PGR sumP と *^ を使ってみた。
kernelのsizeを約100、baseのsizeを約10000にして
ベンチマークフレームワーク ceriterion を使って測定してみたら、
15万倍くらいはやくなってる。39.45803 msから256.1315 nsヘ。
・・・マジで?
我ながら信じられないので、 ceriterion の使い方間違っているような気がする。
nsはナノ秒だよね? よね?
>>262 SceneProcはステートマシンとしては普通の定義だと思う。
>やたら if や case of で場合分けする羽目になるということ。
そういう風に定義する計算モデルなのだから致し方ない。
ステートマシンを状態遷移表で書き下したとき、
・titleSceneやoptionScene等の関数が「状態」
・パターンやガードが「入力」
・その右辺式の値が「出力と遷移」 (ScreenDesc, SceneProc)
に対応していて、ミーリー型オートマトンを定義してる、と考えるといいと思う。
Monadiusの定義だとムーア型かな。
シーンを関数として作る、というのは方向性として間違ってないんじゃないかな。
各シーンの内部状態をさらにどうしてるかが問題だけど。
IORefを多用している事と、ステートマシンが分岐だらけであることとはあまり関連性がない気がする。
とりあえずステートマシンの参考になりそうな、有名所を適当に上げると、、
SceneProcの定義はYampaの定義が一番近いと思う。Netwireも確かこんなん。
これらの単純なモデルは、arrowsパッケージのAutomaton i o。(関数型プログラミングの楽しみ10章の単純オートマトン)
変種としては、
SceneProc r
= SP (Time -> GamePad -> (ScreenDesc, SceneProc r))
| Done r
と、Done rを付け加えるとモナドにできて、コルーチンみたいな中断/再開が可能になる。(Done rは受理状態に相当。)
Enumeratorとか、Conduit、Pipes、もこのタイプ。
これらをさらに抽象化したのがmonad-coroutineで、コイツは実はMonadFreeというものに解りやすい名前を付けただけ、
とか色々奥の深い世界があったりする。
MonadFreeの別の応用としてOperationalモナドというのもあったり…。(自動モナド化とか、インタプリタとか興味深かった)
>>268 演算の中に畳み込みが入ってるなら、配列要素数に比例する以上の速度変化が出てもそれほど不思議じゃない
ただ、ghci環境でやってるなら速度計測はまったくアテにならない
exeファイルを作って計測すべき
Haskellを擬人化するなら寡黙な女の子だね 言葉を選んで口数少なく あ、うん……
>>233 アプリケイティヴって読んでた……:(;゙゚'ω゚'):
>>271 ちょっとした間違いを見つけると厳しく指摘する神経質な理系女子…
ナンカイヤダ
Agdaさんと付き合うとHaskellさんぐらいの口うるささは可愛いものだと思えるのでお勧め
>>271 完全に同じイメージだった…
物静かだけど非常に厳しい
非常に厳しいのも我々をバグから守ってくれてるのだからと考えればまた愛おしい
277 :
262 :2012/07/16(月) 18:54:36.66
>>269 この方向で洗練させていくには、結局俺は何を勉強してみるのがいいんだ?
ミーリー型オートマトンがどういったものか調べてみればいいのかな。
それとも、Yampa や Netwire や Automaton i o の中身を調べてみればいいのかな。
変種としては・・・以降の話は、基礎を学んだその後の話だよな、きっと。
278 :
237 :2012/07/16(月) 19:48:07.97
>>268 コンパイルして試してみたところ、calc1 の方の結果が、
ideone_e6PGR.exe: .\Data\Vector\Generic.hs:244 ((!)):
index out of bounds (-2147483648,100000)
ideone_e6PGR.exe: thread blocked indefinitely in an MVar operation
と表示されたのですが、何か問題あるでしょうか。
こちらの環境は、下記の通りです。
Intel Core2 Duo 2.4GHz メモリ 2GB
Windows7
ghc 7.4.1 (repa-3.2.1.1 criterion-0.6.0.1)
>>278 ありがとう。
確かに、Windows 7環境だと、こっちでも同じエラーが出る。
というわけで、criterion周りを多少変えて、かつ新しい関数calc2を加えたコード
http://ideone.com/hdl0v これだと、Windows 7だとcalc1はcalc0よりも遅い。
しかし、calc2はcalc0よりも数%だが速い。
別PCのUbuntuだと、calc2 > calc1 > calc0で速い。
しかも、calc2はcalc0の2倍くらい速い。
15万倍も速くなるなんていうのはおかしいから、前回の結果は測定方法に問題があったのだと思う
なお、ソフトのバージョンは両方とも
GHC 7.4.1
repa 3.1.0.1
criterion 0.6.0.1
>>278 コンパイルするときに実行時のメモリ量を指定できるから、メモリを増加して実行しても同じメッセージが出るなら配列の添字指定でミスってる
メモリ増やしてエラーの配列のboundsの数字が変わるなら、メモリが足りなかったか、MVarでミスってる
>>277 場合分けの嵐になるのはそういう状態マシンである以上仕方ないと思うけど、
IORefを多用しているというのが非常に気になる。
察するに、例えば、ゲームの自機や敵が動いているアクション画面(と呼ぼう)から
装備変更画面だとかコンフェグ画面だとかに遷移したあと、またアクション画面に戻ったとき、
自機や敵の位置など前回のアクション場面のパラメータが保存されてなければならないが、
それを装備変更画面だとかコンフェグ画面だとかの間中保持して受け渡し続けるのがうざい、
ということなんだろうか?
環境遷移は、一つのステージからの分岐が3つ以上あったら、IORefを使わない方が繁雑になると思う IORefを避けるなら、ゲームのどの環境遷移も二分岐以下の合成で表現できるという制約をゲームの仕様にくっつけるべきではなかろうか
283 :
237 :2012/07/17(火) 19:38:27.61
>>279 試したところ、ちゃんとテストできました。
こちらでも同じ傾向が出ました。
calc1 は遅いですが、calc0 と calc2 がほぼ同じ速度です。
何回かテストすると 0 と 2 で順位が入れ替わることもあり、
差はたぶん誤差の範囲で済まされるレベルだと思います。
ただ、気になる点がひとつ。
defaultMain 関数でテストする関数をリストしていますが、
calc0 1 2 のテスト順をどう入れ替えても、最初にテストするものだけ、
かならず異常値によって発生した分散が 50% を越えます(80%いく時も)。
何なんでしょうかね。
あと、せっかくなんで RTS の -hc オプションを付けて
使用メモリの量や傾向も測ってみました。
こちらのテストでは、calc0 に対して calc1 と calc2 は
使用メモリ量が 10 倍高かったでかす。
と言っても、kernel=[1..100]、base=[1..10000] で 1 サイクルを計測して、
calc0 で 14kByte 強程度なので、たかが知れてますが。
そして、当然と言えば当然ですが、メモリ使用の傾向は
calc0 では綺麗な三角形に、calc1 や calc2 では台形になりました。
速度、メモリ双方のテストで少し意外(期待はずれ)な結果になりました。
このような1次元や2次元の畳み込み演算は応用も広く需要ありそうですが、
もっと綺麗に書ける専用関数をライブラリに入れてほしいものです。
今回は大変勉強にになりました。ありがとうございました。
入門者の私が「Lazy IOか、なるほどいいものだな」なんて思いながらRWH読んでたら… "you must not close the Handle until you have finished consuming its results <<via>> hGetContens. Doing so would cause you to miss on some or all of the file's data." とんだ落とし穴じゃないか。。。
もっと先に勉強を進めて!
それはconduitやiterateeの動機のひとつだな Lazy IO()の代わりにこれらを用いたRWHに相当する本が待たれるところ
RWHはある意味キワモノ本だから、他の入門読めばいいと思う。
>>285 どういうコード書いたらこんな事態に遭遇するの?
txt <- withFile "パス" ReadMode hGetContents とか
>>289 大量のファイルからデータを読み込んでデータベースに叩き込む処理を書いたときに、
OSのファイルディスクリプタの数の制限に引っかかって、ファイルを閉じる処理を入れたら、
これではまった。
まぁ、これも、ファイルを閉じる処理をデータを入れる処理の後に書けばすむ話だったわけで、
知っていれば容易に避けられる問題ではある。
コネクションをきちんとcloseする処理を入れないと、RDBのスレッド数の制限にもひっかかってデータが消えるというオチ
これはひどい
Haskell以前の問題である
のちの坂本龍馬である。
TemplateHaskellで型クラスでの型族宣言を書くにはどうすればいいんでしょうか? 型クラスをreifyしてもfamilyDなんかは見当たらないのに、 (その型クラス内での)型族をreifyすると普通に型クラスの型変数を共有してたりして、どう書いたら良いのか分からんのです
298 :
297 :2012/07/21(土) 01:34:57.57
runQならfamilyD取ってこれました お騒がせしてすいません
>>285 ようわからんけど
無限リストの扱いみたいに、必要な分だけもらって後は知りませんよ的コードじゃなくて、
全部使う事を前提とした書き方の時は心配しなくていいってこと?
>>299 遅延 IO に限らない話だが、
リソース(ハンドラ)を解放する前に、必要な分のデータを消費するなら、問題ない。
遅延 IO だと、必要な分のデータを消費する前にリソースが解放されてしまう可能性に、
ソースをぱっと見た限りではなかなか気づかない可能性が低くないことが問題。
確認したいんだけど、hGetContentsの場合だけだよね?
>>301 遅延 IO に関する問題で、
>>300 に示したものについては、
hGetContents 関数や getContents 関数を使用した場合に多く見られる。
遅延 IO に関する問題は逆に、データが完全に消費する(読まれる、かな)まで
リソースが解放されない、という問題もある。
こちらは、readFile 関数などでよく見られる。
これらはあくまで私が自分でよく体験した問題です。
他にもあるかも知れません。
HaskellのIDEってみなさんはやっぱりlelksahなんですか?
HaskellのIDEって何をIntegratedしてるのかよく分らんな 俺はEmacsで十分だけど
補完と型表示さえあればとりあえず充分だからなあ leksahも使ってみたけど結局Vimに落ち着いた
Haskellのお薦めVimプラグインを教えてください
すごいH読んでるけど、練習問題とかないと、ダレちゃうな
自分で練習問題作ればいいと思うが。
アウトプットしないと身に付かないのは何でも一緒
H本の11章のApplicative Functorがよくわかりません。 fmapってなんなのか謎です。助けてくださいお願いします。
今手元にないけど、7章くらいのファンクタの説明ですでに出てきてるはず
>>312 動作よくわかりません。fmapってmapと何が違うの?
だいたい同じ
>>313 入れ物っぽい動きをするデータ型の中身に関数を作用させるのがfmap
で、リストのfmapに特にmapと名前がついてるだけ
ていうかH本にそんな感じで書いてあったはずだが…
入れ物って何だよわからん。
もうちょい前から読み直せ、まじで
>>313 実際の動作は型によってまちまち。
(a -> b) -> f a -> f b という型と若干の規則が共通しているだけ。
次のようなことはができた。 data A a b = A a b instance Functor (A a) where f `fmap` (A a b) = A a (f b) 次のようなことはできる? instance Functor (A * b) where f `fmap` (A a b) = A (f a) b * は一つ目の型引数に対して Functor を定義しているつもり。 もちろんこれはエラーなんだけど、意図は伝わったと思う。 GHC の拡張機能でできるようになる?
type B b a = A a b instance Functor (B b) where ... でできないかな
下の記述は引数3つ必要なのに fmap (*3) (+100) 1 なぞこれは、引数2でいいの? fmap (replicate 3) [1,2,3]
>>321 fmap :: (Functor f) -> (a -> b) -> f a -> f b
だから、基本的にはfmapは引数を二つ取る関数
fmap (replicate 3) [1,2,3::Int]
なら、f=[], a=Int, b=[Int]だから返り値の型はf b=[[Int]]
fmap (*3) (+(100::Int))
だと、f=(->)Int, a=Int, b=Intだから返り値の型はf b=Int->Int
ここからIntを得るにはもう一つ引数を与える必要がある
323 :
322 :2012/07/24(火) 08:10:41.80
>fmap :: (Functor f) -> (a -> b) -> f a -> f b これは fmap :: (Functor f) => (a -> b) -> f a -> f b の間違い
(->)aがMonadのInstanceになってるのはクソ仕様。ゴルフしか用途無い Readerモナドが欲しい時はnewtype R a b = R (a -> b)のようにコンストラクタを明記した形でだけ使わせるべき
個人的には join (+) === (2*) みたいなことができて便利。 (r ->) がインスタンスになってたって困ることないだろう。 気にいらないなら明示的に Reader, runReader 使えばいいじゃん。
>>325 > join (+) === (2*) みたいなことができて便利。
すげー。
そんなコードを読まされる人のことも考えてあげてください
そこまで難しくもないだろ
join (+) === (2*) よくわからない。何がすごいの?
Haskellの難しさが何かに似てると思ったら、OOPの猫クラス犬クラスだ。 例えられれば例えられる程分からん。
形式言語の理解に例えを頼るなよw
頭の悪い俺には 定数の2を使わずに済む 圧倒的難読化効率 わざわざMonad ((->) a)のインスタンスをインポートしなければならない ぐらいしか思いつかない
join (+) === (2*) この例だけがすごいわけじゃなくて、 f x x みたいに同じ引数を二回使うとき、 join f x と書けるということ。 ようは runReader なしで使える Reader モナドなので、 共通の引数を使い回せる。
(\(a, b) -> (f a, f b)) を、ポイントフリーで join (***) f と書くのはたまに見る。俺は使わないけど
runReaderとReaderモナドがなにかわからない。 H本に載ってないような?
Readerモナド = 関数モナド H本にも載ってるはず…
337 :
デフォルトの名無しさん :2012/07/25(水) 14:03:27.24
モナxモナ
338 :
319 :2012/07/25(水) 19:26:48.34
>>320 こうしたらエラーが出た。
data A a b = A a b
type B b a = A a b
instance Functor (B b) where
f `fmap` (A a b) = A (f a) b
エラーメッセージ
Type synonym `B' should have 2 arguments, but has been given 1
In the instance declaration for `Functor (B b)'
こっちは GHC 7.4.1 使ってる。
2引数が必要やのに1個しかないやんけ!といってるだけやん
340 :
319 :2012/07/26(木) 12:38:04.82
さて本日はWindows環境でHDBC-postgresqlをインストールする手順をご説明致します @PostgreSQLをインストールした場所のbinへパスを通します これはSetupがpg_config.exeを実行できるようにする為でございます Acabalファイルのextra-libraries: 欄で、pq → libpq とします BHaskellをインストールした場所のmingw\lib にliblibpq.aを用意しておきます これにはPostgreSQLをインストールした場所のlibからlibpq.dllをコピーして 上記へリネームします インストール後は消して良いです CPostgreSQLをインストールした場所のlibへパスを通します 因みにlibにはlibpq.dllが、(@で通した)binにはlibpq.dllがさらに参照する2つの.dllがあります 以上で後は普通にセットアップして動く筈でございます 因みに私個人の環境は Windows2000 SP4、Haskell Platform2011.4.0.0、HDBC-postgresql-2.3.2.1、PostgreSQL9.0.3でございます
Justっていうのがよくわからん。 何故Just 3は、Just 3なの?
哲学的すぎる…
That which we call Just 3 by any other name would smell as sweet.
シェークスピアみたい
もしかしてJust 3にすると型になるの? そうすると関数になるから色々な関数の引数に利用できるのかな?
どこから突っ込めばいいやら
すべてが型になる
fromJust(Just 3) すると3になるんだよ。すごいね
そもそも型とは何かということをですね…
型って何なの?
類別、かな。
Just 3 すると、Maybe 型の値になるんだよ。Just の型を考えてみて。
Just :: {3} -> Maybe でしょうか?
どこから突っ込めばいいやら
そもそもhaskellがインストールされていないんだろう
見放すべきか、教えてあげるべきか・・・
すごいHのFunctorからモナドまでの説明はとても良いよね(´・ω・`)
361 :
デフォルトの名無しさん :2012/07/27(金) 09:05:16.02
Hなモナ ハアハア
2012のffi何処行ってしもたん・・・
Windows の 64bit 版をメイン使ってる人に質問 Haskell とはどうやってつき合ってる? Windows 用 GHC のアルファ バージョン(64bit の実験もされてる)を使ってる? GHC は 7.6 になるまで待って、今は Linux とデュアルブートしたり、 VMware 仮想環境上の Linux で GHC 64 bit版を使ってる? 思い切ってメモリ8GB、Windows7 64bit版を乗せたノーパソ買ったんだけど、 Windows 用 GHC の 64bit版がまだ正式には無い事に今さら気づいた (´・ω・`)
ドアを叩く手前で悩んでいる人は結局それ以上伸びない VMでもαでも本気で突き合いたいならどこでもできる
365 :
デフォルトの名無しさん :2012/07/27(金) 13:25:16.31
ノーパソ喫茶
>>364 伸びるとか、本気などのメンタル的な話ではなく、
実際に具体的にどの様に対応しているのかという話です。
併せて、32bit版にはない64bit版での運用上の問題点があれば、
それも聞いてみたいです。
>>364 はアルファ版も使ってみたのですよね。
例えば、大量のメモリを使ったりしたとき、
実用上問題にぶつかったとかあるでしょうか。
367 :
364 :2012/07/27(金) 16:46:39.18
知りません
グラスゴーってイギリスだったんだな。サカーで始めて知った。
マンチェスター リバプール デボンシャー ウェールズ 仲間はずれはどれでしょう?
そんなことよりケントはどうした、ケントは。
>>363 32bit版GHCじゃ困る理由があるの?
>>367 どうして知らないのでしょうか。
>>363 で、Windows の 64bit 版をメイン使ってる人に
Haskell とはどうやってつき合ってるのかを聞いて、
>>364 でそれに応じているので、当然使ってると思ったのですが。
しかも、VMでもαでも本気で突き合いたいならどこでもできる事を知っている。
自分で体験されたから知っているのではないのですか。
ひとの受け売り、また聞き、何となく脳内妄想、といった類なのでしょうか。
でしたら残念です。
なにこのくだらないやり取りw…
>>373 すまんすまん
>>364 の的外れな返答についカッとなってしまった。
質問をちょっと変えて、的を絞るわ。
Windows7 64bit 版で GHC 64ビット版を使う方法はいくつかありそうですが、
処理速度をできるだけ落とさないように、という主眼だと、
どの方法がベターでしょうか?
>>371 32bit版のGHCだと、メモリを大量に使えなかったりしません?
ちょっと大きめサイズで移流拡散現象をシミュレートしたくて、
Windows7の32版でやったら使えるメモリが足りず、
満足いくシミュレーションができなかったんです。
64bit版のWindows + 32bit版GHC で8GBメモリとか使えるのなら、
それで問題ないのですけど。
今はマシンが手許になくて試すことができない状態です。
ドアを叩く手前で悩んでいる人は結局それ以上伸びない
>>375 メモリ8G使いたいなら確かに64bit版をなんとかして使うしかないな、納得
>>375 俺以外にも移流拡散解析をHaskellでやろうとか思う奴がいるとは、、、
シミュレーションでメモリが云々でノーパソ。。。
アプリカティブちゃんと仲良くできません。 こ難しいインテリで付き合いにくいで 何とか理解する方法ないでしょうか?
>>380 無理矢理ヤれば、そのうちアプリカティブちゃんのほうから腰振ってくるよ
まずはヤってみろ
vm player にubuntu 64bit入れて、その上のHaskell弄るとか。
>>380 do記法の<-を普通の変数束縛のlet構文だと思ってみると
do { f <- mf ; x <- mx ; return f x }
これが
let f = mf in let x = mx in f x
こうなる。実際Identityモナドのdo記法とlet式は意味的には同等。
しかし変数束縛を使わずにこう書きたいこともある。
mf mx
これに相当するものがApplicativeを使うとこう書ける。
mf <$> mx
つまりApplicativeを使えば変数束縛が減らせゴルフコードが書きやすくなるということ。
384 :
383 :2012/07/28(土) 00:34:50.86
スマン型がちょっと違うわ。。。誰か訂正頼む。。
385 :
訂正 :2012/07/28(土) 00:56:52.15
>>380 do記法の<-を普通の変数束縛のlet構文だと思ってみると
do { x1 <- mx1 ; x2 <- mx2 ; return f x1 x2 }
これが
let x1 = mx1 in let x2 = mx2 in f x1 x2
こうなる。実際Identityモナドのdo記法とlet式は意味的には同等。
しかし変数束縛を使わずにこう書きたいこともある。
f mx1 mx2
これに相当するものがApplicativeを使うとこう書ける。
f <$> mx1 <*> mx2
つまりApplicativeを使えば変数束縛が減らせゴルフコードが書きやすくなるということ。
足し算を定義すると Prelude Control.Applicative> let add = (+) Prelude Control.Applicative> add 3 4 7 Maybe上の足し算ができちゃう>< Prelude Control.Applicative> add <$> Just 3 <*> Just 4 Just 7 リストモナド上で多値の足し算もできちゃう>< Prelude Control.Applicative> add <$> [1,2,3] <*> [10,20,30] [11,21,31,12,22,32,13,23,33] まあ読み書きやすくした部分がapplicativeだけどさ
モナド分かってる前提で説明していいんだろうか
モナドとモノイドは何が違うの?
モノイドは項。モナドは文脈を持った値に対する関数適用。
haddockってもしかしてpaddock捩ってんの?
haddockは鱈
haddock haddock してんじゃねーよ!
operationalモナドとかfreeモナドの話はどこで読めますか?
396 :
デフォルトの名無しさん :2012/07/29(日) 13:51:01.38
このすれ来て大分モナドわかってきた
次は福岡モナドだな
存在し無い概念の翻訳が難しい。 「 と」とか「 くさ」とか。
399 :
デフォルトの名無しさん :2012/07/29(日) 19:26:20.44
javascriptでモナってみる
文脈ってなんなのかよくわからない。 型が文脈持つってなんなの?
monadとはインタプリタを作る方法で、文脈というのはインタプリタの能力だと思えば良い。
変数への破壊的代入を行えるインタプリタも行えないインタプリタもあるように、
変数への破壊的代入を行える文脈も行えない文脈もある。
例えばIOモナドを使うとIOの順序がsequentialになるが、
これはIOモナドがstrictな言語のインタプリタだからだと解釈できる。
(ただし
http://www.haskell.org/haskellwiki/What_a_Monad_is_notの Monads are not about strictnessにあるように、non-strictな言語のインタプリタだって作れる)
「破壊的かもしれない文脈」を略して「文脈」というのか
いや、いわない
data Maybe a = Just a | Nothing これが「成否」のコンテキストなんだけど。 「成否」というコンテキストの中での値が、「否」なら値なし、「成」ならa型の値。 これは抽象データ「型」でしょ? この抽象データ型は、a型の値に「成否」コンテキストを付与してる。 別に難しいことじゃないよね。
コンテクストをコンテクストという用語を用いずに説明求む
406 :
404 :2012/07/29(日) 22:37:14.66
コンテキストで説明したけど?
ワロスwwww
バカ晒し上げ
文脈の意味がわかんねって言ってる奴は、
実は『日本語としての』文脈の意味がわかんねって言いたいんじゃね 。
>>405 とか見る限り
辞書引いてください
410 :
デフォルトの名無しさん :2012/07/30(月) 05:36:18.38
何言ってるのかわからないw
>>400 型が文脈そのもの。持つのではない。
ラップされることで文脈を持つのは値の方。
>>400 文脈を持った型というよりも文脈を持った値として考えるべきじゃね。
そこでいう型は別に大事じゃない。関数適用したら別の方に簡単に変わるし。
大事なのはあくまでも文脈。
文脈を持った値というのは文脈を持つコンテナに包まれてる値としてもいいかも。
その文脈についての実装をbindとかで実装することでその文脈として適した振る舞いをすることができる。
型は型で重要なんだけど。
代数データ型で文脈を定義しているので。
それから
>>404 のMaybeは、定義の形を見れば明らかだが、
要素が一つしかないコンテナとみなせる。
つまりコンテナ型は文脈でもある。
だからリストモナドというものがある。
> 文脈を持った値というのは文脈を持つコンテナに包まれてる値としてもいいかも。
というのは相当おかしい。
>>412 うーんよくわからけど、Maximaの事実と文脈みたいなものなのかな?
ある値や関数にMaybeという事実を適用した結果は、失敗するかも
しれないという事実の集合である文脈を返すことができるってことなのかな?難しい
>>414 なぜ不正確な話をしている412にレスしているのかわからんし、
> ある値や関数にMaybeという事実を適用した結果は、失敗するかも
もうちょっと落ち着いて、解説ドキュメントを正確に理解するようにしたら?
モッジさんの論文では コンテキスト付きの値というよりcomputationという表現を使ってるな m aだとaという型の値を主軸にした何らかの計算(実際にaを通常の値として取り出せるとは限らない)というイメージか コンテキストと聞くとどちらかというとcomonadをイメージしてしまうね コモナドの場合はw aという値からaは「必ず」取り出せる
>>413 別にリストモナドとかも
> 文脈を持った値というのは文脈を持つコンテナに包まれてる値としてもいいかも。
で、おかしくなくない?
コンテナの場合、 コンテナが文脈そのもので、 コンテナが文脈を持つのではない。
>>418 リストもなどでも、結果を順列として出すのか組み合わせとして出すのかなど文脈を変えることはできるけど?
文脈の定義が曖昧だから水掛け論にしかならない印象
>>419 その例だとリスト自体が文脈を表現してるじゃないですか。
型だけじゃなくて>>=とreturnも合わせてモナドなんじゃないの? 型だけでは表現できないような、どうやって使うのか、という意味を>>=に込めていると理解していたのだけれど。 List型は0個以上の値の並びっていう意味しか込められないけど、 0個以上の値を返す計算を繋げるんだよーっていう文脈が>>=で伝わるっていうような。 Listで作れるモナドってconcatMapしか無いのかな?もしあってもHaskellはinstanceにしてくれないけど。
>>421 同じリストというコンテナでも、順列か組み合わせかなど文脈を変えることが出来る。
>>422 の言うようにbindとreturn合わせてのモナドというのが正しいんじゃない?
>>422 Haskellのモナドは数学のモナドではない気がするのは俺だけか…
>>422 リストで作れるモナドは少なくとももう一つある(と思う)
ZipListというReaderみたいなやつ
import Data.List
import Data.Maybe
newtype Alt a = Alt [a]
deriving Show
instance Monad Alt where
return x = Alt $ repeat x
Alt xs >>= f = Alt $ takeWhileJust $ zipWith g [0..] xs
where
g i x = case f x of
Alt ys -> ys `at` i
at :: [a] -> Int -> Maybe a
at xs n = listToMaybe $ drop n xs
takeWhileJust :: [Maybe a] -> [a]
takeWhileJust = foldr f []
where
f (Just x) rest = x : rest
f Nothing _ = []
言語の練習がてらwebサイト生成するシステム作ってみようと思うんですけど PHPやperlと比べた時のhaskellの優位性ってどんなところにあるんでしょうか?
>>427 日本語対応が完璧
どこのレンタルサーバでもインストールされてる
正規表現によるマッチングがファーストクラス
>>427 言語の練習がてらという目的とは必ずしも合致しませんが、
Haskell には Yesod という Web フレームワーク ライブラリがあり、
これが Web サイト構築の手間をかなり省いてくれます。
(Web フレームワークは他にもいくつかありますが)
で、このライブラリが Web フレームワークをプログラマに提供するために
Haskell の様々なテクニックを駆使しています。
テンプレート Haskewll 然り、ストリームデータに対する考え方然り。
このようなテクニックのおかげで、末端のプログラマは、
Web ページの見た目やサイトの表層的な構成に縛られない「直感的」な記述で、
Web サイトを Haskell のコードとして定義できます。
そのことにより、もともと Haskell が持っていた他言語に対する利点が、
そのまま Web サイトの構築に生かせるという点が haskellの優位性になります。
たとえば参照透過性や遅延評価などですね。
橋の下に捨てられた「すごいH」本を高校生が (*´д`) ハァハァ しながら読む光景
>>425 HaskellのWikibookにのってる unit と join を使った説明は数学のモナドそのもの
>>431 モナドというより、カルテシアン閉と言った方が正確な気が…
カルテシアン閉圏に近いのはArrow 欲を言えばGArrow
Haskellは圏論知ってないと身につかないよね?
もういい加減その迷信は騙されてる方に問題がある
>>434 圏論を知らないと意味を解釈できないライブラリがあるのは確かだが、圏論の知識がない人が同じモノをHaskellで作ることはできる
Haskellにおける圏論は、算数の九九で言うと数学基礎論みたいなもんだから、必須知識ではない
>>435 トポスなんてHaskellの本に出てこないけど
ここでは一般常識なんでしょ?
>>437 ここでトポスが一般常識になっていると感じたレスって、たとえばどれ?
トポスってチョコたっぷりのあれ?
論理はトポスと言っても間違いではない しかし、Haskellはトポスではない
トポスは1階述語までならλ抽象を表現できるから、Haskellはトポスではないが、トポスはHaskell
442 :
uy :2012/08/02(木) 13:23:21.74
僕の考えたモナド()
>>7 ■ mathematica
{1,2,3,4,5}~Select~(2<#<5&) 2
■ matlab
x=[1 2 3 4 5]; x(2<x&x<5).*2
短いコードよりも、オーソドックスなコードの比較の方がうれしいのは私だけか…
(for [x (range 1 6) :when (and (> x 2) (< x 5))] (* 2 x))
↑Clojure
Haskellのすべてを圏論的に再現しようとするからCCCとか初等トポスだとかの話になるけど、 FunctorやApplicativeを理解するためにそこまでのガチガチの議論は必要ない。
どうしてこういう定義・言語仕様にすると巧く行くんだろうとか考え出すと嵌るね
既存c++libraryを活用できますか?
活用できるものもあれば、それだけでは活用できないものもある
Mathematica で ~ 使ってるのあんまりみない。 普通は↓こんな感じ Select[Range[1, 5], 2 < # < 5 &]*2
>>7 ■ Scheme
(print (list-ec (: x 1 6) (if (< 2 x)) (if (< x 5)) (* x 2)))
sodium以外のhaskell用のFRPライブラリは完全に更新停止ですな
結局はやらないからな
FRPはオワコン以前に始まってすらいない感が凄い 発祥の古さを考えると信じられない
GUIとの統合がまだまだだから仕方ない。 ウインドウにボタン一つならいいんだろうが。
gtk2hsとcairoで画面描画したいのだけど、Gtk2Hsの公式のほかに お勧めのtutorialサイト知ってる所あったら教えて。英語もおkです。
チュートリアルはないね。 公式ので十分じゃないか。 あとは GTK のドキュメントとチュートリアル見て、 gtk2hs のライブラリ ドキュメントから使い方を推理して、 試行錯誤しながら使っていくしかないと思う。
460 :
458 :2012/08/06(月) 19:41:43.49
やはり、そんなもんなのか。。。。 黄色線の三角形描くやつやってみて、さらにもうちょい無いかなと思ったんだけど。 小さな描画サンプルコードいくつか見つけたので、その辺弄ってみるよ。 レスありがと
>>454 Yampa はまだ更新されてると思うが。
つい最近も3月末に更新されたし。
更新止まったというのは、バグがなくなったという意味なのか、バグだらけでもう見ることすら嫌になったという意味なのか
ユーザが少ないのでバグが発見されない、とか
464 :
デフォルトの名無しさん :2012/08/06(月) 23:24:56.21
ハスケルてmmorpg作れる?
haskellで作れないのは子供くらいなもんです
じゃあ彼女の作りかたを教えてくれ
467 :
デフォルトの名無しさん :2012/08/06(月) 23:51:18.77
サーバー1台に100000人収容するんだが 知り合いにきいたらealangをすすめられた そんでついでにハスケルもいけるかもときいたのでここで質問してみました
468 :
デフォルトの名無しさん :2012/08/06(月) 23:55:08.30
ちなみにphpで100000人さばくにはサーバー200台必要になるそうです
その用途でもerlangの方が実績ある
F#でいい気がしますよ(´・ω・`)
erlangは企業が開発して現場で使ってたヤツだから実績があるのは当然 erlangのメッセージ渡しの並列処理はHaskellも取り入れてほしい MVarは使いにくい
早く対応を謳っておきながら Windows2000で最新版Haskell PlatformのWin32パッケージが 正しくインストールされていない不具合を修正するんだ!
Win2Kなんてとっとと切りすててリソース節約すべき
Haskellの軽量スレッドってやつですか
ハスケルで作った実行バイナリにはランタイムシステム同梱されるじゃん? このビッグブラザーがOSとの間を牛耳ってる限りC/C++に勝てないじゃん?
Parallel Studioとか使ってガチでチューニングするなら確かにそうだな そこまでする必要が無いと言うなら作業量との兼ね合いでrtsによるオーバーヘッドも無視できる場合も多々ある
日本語処理とディスパッチさえちゃんと動けばyesod使うのに…
不具合についてkwsk 俺も試そうと思ってるから先に試した人が遭遇した不具合は気になる
481 :
デフォルトの名無しさん :2012/08/10(金) 16:46:36.38
handleSqlError内でDBに接続して更新中にエラー発生したらfailしますよね disconnectはしなくていいのですか?
ああしなきゃ駄目かな with〜でエラーハンドラと共に接続するんですかね
ああ違う with〜で渡すのはメインプロセスの方か
おk 理解した ありがとう
どういたしました
どうでも良いけど、今更気づいた。 Yesod のロゴマークって、Haskell のそれを ほぼ上下逆さまにしたものなんだ(横線1本増えて、形も微妙に違うけど)
runInputT defaultSettings $ getPassward (Just '*') "PASS: " >>= liftIO . print PASS: Just "" これ仕様なの? 何も入力しなかったらNothing を期待してたんだけど だって空文字のパスワードなんてあっていいの? って話じゃん
Ctrl-D(EOF)じゃなくてリターンキー押したんじゃないの?
空文字のパスワードを入力したなら空文字列は正しい どんなパスワードを許容するかというポリシーは、パスワードを受け取るメカニズムとは分離すべき
491 :
488 :2012/08/13(月) 00:57:37.33
>>489 Ctrl-D はInterrupted になるでしょ
>>490 そうなのか
じゃあ Nothing はいつ出番あるの?
HDBCでSqlErrorのseErrorMsgがぶっ壊れてるんです これはHaskell処理系がDBから返ってくる日本語文字列を正しく取り込めないことに起因してそうです これはどうしようもないのでしょうか? 私が普段Shift-JISコンソールで日本語文字列を扱う時は ソースの日本語文字列をUTF8で書いて それをUTF8を正しく扱うライブラリの力を借りて取り込んで さらにiconvライブラリでShift-JISに変換しています HDBCライブラリの方で正しく取り込んでくれない限り こちらは手の出しようが無いのでしょうか? HDBCはLatin-1しか扱うつもりがないのですか? 救済措置はないのですか?
ああああああ文字エンコードの問題ってマジ糞忌々しいわああああ く・そ・い・ま・い・ま・し・い!!!
ファンファンファーマシーみたいな言い方やめろ
HDBC, UTF-8は何の問題もない。 逆にRDBがUTF-8じゃないとかなり面倒。
サーバーはUTF-8ですが返ってきたSqlErrorのseErrorMsgが 無効文字だから置き換えた事を意味する0xfffdを連発してるんです。。。 connectPostgreSQL: FATAL: ユーザ"postgres"のパスワード認証に失敗しました となるところを connectPostgreSQL: FATAL: \65533\65533\65533[\65533U"postgres"\65533\771p\65533X\65533\65533\65533[\65533h\65533F\65533\1538\590\65533\65533s\65533\65533\65533\1794\65533\65533\65533 となります これはもうぶっ壊れてるでしょう? 直せないでしょう?
関係ないが、JavaでLinuxでMySQLに接続するときにJDBCに文字コード関連のバグがあって開発が3年中断してるのを思い出した
どうやらHDBC-postgresql-2.3.2.1 は 8.x 用でした 僕のPostgreSQL は 9.0.3 でした てへぺろ
{-# LANGUAGE RecordWildCards #-} data A = A Int Int deriving Show main = let f1 = 0 f2 = 0 in print A{..} [1 of 1] Compiling Main ( *.hs, *.o ) Linking *.exe ... *.exe: rec.hs:7:14-18: Missing field in record construction RecordWildCards危なすぎだろ……
-Wallでもフィールド未初期化の警告出ないのか、これは危ない バグ報告しようぜ
っていうか、これでも通るんだけど {-# LANGUAGE RecordWildCards #-} data A = A Int Int deriving Show main = print A{..}
Haskell is UnSafe!!!
もしかしたらワイルドカードは、単に同スコープ内にある、
フィールド名と同名の変数があればそれに展開される機能であって、
同名の変数がなければ「何も展開されない」機能なのかな。
>>500 の言うように、警告くらいは出すべきだと俺も思う。
ただ、未初期化じゃなくて、展開できないフィールドかあれば、だけど。
ただ、これ一つを以て Haskell is UnSafe!!! というのは如何かと思う。
デフォルトではなく、まして GHC の独自拡張なんだし。
GHC is UnSafe!!!
でも、これで unsafe と言うのなら、 その前に遅延パターン(irrefutable pattern)の時点で unsafe になるな・・・ 遅延パターンは Haskell 98 の時点で Haskell の公式だし
Haskell has been UnSafe since 1998!!!
>>503 普通のレコード型に対してならワイルドカードの未初期化警告が出るよ
>>499 みたいになるのはフィールドラベルのないデータ型だけ
{-# LANGUAGE RecordWildCards #-}
data A = A {f1, f2 :: Int} deriving Show
main = print A{..}
[1 of 1] Compiling Main ( test.hs, test.o )
test.hs:3:14:
Warning: Fields of `A' not initialised: f1, f2
In the first argument of `print', namely `A {..}'
In the expression: print (A {..})
In an equation for `main': main = print (A {..})
Linking test ...
フィールドがstrictなら(A = A !Int !Intなら)普通に弾かれるんだな。 つまりRecordWildCardsの束縛を不可反駁で「なく」する拡張があればすべて解決する……?
いや、フィールドラベルのない型に...が使えるのは単なるバグじゃね
Haskell 98 is dangerous!!!
Dangerous Beauty?
Haskell 98 is too dangerous a language to use!!!
The agitation has successfully accomplished!!!
Haskell!! Dangerous!! Haskell!! Dangerous!!1!
fack you
λx.x) <ラムダマンだよ
518 :
デフォルトの名無しさん :2012/08/23(木) 02:03:55.49
スパゲッティすぎてソース終えん
519 :
デフォルトの名無しさん :2012/08/23(木) 03:20:29.68
遅延評価すぎていつ何を評価してるかおえん
パフォーマンスバグを調べてるとかでない限り、評価がいつ起こるか気にする必要はないよ
>>520 データサイズの増加と計算時間の予測が難しくなるのはつらい
使いこなせない道具に固執するのはやめろ。 さもなくば学べ。
>>522 そんなレスするくらいなら、
データサイズの増加と計算時間の予測方法を提示した方が、
議論が良い方向に進むのではないか?
私はその点に関して知識が無く何も提示できないから黙っておくが
遅延評価のせいで実行時間予測がC言語と異なるのは確か 特に途中経過出力するときの時間が違う
計算量は、遅延評価でも、正格評価のときの計算量のオーダー以上は増加しない。 空間量は、遅延評価でも、正格評価のときの計算量のオーダーと空間量のオーダーのより大きいほう以上は増加しない。 たいていのアルゴリズムは(すべてのアルゴリズムは?)、遅延評価でも正格評価でも、計算量のオーダーは空間量のオーダーと同じか、それより大きい。 そういった証明とかは知らないけど、たぶん、こうだと考えている。
>>525 正格での場合の総計算量のうち必要な空間量とか、この時点で想定される計算時間が遅延故に全く異なることになるからな。
まぁ確かにこうすれば、そのへんの増大に悩まされないですむよって方針を教えてもらったほうが役に立つわな。
パラレルと遅延評価って相性悪いんじゃなかろうか 遅延評価って、やったことにして本当に必要になるまで動き出さないで次行くじゃん モナドにしたって順序の保証こそすれ いつ動くかは保証しないじゃん これパラレルという概念に真っ向から唾を吐くものじゃないの?
単純に Debug.print を入れると計算時間が変わるのが困る
>>527 そしてバッドノウハウのように生まれたのがNFDataなのでした
まあ普通に便利だけどねNFDataは
>>528 java の DTrace みたいなのが欲しいねーって
おい Haskell にも DTrace があるじゃんよ
>>527 副作用をなくすからこそ、遅延評価でよくてパラレルにも出来るのだから、IOモナドとか入る箇所はそれ相応の注意を払わないかんのは仕方ないよね
ガベージコレクトを促すにはどうすれば良いでしょうか。 ghc 7.4.2 です。
>>533 Haskell処理系を作るしかないかと
>>533 System.Mem.performGC
536 :
533 :2012/08/24(金) 21:51:49.46
System.Mem にあったんですね。 見逃していました。 なんか、GHC の Wiki 見てると、 アルゴリズムとしては世代別 GC を使っている感じなのですが、 その辺りのコード内での制御はまだできなさそうですね。 とにかく、ガベージコレクトを促すことができるだけでも助かりました。 ありがとうございました。
HaskellのGC技術はJavaに何年遅れていますか?
GCはHaskellの方が5年早くね?
Javaはconcurrent GCとかあって羨ましい
Haskellって組み込みにも適した言語だよね? ハードリアルタイムシステムとかにもぴったりっぽい
>>540 Haskellが組み込みに特に適している一番の理由は「C言語を自動生成しやすいから」
やたらと場合分けしなくて済むようになるライブラリ教えて 僕はもう迷いたくないんだ
どういう場合分けを消したいのか例を書いてくれんと分からん
544 :
デフォルトの名無しさん :2012/08/26(日) 10:16:31.17
haskellでopenglっていける?
問題なくいける。 それでゲーム作ってるし。
どうせopenglRaw触る事になる
hackage.haskell.orgって定期的に落ちるよな メンテナンス?
hackage.haskell.biz
>>545 OpenGL使えるのは知ってるんだけど、
ゲームだと入力(ゲームパッドとか)と音もHaskellでいけるの?
どうせIOモナド使ってCと同じようなコードになる
差別化しなくて済む もう迷わない
>>553 IOモナドは当然使うことになるが、レンダリングパイプラインの深いところは
ちゃんと隠すようにプログラムするから、Cよりもう少し抽象的になる。
たとえば、GPipe なんか使ってみてはどうだ?
なかなかよくできたライブラリだぞ。
ただ、ゲームではなかなか使いにくいから、
俺は GPipe を参考に自分用のライブラリを作ったが。
自作ライブラリみせてー
>>556 どうして?
公開しないつもりで自分だけのために作ったライブラリを見せる理由が思いつかない。
深い意味ないだろ。 なんかこんなん作ったよいうから、どんなん?って言ってるだけで。 なんか自意識過剰なんじゃねーの。わざわざココで俺スゴイ?俺スゴイ?とか書いてるくせに。
>>555 の内容
・Haskell使えばCより抽象度は上がる
・GPipeがいいらしいがゲームでは使いにくいかもしれない
・俺SUGEE
嬢「えーすごーい!見せて見せてー」 客「見せる理由が見つからない」 嬢「...」
プログラムを作ったことは自慢したいが、ソースは渡したくない
カレーを作って友達を呼んだがご飯は炊けてない
最近はyoutubeで動くところをUPして自慢しようとしたが、画面キャプチャで文字が潰れてよく見えない
YouTubeに働くところをUPしよう
俺もいいもの作ったけど、お前らに見せる理由が思いつかなくて困ってる
凄ぇ粘着
羞恥駆動プログラミング
GPipe が今のままではゲームにあまり向かないと私が思う理由は、 細かいところまで挙げれば色々あるが、大きなところでは2つ。 ただ、これらは作るゲームの規模や求めるクォリティに依ると言われれば、 確かにそれは否定できないことを先に断っておく。 ・UIのインフラがGLUT固定であること GLUTがゲームに向いていないと言うよりも、もっとゲームに向いたライブラリがあるのに それを基盤として使えないのが問題。 他の FRP ライブラリとも相性悪すぎる。 また、ウィンドウ生成の仕組みがラップされているから、マルチウィンドウができない。 よって、デバッグ情報などはゲームと同じウィンドウに出すことになる。 ・テクスチャに直接レンダリングできない どうも、レンダリングターゲットとして用意されたバッファは レンダリングされたフレームバッファの内容をテクスチャへ「コピー」はできる。
570 :
569 :2012/08/27(月) 22:31:39.36
すまんすまん、途中で書き込んでしました。
あと、言い忘れたが私は
>>555 だ。
・テクスチャに直接レンダリングできない
どうも、レンダリングターゲットとして用意されたバッファは1枚しかないようだ。
そのバッファの内容をテクスチャへ「コピー」して使うことはできる。
抽象的ライブラリは、自分以外の部品を自分より下の層に位置付けようとするから 二つ以上組み合わせると相性が悪いのだ 抽象と具象のような上下関係がないライブラリがあれば どちらが上か喧嘩することもないと思うのだが
そんな問題が起きないようにtype classがあるのに。
山月記と悟浄出世が好き
悟浄出世悲しすぎる (;ω;) まるでモナドの真意が分からなくてさまよい続ける俺を見ているようだ ああ、そうかモナドって漢字で「喪等」って書くんだろ モテで頭の良い人間が俺のような妖怪を閉じ込めておくために作った知的迷宮なんだろ
はいはい、楔形文字と粘土板、粘土板
も等の真意ってのは、なんでこう言う定義にすると有用なんだろうか?ってことかい
>>577 これよりのちは一切の思念を棄てただただモナドを働かすことによってみずからを救おうと心がけるがよい。
モナドとは人の作用の謂じゃ。モナドは概観によるときは無意味のごとくなれども、その細部に直接働きかけるときはじめて無限の意味を有つのじゃ。
敦ちゃん人気だねえ。
モテナイ奴を称して「喪無奴」と畏ふ
Haskellの入門者や中級者が集う掲示板サイトどこかお勧めない?もちろん英語でもおk。 ここはダメだわw
Stack Overflow
>>582 メーリングリストに登録すればいいと思う
モナドは発動の順序を保証する f . g も発動の順序を保証しますよね? モナドは造られたものじゃない 見つけられたものなんでしょう これはC++がテンプレートの機構をハックしてTMPを見つけた事に似てる気がします
>>585 f . g も評価の順序は f より g が先だと保証されている。
(発動とか訳分からん用語使うな)
にも関わらずわざわざ (>>=) などが改めて定義されているのは、
Haskell でモナドを構成するのに評価順序以外にも必要な要素があるからだ。
> モナドは造られたものじゃない
> 見つけられたものなんでしょう
「A History of Haskell」に何から発想を得たのか少しだけ書かれている(7章2節)。
解説が面倒だから、興味があれば自分で読んでくれ。
587 :
586 :2012/08/30(木) 07:25:22.85
>>585 すまん、「評価」という操作が何か、どこまでを指しているかに依っては、
>>586 の説明は間違っているかもしれんな。
より正確に言えば、 (f . g) x も x に適用する関数は
f より g が先だと保証されている。
>>585 IOモナドは「発動しない」ことを保証しますよ
つまり IO a の値から a の値がただちに発生することはない
発動とかお前らが語ってるものはイデか何かか Monoide
コードをあまりいじらずに評価順序を制御する方法をご存知ないですか? 例えばリストを集合と見立てて冪集合を作る関数powersetを以下の用に定義します powerset :: [a] -> [[a]] powerset [] = [[]] powerset (x:xs) = one ++ other where one = [(x:ys)|ys<-other] other = powerset xs これを用いて与えられた集合からn個取り出した組み合わせの集合のリストを作る関数 combinationsを定義すると、 combinations :: Int -> [a] -> [[a]] combinations n xs = filter ((n==).length) $ powerset xs -- 1) のように定義出来ます。しかしこれではpowersetがn個以上の要素を含むリストを生成してしまうように思えます。 それをさせない為には、 combinations 0 _ = [[]] combinations _ [] = [] combinations n (x:xs) = one ++ other where one = [(x:ys)|ys<-(combinations(n-1)xs)] other = combinations n xs -- 2) のように定義する必要があります。ここで1)のコードの評価順序をうまいこと制御できれば、 ((n==).length)が集合の要素がn個を越えた時点でその集合を弾いてくれるようになり、 2)のように定義しなくても良くなると思うのです。
集合って馬鹿正直に全ての範囲をチェックするから信頼できるのであって うまいこと範囲を狭めようとするのは本末転倒な気がする 話は逸れるがTMTOWTDIってのも馬鹿正直に全ての方法を吟味する事に意味があると思った
>>590 powersetの結果の一部だけ評価したいんだろうけど、
それだと[[a]]を返すのはあんまり適してない
リストを部分的に探索するには、
「先頭から適当なところまで読んで以降を捨てる」
という方法しかない
もっと賢い打ち切りをしたければもっと複雑な木構造を使う必要がある
この例ならTrieみたいな奴でok
http://ideone.com/GYpdW
ファイルからデータを読み込み解析するとします 全てを一気に処理するわけでなく、必要に応じて部分的に遅延評価します 結局処理されず仕舞いの部分がありえます 各々の部分はいつ評価されるか判らないのです こういった事例では 遅延読み込みは危険だと認識しております 一度正格読み込みをし、配列等にプールしておき、そこから遅延評価すべきですか?
書き換えされることに対する懸念?であれば一度コピーしたファイルを使ったら?処理されずじまいのものは処理されないんだからいいんじゃないの?
Windowsってファイルをロック出来ないんだっけ?
できるよん
597 :
593 :2012/08/31(金) 12:37:16.37
いつ読まれるか判らないのです つまりずっとファイル開いとかないといけませんよね これって良くないと思うのですが
>>593 そういった事例で遅延読み込みがなぜ危険なのか、あなたの認識を教えてほしい。
599 :
593 :2012/08/31(金) 13:20:00.92
ごめんなさい 実はどういう時に遅延読み込みが危険かよく理解してないのです(´・ω・`)
>>597 ファイルを開きっぱなしが嫌なら、
ファイルのポインターなどを持っていて遅延で実際にある部分を読むときだけ開いたら?
601 :
593 :2012/08/31(金) 15:18:58.60
はい(´・ω・`)
遅延読み込みって必要になったら読み込むって事だよね 普通の手続き型でも大抵の場合必要になったら読み込んでるわけで むしろ正格読み込みで初めに一気に読み込む方が珍しいんじゃなかろうか
603 :
593 :2012/08/31(金) 20:25:42.49
(´・ω・`)はい
ファイル読み込みって当然容量にも寄るけど ディスクアクセスの時間はバカにならんので 実は最初に全部読んでメモリに置いた方が 一部しか使わなくても速いことだってあるぞ
手続き型でも普通に遅延評価できる 関数型との違いは副作用があるかどうかという点だけ 例えば手続き型で read_line () とかが呼び出されるまではファイルを読まないが 呼び出すと毎回違う値が返ってくる
実は最初に全部読んでメモリに置いた方が 一部しか使わなくても速いことだってあるぞ
素直にConduit使ってればいい 全部読むにしてもpipe一つ引っ付けるだけでいいし
>>606 確かに速いこともあるがもし入力が無限だったら無限に遅くなる
無限のリストを許しているのだから無限の入出力を禁止するわけにもいかない
この言語、コンストラクタ名被り易くない?衝突回避法教えて?
モジュール分ける full importしない
import Baka as B
コンストラクタ公開って内部構造を見せてるわけだから あんまりよくないよね
データコンストラクタを生で公開してるならむしろ衝突は稀じゃね?
>>609 が言ってるのはemptyとかsingletonのたぐいだと思うけど
import qualified Data.Set as Set import Data.Set (Set) って二行目がいるのが面倒 モジュール名としての文脈ならばモジュール名のSet 型としての文脈なら型としてのSetと解釈して欲しい そこまでいかなくともAgdaのモジュールシステムぐらい柔軟にやってほしい
>>614 内部の値を自由にいじらせても型さえ合っていれば問題ないという建前なのでは?
型が合ってたら安全っていうのを論破できる奴は少数派だろ
なんか遅延評価の話が無茶苦茶だなw さすが2chだわ
手続きの呼び出しと式の評価は似ているから難しいよな ポインタと配列が似ているような感じ
>>618 先生、お待ちしておりました
ナイーブな理解の我々にどうか光を照らして下さい
すごいエッチな本買った
gru, enlighten me.
>>617 「安全」と「問題ない」では全然違う
例えば内部状態公開しちゃうと、後から変えるのが難しくなる
>>623 破壊的な変更が難しくなるのは良いことじゃないか
例えば型クラスを使うならインスタンスを後で変えるのではなく
新たに別のインスタンスを定義するべきだ
データ構成子を公開しないことの目的は安全性のためではなくモジュラリティの向上 内部表現を閉じ込めるため 内部表現を変更したとしても、その型を利用するコードは変更せずにすむ 内部表現に依存したコードは、内部表現を変更したら、同時に変更する必要がある
内部をいじらせても問題ないって……。プログラム書いたことあるの?ってレベルだぞ
理論的なものはしらんが名前付き引数コンストラクタは、それが無い言語に比べたらゲロ吐くぐらい便利というのは経験した
Data.Dynamic便利だねぇ・・・ ・・・Typeableがderive以外許されなくなるのはいつですか?
>>626 プログラムは書かないけど型だけ考えるってレベルが役に立つ可能性はもうないのかね
そんなに型が好きなら依存型でも触ってればいい
型というよりソフトウェア工学で経験的に知られている事じゃないの オブジェクト指向プログラミングでいう開放・閉鎖原則 「モジュールは修正に対して閉じていなければならない」 関数型プログラミングで何て言うのかは知らんけど、 たぶん普遍性があるはず
モジュールの追加・削除・修正の3種類が必要だと言うかも知れないし 追加と削除だけでいいと言うかも知れないし 追加だけでいいと言うかも知れない この状況で普遍性があるってのは全く意味がわからない
Haskllerらしい非常に良い議論ですね
公理的意味論を使って無理やり一般化すると 修正に対して閉じた⊆より弱い事前条件 拡張に対して開く⊆より強い事後条件
(->) a b は a -> b
a `->` b
<* `-` *>
/ /(<i>)\ \
parsec parseTest (many (oneOf "abcdef,") `sepBy` char ',') "abc,def" ["abc,def"] 区切り文字は使っちゃ駄目なのね 第一項のパーサから一々区切り文字を除外しなきゃいけないのは冗長な気がする
その文法が曖昧だから最長一致してるだけ sepByで区切られる個々のフィールドに区切り文字が出現すること自体は普通にある > parseTest ((char '(' *> many (oneOf "abcdefgh,") <* char ')') `sepBy` char ',') "(abc,def),(gh)" ["abc,def","gh"]
>>641 (*>)と(<*)しゅごい!
between を窓から投げ捨てた!
リファレンス読んでてこんなの何に使うんだよって思ってたのが 実例見てアハ体験するの気持ちいい ンギモッヂィイイイイッッ!!!!
気 持 ち 悪 い
ん?ByteStringじゃ日本語文字扱えないの?
日本語文字じゃなくてエンコード名で言ってくれ。 あと、扱うというのがどういう事を指してるのか曖昧。 そして、恐らく「Haskell ByteString 日本語」でググって考えれば、 求めている答えに相当近づくはずだ。
cp932扱うならtext-icu使うしかないんだよね・・・
文字コードの違いを型で表現するのは技術的に難しいのかねぇ
foldMap :: (Monoid m, Foldable t) => (a -> m) -> ta ->m 第2引数が第1引数の入力になるという理解で正しい? 意味的にはf(ta) -> mなの?
そういう疑問が出てきた時は まず初めにライブラリ ドキュメントにあるソースを読むこと。 もしローカル環境にインストールしたドキュメントにソースへのリンクがなくても、 Hackage のサイトにはたいていのライブラリでソースも載ってるから。 Data.Foldable.hs にある Foldable クラスの定義を見てみると、 次のようにデフォルトの実装が書かれている。 class Foldable t where foldMap :: Monoid m => (a -> m) -> t a -> m foldMap f = foldr (mappend . f) mempty > 意味的にはf(ta) -> mなの? すまん、意味的にはの意味がよく分からん。 意味的も何も、この定義が全てを語ってると思うが・・・
UTF-8 エンコーディングのソースファイルに文字列リテラル "あいうえお" を記入したら ghcはこれを読んでHaskell 内部文字列データに変換するのですか?
はい
はい、じゃないが
いいえ
f :: (a -> b) -> (r -> a) -> (r -> b) この型の評価順序がわかりません
どの型の評価順序ならわかるんだ?
>>656 そもそも、型に評価順序なんてありません。
評価順は関数の定義によります。
(だから
>>657 は完全に嫌みでしょうね)
その型の関数を使って例えば print (f a b) を評価した場合に、
関数の定義によっては a b の順に評価されるかも知れないし、
b a の順に評価されるかも知れないし、a は評価されないかも知れない。
様々なことが考えられます。
メタプログラミングの段になったら型の評価順序も問題になりだすんちゃうん?
英語の質問です If p fails and consumes some input, so does lookAhead. この so does は fails のみに掛かってるのですか? それとも fails と consumes の両方に掛かってるのですか?
consumeだけかもしれんよ プログラムの動作で判断して
もっと前の方から読めば分かるんじゃないかと思うけど 結局コードを読むか自分で書くかしないと分からない英文ってのもあるから
そうですか(´・ω・`)
andなら普通は両方を含むんじゃないかな
なんかparsecのドキュメントで見たような文章だ
Scheme書いたら次はそのSchemeでPrologを書く
そんなのあったのか、ちょうどここ数日HaskellでパーサーとSchemeを書いていたところだ… IORefを使ったら処理が悉くIOアクションになってしまってなんか悲しい せっかくだから、一般化set!とか、call/ccとか、その他諸々をきっちり実装したいな
むしろ、set!系 を完全排除して、全部遅延評価にしたschemeにしてはどうだろうか
>>669 「モナドとは簡単な概念に難しい名前がついているだけです。」
www
⊥ってなんですか?むせちゃうんですか?
よく分からないんだけど、HaskellでSchemeコンパイラ作るのと、HaskellでHaskellコンパイラ作るのと、どっちが難しいの?
>>675 schemeって文法セットがすごく小さいんじゃなかったっけ。wikiとかに載ってるんじゃないかな
たぶんSchemeのほうが楽だけど、 フルセットのSchemeは楽と呼べるほど簡単でもないと思う
間違いなくSchemeのがラク
そりゃ文法だけならS式は楽すぎるだろう
名前がぶつかったら今書いてるモジュールの方のだって指示したいとき 自分のモジュール名で修飾すればいいですが冗長な気がします This.みたいな修飾ができないものでしょうか
略称の指定では不満なのかい?一文字でもいけるからthisより短い
あ、そうか
自分のモジュールの略称ってどう宣言するんすか?
モジュール名は省略しない方が保守しやすいと思う
(´・ω・`)はあ
>>683 インポートするときに自分で省略形を决める
なんだかんだ言って省略しない方が良かったりするのは同意
自分のモジュールで自分をインポートできないでしょ?
インポ
>>687 自分のモジュールインポートするときに名前指定できなかったっけ?
SOURCE と boot で
Module Test where import {-# SOURCE #-} Test As T
あざっす^^
>>669 おおこれは面白そうだ
でもS式パーサ位ジェネレータ使わずに書きたい
>>669 内容はいいんだけど、次のページに進むリンク設けて欲しい。作り忘れかな
やっぱSOURCEプラグマは.hs-bootの用意とか面倒臭いから辞めて冗長に修飾するわ
別ファイルの内容をインクルードするにはどうしたら良いですか?
>>696 え、おれ695じゃないけど、これマジ?
.hs ファイルが長くなってきてどうしようか悩んでたんだけど、、
GHC 7.6.1 やっと来たぜ
>>697 ファイルをインクルードできないのなら、モジュールをインポートすればよいのではなくって?
あと、Haskellの仕様ではないが、ghcからCプリプロセッサを呼べば、ファイルのインクルードもできると思う
プログラムを生成するプログラムを書けば全て解決だぜ
夜中に勝手にプログラムを作ってくれる小人さんがほしいんですが
Haskellで夜中に勝手にプログラムを作ってくれる小人さんがほしい状況って、 ちょっと想像できない。 Haskellでプログラムするの辛いの?
そ、そんなことないよ^^;
でもsybって小人さん召喚の呪文じゃないんですか?
7.6.1でcatchがpreludeから消えたから修正しといて
(a -> b)は、普通の関数 f (a -> b)は、文脈中の関数 ここでの文脈の厳密な定義ってなんなの?
(Applicative)FunctorとかKleisli Triplesとか
数字や文字列、関数が持つ意味。
ghc 7.4.1を使って標準入力の行数をカウントしてくれるプログラムを作りました。こんなのです。 main = getContents >>= (return . length . lines) >>= (putStrLn . show) 自分は、これは各行が短い場合はlengthがすぐlinesのリストの要素を捨ててくれるので何とかなるが、 数GBとかの長大な行の入力が合った場合、その分、つまり一行分のメモリを食ってしまうのではないかと思いました。 というのも、linesとlengthが別個にコンパイルされてオブジェクトコードになっているなら、 lengthがリストの要素を捨てられるのはlinesが一つの要素を確定してからになるのではないかと思ったからです。 しかし、そんなことはないようです。ghcはどんな仕組みでメモリ消費量を抑えているのでしょうか。
>>710 > linesとlengthが別個にコンパイルされてオブジェクトコードになっているなら
ここで言うオブジェクトコードというのが、
gcc がリンクするためのオブジェクトコードという意味なら、それはないと思う。
ライブラリが個々にオブジェクトコードになってたら、インラインできん。
で、本題だが
lines 関数のソースを見ると、__GLASGOW_HASKELL__ の場合、
String型のリストを作るのに遅延パターンを使っている。
これがメモリ消費量が抑えられている肝になるのではないかと思う。
試しに、遅延パターンを使わない方の lines 関数を自作してやってみてくれないか。
これでメモリ消費が明らかに増えれば、遅延パターンの恩恵だと言えそうだ。
ハズレかも知れんがな。
712 :
711 :2012/09/11(火) 19:58:31.22
すまん、全く関係なかった・・・
713 :
711 :2012/09/11(火) 20:29:00.92
すまんすまん、理由が分かった、と思う。 length 関数は引数が [] にマッチするか (_:xs) にマッチするかだけを見ている。 その引数である lines 関数は、その内部で 文字列を \n の前と後で分けるために break 関数を使っている。 その break 関数の型は、次の定義になっている。 break :: (a -> Bool) -> [a] -> ([a],[a]) break _ xs@[] = (xs, xs) break p xs@(x:xs') | p x = ([],xs) | otherwise = let (ys,zs) = break p xs' in (x:ys,zs) ここで、break 関数の戻り値てであるタプルの第1要素の「内容」が必要であれば、 in (x:ys,zs) の部分の x:ys によって、メモリがどんどん使われる。 しかし、今回は内容は一切使われていない。 と言うのも、lines 関数の中では break 関数の戻り値であるタプル (x:y) を x:y というリストに変換して返している。 このリストは length 関数の引数に渡されるが、 リストという形になっているかどうかしか見ていないため、 break 関数の x:ys が使われていない。 よって、文字列の全てをスキャンすることはするが、 スキャンした結果の文字列はメモリに保存されてはいないため、 結果してメモリ消費量が抑えられたと思われる。 文字で説明するのは難しいな。 length、lines、break それぞれの関数をよく見れば、分かると思う。
714 :
711 :2012/09/11(火) 20:30:15.49
>>713 訂正
> その break 関数の型は、次の定義になっている。
その break 関数は次の定義になっている。
take 10.unlines.lines$['a','a'..] こうかな?
716 :
711 :2012/09/11(火) 20:35:16.89
>>713 あわわ ごめん
大きな間違いをもういとつ訂正。
> lines 関数の中では break 関数の戻り値であるタプル (x:y) を
> x:y というリストに変換して返している。
lines 関数の中では break 関数の戻り値であるタプル (x:y) を
x:(y の次の文字から再び lines) というリストに変換して返している。
あと、lines 関数のソースに __GLASGOW_HASKELL__ ではない定義もあるけど、
そちらでも同じ事。
・・・スレを汚してしまった
逝ってくる
>>710 似たような話が ふつうのH に載ってた気がする
>>718 目が悪いのか、それとも頭が悪いのか。両方か。
Lispスレの基地外さんかw
日本人って
>>719 みたいな奴が多いな。相手を叩いて自分が浮上した優越感を得る小ささ。
そりゃ独創性なんか生まれるわけないわな。ちっさ。
すごいブーメランだな、投げた瞬間自分に当たってる
言うと思ったよ。おまい本当にしょぼい奴だな。言っててさびしくないの?
さびしいかどうかに関わらず、バカを見付けたら誰よりも先に「バカ発見」と言わなければならない
基地外はさっさと寝ろw
>>719 のように言われてもう一度ページをしっかり見直す奴と、
>>722 のように思って何もしない奴とでは、今後の成長に差が出そう
「言うと思った」って反論になってないよね
というか719と723って別人なんだけどね。 何と戦ってるのか知らんが。
> 日本人って
>>719 みたいな奴が多いな
本当に多いのかな?
どうやって多いことを示したのだろうか?
優越感を得るための脳内統計だろう。ちっさ。
問題は、プログラムの開発よりも人間の成長とかに興味を持っている奴が なぜプログラム板にいるのかってことだ
人間の成長に興味を持っていることとプログラムの開発に興味を持っていることって関係ないと思うんですが どうして一方を立てれば他方が立たないと思ったのでしょうか?
単一責任の原則のようなものか
2ちゃんは人間観察用の箱庭だからな
736 :
710 :2012/09/12(水) 10:13:45.76
>>711-716 ありがとうございます。ちょっと自分ではまだ解明を進められていません。すいません。
確かに遅延評価を行っているなら最終的に各々の値が必要なのか分かっている状態になってから計算を始めるので、
ある値を計算する段階で必要ではない値は計算しない事で
(x:ys)のような不必要な値を残さない事が可能である事は理解できます。
ただ、それを実際どのように実現しているのか不思議に思いました。
というのも、haskellはコンパイラ言語であるので最終的に機械語の状態で解釈され計算を行うはずです。
ここでもしlengthやlinesが完全に機械語に変換されているならばlengthがlinesに実はその値は要らないんだ、
という事を知らせる事は不可能ではないかと思ったのからです。
今はいくつかの可能性を考えています。
一つはガーベージコレクタなどのメモリ管理モジュールに全てを任せてしまう方法です。
この場合(x:ys)は一応計算されメモリにストアされるものの、lengthが参照していないので、
GCが動作した時に全て破棄されてしまうという可能性です。
もう一つは一つのhaskell関数を幾つもの小さい関数としてオブジェクトファイル(.oファイル)に格納する方法です。
これにより、ある関数内部の必要な計算と不必要な計算を、小関数単位で呼び出す事で呼出側が制御する事が可能になり、
最終的にリンカのみで不必要な計算を排除出来る可能性があります。
まだよく分かって無いので、もうすこし調べてみようと思います。ありがとうございます。
引力というのはお互い背を向けあってキャッチブーメランをすることらしいな
>>736 > 確かに遅延評価を行っているなら最終的に各々の値が必要なのか分かっている状態になってから計算を始めるので、
違うよ。
遅延評価だけど、最終的に各々の値が必要なのかは、その時になってみないと分からないよ。
値が評価されたら、評価された値はメモリに残る。
しばらくメモリに残って、ガベージコレクタが動いたときにもう必要ないなら、
その時点でメモリから消される。
今回の (x:ys) は「評価されなかった」からメモリに残らなかった。
と考えてほぼ間違いない。
Haskell コードは GHC によってどのような C ソースにコンパイルされるかと言うと、
lengthやlinesなどがそのまま完全に機械語に変換されている訳ではない。
いわば中間コードのような形でプログラムがデータ化されている。
まず、その中間コードを「弱頭部正規形」という形に簡約する。
そうすると中間コードの頭の部分だけ明確になって評価可能状態になるから評価する。
で、その頭の部分を評価してるときに、中間コードの残りの部分が必要になる。
必要になったら、また残りの部分を「弱頭部正規形」に簡約し、頭を評価する。
当然、if や case of などので分岐するから、中間コードと言っても、
一列に数珠繋ぎのようになっているわけではない。
またグラフで管理してて、一度簡約した関数は再び簡約処理することは無いし、
本当はもう少し効率よくやってるが、イメージとしてはこんな感じ。
必要なら弱頭部正規形 --> 評価 --> 必要なら弱頭部正規形 --> 評価 --> ・・・
これを繰り返てプログラムを実行することで、遅延評価を実現している。
まるでインタプリタのようですね パフォーマンス的にどうなんでしょう
>>739 まるまるインタープリタとも違うんだ。
中間コードのようなものとイメージして簡約処理を説明できるけど、
BASICとかC#のような中間コードではない。
あとグラフ簡約がパフォーマンスの要の一つになってる。
742 :
710 :2012/09/12(水) 18:26:23.26
>>738 ありがとうございます。
(x:ys)はサンクが作られたが、
lengthが中身を見なかった、つまり評価されなかったので
メモリ消費量が増えなかったと言うことですね
遅延評価の実現方法は興味深いです
>>741 の資料を読んでみます
ありがとうございました
この際だから告白するけど、英語読めません
ネットに繋がる環境がある以上、「読めません」は理由にならない 「訳す根性がありません」なら使ってもいいッ!
>>744 ネットで訳すだけでよんだ気持ちになってるのか…
そりゃ、釈迦の言葉がただの呪文になっちゃうのもうなずける
>>743 そんなこと言われても、申し訳ないが私の力ではもうどうすることもできん。
現時点で、実装方法に関してまとまった資料としては
>>741 が一番具体的でわかりやすいと思う。
他の資料は断片的なことしか書かれてなく、それもかなり抽象的だ。
まして、実装に関わる(まともに使える)日本語の資料なんてのは、
私が探した限りでは無かったよ。
あとは、これ以上探るのは諦めるか、日本語資料が出るのを待つか、
納得できなければ資料をなんとか読める程度まで英語力を上げるしかない。
ただ、
>>710 の疑問を解消するのに実装方法を知る必要は無いよ。
遅延評価がまともに機能する実装なら、どんなものでも同じ結果だ。
というか、ふつうのH の解説じゃダメなのか…
>>747 それで
>>710 の疑問が解消されそうなら、何ページのどこどこにあるとか言って、
もう少し詳しく勧めてやってくれ。
そうすれば立ち読みしたり図書館で読んだりできると思う。
面倒でになければ、その部分だけ要約して解説してあげると喜ぶだろう。
私は生憎とその本を持っていないので薦めることも解説もできん。
>>740 .NETではHaskellの実装が非効率過ぎて無理だったという話を聞いたことがあるんだけれど、何かご存じないですか?
>>750 しらん
が、予想してみると・・・
Haskell コードをバカ正直に中間コードに変換し、
それを .NET 上で動く「Haskell ランタイム」上で解釈するような事をしてたら、
そりゃ実際に動かしてみるまでもなく非効率すぎるだろうと誰もが分かってる。
(ランタイム on ランタイムなんて馬鹿げてる)
従って、そうではなく、GHC が Haskell コードを、
簡約すべき関数情報と簡約する手続きを直接実行する形の C 言語に変換してるように、
Haskell コードを同じような形の C# や MSIL のコードに変換したんじゃないかな。
でも、
http://twtrland.com/profile/kazu_yamamoto の
「飲み屋で二人の Simon に・・・」の件にあるように、
CLR はグラフ簡約マシンを作るには機能が足りないそうだ(古い情報だけどね)。
グラフ簡約を実現する部分はクラスを駆使しなければならなかったんだと思う。
グラフ簡約で使うグラフはサンクもポイントするし、そのサンクは GC にも関わる。
よって、Haskell らしさを表現する大部分をクラスを使って実現することになる。
これはもう、ほとんどランタイム on ランタイム状態と言っていいと思う。
グラフ簡約マシンを作るに足らない機能とやらが具体的になんなのか知らんが、
たぶん効率的なポインタ操作関連ではないかと、私は予想する。
category-extrasをghciから利用するには、 :m+でいいの?
パッケージ名じゃなく、中のモジュール名で :m+ しないと。 :m+ Control.Applicative.Parameterized とか。
Conduit と Enumerator ってどっちが優れてるの?
Iteratorだった。。。
756 :
デフォルトの名無しさん :2012/09/14(金) 11:54:43.13
クソッ hackage落ちすぎだろ
僕は土管派
Pointedってなくなってる?
759 :
デフォルトの名無しさん :2012/09/14(金) 22:41:05.89
Lavaってどうなん?
happyのglrってどうなったん?
関数型言語の人は、豚肉を食わない何かの信徒みたいに副作用を忌避してますよね 何がそんなに怖いんですか。手続き型言語の人は、日本人みたいに平気な顔してるのに
やっぱり手続き型言語、いわゆるドカタ言語を使ってる人って野蛮なんでしょうかね
日本人はレストランで出るパセリを忌避しますよね
>>761 マックス・ウェーバーの「プロテスタンティズムの倫理と資本主義の精神」でも読んで、
禁欲的なコミュニティが新しいものを作り出す仕組みを勉強してください。
副作用を忌避する関数型のプログラミング倫理が 実はOOPの普及に大きく貢献したのだというITにおける逆説を究明した画期的な論考 (解説 まつもとゆきひろ)
副作用はどんな害悪をもたらすんですか。やはり教義を破ったら地獄に落ちるんでしょうか
数学でも強い公理を排除して行った証明では 証明の過程で使われている手法が 非常に強力なツールになることがある。
答えになってない。それは理想論ですか
いいところだから低能は黙って!
単純な話で、副作用があるものと無いものを明確に分けること、 そして副作用が無い処理を基礎と置くこと、 このソースコードが理解しやすくなる。 もうひとつは、
副作用は秘孔のようなものと某伝承者が
772 :
770 :2012/09/15(土) 14:17:06.60
Enter キーを押してしまった 単純な話で、副作用があるものと無いものを明確に分けること、 そして副作用が無い処理を基礎と置くこと、 この2点による恩恵が2つある。 ひとつはソースコードが理解しやすくなる事。 もうひとつは副作用が無い処理の部分で最適化を施しやすくなること。 (具体的には、フュージョンとか) こんな事は関数型以外の言語でも当たり前に取り組んでいることで、 関数型、特に haskell はそれ(副作用の分離)を言語仕様として組み込んでいる、 ただそれだの事。 宗教を持ち出してくる意味が分からない。
どっかで見たHaskellネタを真に受けただけだろ、放っておいてやれよ
>>772 唯一まともな回答をしてくださってありがとうございます
完全に同意です。別にドカタ言語でも当たり前のことですよね
いや、異常に神聖視してる狂った人が大暴れしてたりしてるので
は?何言っちゃんてんのコイツと思った次第です
最後の一行にも同意したの?
はい。Haskell信者がなぜあそこまでHaskellを盲信するのか意味が分からないので 別に大したことないのに
777 :
770 :2012/09/15(土) 14:45:22.37
>>774 そんなのは狂った人だと分かっていながら、
>>761 のような質問を投げてきたのか。
要するにお前は暇だからただ単に嫌みを言いに来ただけではないのか。
もしそうなら狂ってるのはお前だ。
Haskellネタで遊ぶ人が多いからこういうのが出てくるんじゃねーの
宗教の話を最初に持ちだしたのは自分なのに
>>776 みたいなレスを返すあたり、
は?何言っちゃってんのコイツという感じですね
客観的には狂った人かもしれないけど、それがHaskellerなのかなとも思いました なにせ彼には日本語が通じなかったので Haskellerがまともな思考を持ってるか確認するためにこのスレに質問しに来たのですが やはり彼が例外的に狂ってるだけのようなので安心しました
どこかでHaskeller使いに馬鹿にされて 悔しくて発狂しちゃったんだろうね ドカタがリアルでHaskell使いと接点あるわけないから、2chの他スレかな
Haskellerはドカタという言葉が好きなんですね。彼も他人をそう呼んでたので
よく分からんけど、目的を果たしたんならもう帰ったらいいんじゃないかな
一般的に広く使われてるドカタ言語がHaskellに逆立ちしても敵わない理由はなんですか?
ドカタと最初に言い出したのは自分なのに
>>782 みたいなレスを返すあたり、
は?何言っちゃってんのコイツという感じですね
関数型言語って普通に人には扱えないヤバイ設計になってるんでしょうか
787 :
770 :2012/09/15(土) 14:58:12.03
>>780 質問する前に過去レスを読むのは当たり前のことだろ。
過去レスをじっくり読んだら質問する前に答えが得られるはずだ。
安易にバカみたいな質問するな。
そして、あえて質問するにしても、質問の仕方に配慮がなさ過ぎる。
本気で知りたいのなら、もっと丁寧に言葉に気をつけて文を練ろ。
べつに急ぎの質問でもないのだろ。
なら1日くらいよく考えてから質問しろ。
極簡単なこの2点が全くできてないのはわざとか。
俺にはわざととしか思えんが。
どちらにしても、お前も気が狂ってると言われても仕方ないな。
>>786 普通の人も扱える
ただ、普通の人が扱ったら、普通の人が保守できない設計になってる
週末基地害が暴れてる。ID付きにして欲しいね
>>787 別に急いではないけど、明日に持ち越すほど本気で知りたいとは思ってないです
Haskellerがどんな人達なのか見たかっただけ
だから別にそこまで気を張って質問しようとも思いません
ただHaskellerがあまりに手続き型言語を馬鹿にしていて、
(Haskellを使ってないからって馬鹿にされる筋合いはないし、手続き型言語の方が普通に使えるという事実があるので)
もしかして彼らは現実が見えてないんじゃないかと憤慨したのですが
このスレの何人かはそこまでアホじゃないようなので安心した限りです
どんだけ偉そうなんだよコイツww
> 手続き型言語の方が普通に使えるという事実があるので わざわざこういう文章をここに書き込むところが基地外
解った解った 事の発端は心無いHaskellerがドカタゲンガーに唾を吐いた事に因るものだ Haskellerの中にもごろつきはいるので そいつに虐められた奴がここに恨み節ぶちまけてるんだろう こういったいざこざはごろつき同士だけで済ませて欲しいもんだ
Haskellを批判した時点でドカタに決定したらしく、馬鹿らしくて否定する気にもならなかったが 京大院生(もちろんロンダ)だから近い将来ドカタになるかもしれないね うちは情報学研究科だけどプログラミングマニアが来る専攻ではないから Haskellerがおらず直接言う機会がないから、このスレにいるゴロツキに釘を刺したかったために そうでない数人が不快な思いをしたことは認める
日本語でおk
Haskellを使えることがステータスか何かだと思ってる奴 と Haskellが副作用をどうやって扱ってるかも知らないのに有効な批判ができると思ってる奴 が出会えばいざこざが起こるのは必然だな 関わりたくない
バカ同士の争いをこのスレに持ち込まないで。 2ちゃんねる以下の争いを。
>>797 前者みたいにHaskellのことを説明できないただの権威主義者がいるだけでいざこざは起こるよ
むしろ2chならこんなもんだと思うけど
ペアのベクタよりベクタのペアの方がパフォーマンス良いの?
>>801 まず自分で比較検討してみろ。
こんな実験方法でこんな結果が出ましたが妥当でしょうか?
という質問の仕方をしてくれ。
ようするに、 比較検討なんて面倒なんでそっちでやってくれ。 で、どっちが早いか結果だけさっとさ教えてくれ。 それができなきゃレスするな。 という質問だろ?
readのように、 様々な型の値を返す関数は どうやって書けば良いのですか?
型クラス
リストxsの要素xでf(x)を最大(最小)とするようなものを探す (Ord b)=> (a->b)->[a]->a 型の関数ってどっかにないの?
foldr1 (\x y -> if f x < f y then y else x) をもう少しコンパクトに書ければいいが
自分のコードではf x < f y を on (<) f x y にしてたけど、短いかと思いきやむしろ長くて読みにくいだけだったでござる minBy, maxBy::(a->b)->a->a->a とか需要あると思うんだけど、案外用意されてないんですね…
コンパクトに書くことよりも、読んですぐに意味が分かるコードにした方が良いと思う。 もちろん、もっとコンパクトにした方が意味をくみ取りやすいのなら、そうすべきだが。
>>808 {-# LANGUAGE NoMonomorphismRestriction #-}
import Data.List
import Data.Ord
maximumWith = maximumBy . comparing
こんなん出ました。
死ね、単相性制限。
import Data.Function (on) import Data.List (maximumBy) maximumWith :: Ord b => (a -> b) -> [a] -> a maximumWith f = maximumBy $ on compare f このfを消したくなるのは病気
細かい事だけどmaximumWithよりはargmaxの方が良い名前
maximumWithはパクった 自分の頭ではmaximumFとかmaximum'とか本当に酷いのしか思い浮かばなかった
ワロタ、正直だな
>>814 > このfを消したくなるのは病気
maximumWith = (maximumBy .) $ on compare
と、ついやってしまうって事?
それなら確かに病気だ
らんらんるー
自己書き換えを制限、gotoを制限、 動的型を制限、オブジェクトに制限 こうやって複雑さを増やすコードに制限をもうけることで大規模なプログラムが作りやすくなる。
>>820 言語仕様で制限された機能を実現するプログラムを作るための教育コストを考えてほしい
>>822 なんで必要な機能がデフォルトで制限されている、あるいは無いHaskellの
プログラマを教育しようとするの。
その機能が必要だと分かっているのなら C/C++ のプログラマを教育すればいいじゃん。
Javaで十分ならJavaプログラマを教育すればいいわけだし。
Haskellでプログラムする必要性がなければ、
無理に制限された機能を実現する必要は無いんだぞ。
Haskellで制限されてて困ってる機能を 具体的にくわしく
Monomorphism Restriction
>>825 どういう状況で goto がなくて困った?
>>826 どのような状況で Monomorphism Restriction がなくて困ったのでしょうか。
828 :
806 :2012/09/19(水) 19:59:36.28
>>807 ありがとうございます
取り合えずこんなのを書いてみたんですがダメでした……
{-# LANGUAGE FlexibleInstances #-}
class FilterContext a
instance FilterContext [a]
instance FilterContext ([a], [a])
filter' :: (FilterContext b) => (a -> Bool) -> [a] -> b
filter' = filter
filter' p xs = (ts, fs)
where ts = filter p xs
fs = filter (not.p) xs
一番外側のループは手続きでやりたいときもある
>>828 filter'をclass FilterContextのメソッドにしろ。
それぞれのインスタンス宣言で実体を定義しろ。
{-# LANGUAGE FlexibleInstances, TypeFamilies #-} import Prelude hiding (filter) import qualified Prelude type family Elem a :: * type instance Elem [a] = a type instance Elem ([a],[a]) = a class FilterContext b where filter :: (Elem b ~ a) => (a -> Bool) -> [a] -> b instance FilterContext [a] where filter = Prelude.filter instance FilterContext ([a],[a]) where filter p xs = (ts, fs) where ts = filter p xs fs = filter (not.p) xs こういう事がやりたいんだろうか 一々型アノテーション付けるの面倒じゃないかなぁ・・・
>>827 関数の途中で未処理の計算を保存したまま一旦プロンプトを出して問い合わせ処理を行いたいときにgotoがなくて困った
Continuation使えばよくね?
>>834 Continuation の教育コストを考えてほしい
>>835 教育を受ける人のやる気とか能力による。
普通に Haskell で何かアプリを作れる人なら、
全く苦にならずに理解できる。
837 :
806 :2012/09/20(木) 14:49:01.48
>>831 ,832
ありがとうございます、うまくいきました
type familyとかtype instanceとか、(Elem b ~ a)は
haskell 2010 language reportに無いような気がするのですが、GHC独自の拡張ですか?
type familyとtype instanceについてはGHC users guidの7.7に説明が見つけられたのですが、
(Elem b ~ a)はどういう意味なんでしょうか。
型アノテーションについてですが、確かにそうなんですが、
内部のあまり直接触れないものであるけど、最適化の為にまとめた方が良いような処理の場合、
複数の関数を作るよりまとめてしまったほうがいいかな、と思ってこういう事に興味を持ちました。
内部で用いる場合は大体letなどの代入で用いるので、その場合は型アノテーションは省略出来る事も多いと思い、
関数名が減る利点のみを得られるかと思います。
しかしなんか型システムを騙すために色々やらなきゃならないんですね……
「Elem b ~ a」は「Elem bとaは同じ型である」って意味ですね ただまあ832の例は関数従属と多引数型クラスでも複雑にはならない {-# LANGUAGE FlexibleInstances, MultiParamTypeClasses, FunctionalDependencies #-} module Mult where import Prelude hiding (filter) import qualified Prelude as P import qualified Data.List as L class FilterContext a b | b -> a where filter :: (a -> Bool) -> [a] -> b instance FilterContext a [a] where filter = P.filter instance FilterContext a ([a], [a]) where filter = L.partition *> filter (> 5) [1..10] :: [Int] [6,7,8,9,10] *> filter (> 5) [1..10] :: ([Int], [Int]) ([6,7,8,9,10],[1,2,3,4,5])
>>836 断言するが、プログラマのやる気と能力を必須とする言語はウンコ
>>839 縦列駐車もおぼつかないクズが、F1マシンをウンコと言ってるようなもんだな(´・ω・`)
うんこプログラマはヤル気も能力も無くていいのか。
>>839 それがどうかしたか?
嫌ならHaskellやめろよ
>>840 断言するが、日本の公道に置いてあるF1マシンはウンコ
>>842 だったら、法律でHaskell言語を指定して注文を出すのを禁止すべき
特に大学
大学なんだから自分たちで作れ!!!
ちょっと何言ってるかわかんないですね
>>838 使うときにaの型がはっきりしていれば、関数従属いらないよね
*Mult> filter (> (5::Int)) [1..10] :: [Int]
[6,7,8,9,10]
*Mult> filter (> (5::Int)) [1..10] :: ([Int], [Int])
([6,7,8,9,10],[1,2,3,4,5])
だから、この問題に関数従属が必須とはいえないが… たしかに使えば便利かも… 悩む
>>839 簡単な問題は、大抵の言語で解ける。
解くべき問題が難しい場合は、まず解くための記述力が優先であって、扱いやすさは熟れた後から付いてくるもの。
つまんない議論だな、分からない腹いせにウンコとかw こういうところが分かりづらかったとか、分からないとか、建設的な話をしようず
教育方法が分からない
本を読め
教育って現場での教育? 入門書を読ませるのでは駄目なの?
Haskellは漢字と同じ 仮名を知らないやつに漢字を教える方法がわからない
ピンインの無い時代の中国人は直接漢(ry
教育方法が分からないものを現場で使うなんていう判断は普通はしない
おまえが教育ができないバカというだけ ついでにマルチ書き込みするバカでもあるな
>>855 使用する言語を自由に選べるソフト会社はごく一部
やる気のない奴に教えるのが難しいのは分かるけど、言語関係なくね?
>>855 はどういう言語なら教育できるのか
なぜそれがHaskellだと通用しないと思うのか
>>857 普通、そのような選択肢の少ない会社は C/C++ か Java か、
せいぜい C# くらいしか選べない。
が、これらはたいてい、少なくともその会社のアプリを作るに当たっては、
教育コストはそれほど高くなく、また実績も数多くあるので、
教育方法が分からないものを現場で使うなんて判断はしない。
自然言語だとSecond Language Acquisitionとかいう分野で、 言語を使えるようになるメカニズムとか、効率的に教えるor覚えるのはどうするのか、とかよく研究されてるけれど プログラミング言語でも、そういう研究されてたりするのかな?
>>859 大学の研究室から受注するのはHaskellとかLispが多い
>>863 あ、そうなんだ。
すまん、その辺りは正直よく分からん。
大学関係と仕事したことない。
>>858 Cはシンタックスを覚えさせて、その後、例外処理教えて、その後、開発プロセスの教育に入る
JavaやCobolも同じ
Haskellは例外処理と開発プロセスを教えるときの計算モデルが事例ごとに個別に存在するから教育が難しい
(CやJavaみたいにフローモデルで統一できないので、公理的な原則から演繹する方法がとれない)
>>865 「計算モデル」という言葉をどういう意味で使ってるのかピンとこないけど、
フローモデルというのが制御フロー(フローチャートとか)のことだとすると、
それはHaskellでそのまま通用すると思う
Haskellだと、第二原則として「入力から出力への関数を書く」というのを
制御フローの次にもってくればいいんじゃね
どうせ「公理的な原則から演繹」するだけで書けるプログラムなんてほとんどないんだから
(たとえば、制御フローを気にしてるだけじゃCやJavaでデータ構造は設計できない)
そんなに大きい問題には見えないけどどうだろう
結局、構文を覚えた後はコードを書いてもらって、それをレビューするというのを
繰り返すしかないし、これは言語に関係ない
>>866 CやJavaは「こっち行った後にここでこう飛んで…」みたいな感じで、説明できる
つまり、CやJavaのコードを読むことは、どんなトリッキーなコードも結局は、機械語や擬似コードの羅列を上から下に追ってgotoで飛ぶ作業「だけ」に還元できる
Haskellのコードを読むことを、教育者が簡単に提示できる何かの作業「だけ」に還元できるだろうか
Haskellの本ならProgramming In Haskellが良かった 薄いし計算モデルも簡単に説明してるしHaskellのパワーも一通りわかるし がっつりやらせたければSICPでも読ませとけばいいんじゃね?
ってか俺は計算モデルよりむしろ GHCの拡張含めたHaskellの型システム使いこなしのコツ的チュートリアル欲しい……
>862 ソフトウェア開発で言語そのものの関与は低い。 だからあまり考えられたいないはず。
使いこなしのコツ的なのは所謂チュートリアルで学べるものではないと思う。 型族とかGADTとか関数従属性とか、個々の使い方はチュートリアルで学べるけどね。 俺はどちらかというと、そういう技を見事に活用したライブラリの紹介などの、 ベストプラクティス集みたいなのがほしい。 探しても誰も紹介してないから、仕方なく暇をみつけて 自分でライブラリ漁ってコツコツと使い方コレクションを作ってる。
あれはあれ、これはこれ、でTipsにしか見えないイデオムが多くて困る
>>875 いや、まだ人様にお見せできる状態じゃないよ。
ライブラリのソースと、「abc.hs で**という使い方してる。スゲー」
とか書いたちょっとしたメモとを紐付けして保存してるだけ。
どちらかというと、ぱっと見て気にかかったことを忘れないようにメモってる感じ。
cabal でライブラリをインストールする時はいつも、
インストール処理中にソースをざっと眺めるようにしてるから。
いつか読み返して、他とも関連も併せてちゃんとまとめ直したい。
haskellwikiあたりにこっそりページ作って コード片と出典と簡単なコメントつけるだけでも 結構需要あるんじゃないかなあ
どっちのスレに書き込むべきか悩んだんだけど,Haskellに限った話なのでこっちに. Haskell Platform付属のEmacs用haskell-modeってyasnippet.elと相性悪い? TABがhaskell-modeのインデンテーション補完に取られてyasnippetの$0とか$1の位置に動けない.スニペット展開すると即確定になる.
yasnippetをC-TABにしてる俺は問題ない。
男ならメモ帳だろ
便乗してぼやくと、vimにneco-ghc入れても、AutoComplPopが補完メニューを展開してくれないからつらい
日本法人のツイートはウソばかり。って有名だが。 都合が悪い時は黙る。とかね。
どこからの誤爆だ?
Twitter全体に言えそう
Haskellのtwitter API ってどれがメジャー?
886 :
デフォルトの名無しさん :2012/09/28(金) 01:06:58.11
haskellってファイバー使える?
使えたとしても副作用があるので隔離される 副作用がないならシングルスレッドで簡約した場合と全く同じ結果になるはずだ
用法としてはStateモナドが近い
ファイバーと継続とモナドとajaxは近い
Haskellのdataはなんで代数的データ型と言うの? C言語のstructは代数的データ型とは言えないの?
andとorがあって再帰的定義できてこその代数型
代数的データ型は何らかの代数的構造を持つデータ型だ、と考えていい? 逆に言えば、代数的構造を持たないのは代数的データ型ではない?
じゃあ、Haskellにおける「代数的」ってどういう意味なんだ?
すまん 「andとorと再帰的定義」 これと 「代数」 これの関わりを もう少し説明してくれないだろうか。 Haskellのデータ型でのandとorというのは、次のこと? (and) => data A = X a b c (or) => data A X | Y あと、再帰的定義ができることも分かる。 しかし、どのあたりが代数なのか、俺は他人にちゃんと説明できないんだ。
897 :
896 :2012/09/29(土) 16:05:10.62
>>896 ミスった(イコールを忘れた)
(or) => data A = X | Y
勉強はじめたところでオレも良く分かっていないが… 代数的データ型の「代数的」な所以は代数のクラスを抽象化するのに 必要十分なだけの情報を持っていることじゃないかな。 例えば、「単位元と二項演算子を一つ持つ」代数のクラスを考えた場合、 data A= Unit | Op A A という代数データ型があれば 0 + (0 + 0)も 1 + (1 * 1)も Op Unit (Op Unit Unit)という式に抽象化することができる。 (これが、X |-> 1 + X * X なる関手の始代数である、ということだと思う) こういう抽象化ができる、というかこういう抽象化によって見出すことができるデータ型が代数的データ型ということ じゃないかなぁ、というのが勉強を始めてところの今の理解
なるほど。 代数的構造を持っているのではなくて、 代数的構造を表現できるから代数的データ型なのか。
900 :
898 :2012/09/29(土) 16:33:41.99
あ、
> 1 + (1 * 1)も
は
> 1 * (1 * 1)も
の誤記。すまん。
ついでに、書いておくと
>>898 の例で、
concrete :: (a, a -> a -> a) -> A -> a
concrete (u, _) Unit = u
concrete a@(_, o) (Op x y) = o (concrete a x) (concrete a y)
という関数があれば、Aで作られた抽象的な式を、具体的な式に復元?することもできる。
concrete (0, +) (Op Unit (Op Unit Unit)) === 0 + (0 + 0)
concrete (1, *) (Op Unit (Op Unit Unit)) === 1 * (1 * 1)
代数的って言葉に特に定義ないよ。そもそものところでブレてるし。 少なくとも統一見解はない。
>>901 一般じゃ無くて、Haskell の data で定義できる型に限ったことでいいよ。
そこにおける「代数的」ってどういう意味、という話。
そんなに不思議かな 代数とは「集合とその集合の上に定義された演算の対」
×演算 ○演算の集合
演算の間の代数的な関係によって型を規定するから代数的
つ 多ソート代数
>>907 おぉ、ありがと。
その論文からいろいろ辿ってみるよ。
> 数学的内容は眉唾な部分があるので
え、どゆこと?
数学的内容の本なんじゃないの?
計算機科学が主で、道具としての数学を解説してる本ってこと?
数学的構造と呼ばれるものが何処で発生したのかという数学史の本。 計算機科学なんか全く出てこない。数学一般において代数的という言葉が どういう変遷をたどったかという本だ(と思う)から。 ほんと気になる人向けという意味で上げた。
数学だと、(加算と)乗算が定義された集合を代数と呼ぶ
狭義のalgebraは日本語だと多元環。 今、話題になってるのはこっち。
聖域ってなんかエロいよね
俺はもうやらん。
代数データ型という言葉をはじめて聞いた時は 単なる構文的等値でない等値性が用意されているのかと誤解した。 「可換的」とか「結合的」とかキーワードが用意されていて、T a (T b c) = T (T a b) cになるとか。
「ストラウストラップのプログラミング入門」的な本がHaskell(関数型)にも欲しいよな。
関数型言語で例示してるアルゴリズム本がほしい
>>920 「Pearls of Functional Algorithm Design」
すばらしい
HashMapがあればMapやIntMapは退役?
>>922 退役かどうかは人によるだろ。
使用中のメモリの変化も違うし、計算速度も違う。
自分が書いたプログラムのMapやIntMapを使ってる部分をHashMapに変えて、
プロファイルを取ってみるといい。
はい(´・ω・`)
>>920 そのものズバリの
"Algorithms: A Functional Programming Approach"
はどうですか?
926 :
デフォルトの名無しさん :2012/10/04(木) 22:09:02.57
機械学習を専門としている博士課程の学生です。 C++を15年くらい使ってきました。 そしたら、とある本に Haskellを使えばコーディング時間がC++の10分の1くらいになるよ (実行速度はちょっと遅くなるけど) と書いてあったので、Haskellを使ってみたいと考えています。 C++プログラマーがHaskellを勉強するには、どんな本がオススメでしょうか? あと、本当にコーディング時間(デバッグ時間を含む)は 10分の1くらいになるのでしょうか?
>>926 静的型付けが役に立つほど仕様が固まってデカイコードなの?
完成品はc++で約何行ぐらい?
>>926 どの言語をやっていようが関係ない
・すごいHaskellたのしく学ぼう!
・Haskell: The Craft of Functional Programming (3rd Edition)
このどちらかの本で学べばいい
ところで、「とある本」とは何だ?
変なところで伏せずに、ちゃんと明かしなさい
教養のためじゃなくてガチで使うなら
>>5 のThe Craftがおすすめ
>あと、本当にコーディング時間(デバッグ時間を含む)は
>10分の1くらいになるのでしょうか?
個人的には、C++と比較して1/10はかなり言いすぎに思える
体感的には1/2-1/3くらい
もちろん書くコードの種類や、言語の習熟度に強く依存するから、
1/10になるケースがないと主張するつもりはないけど
15年使って慣れたパラダイムを離れるんだからな コーディング時間が数分の1になっても元は取れないかもしれない
機械学習だとCにはあってもHaskellには無いライブラリが 沢山ありそうだからそれも書くことになる
まあライブラリはFFIで呼ぶとして、 実行速度のパフォーマンスが出ないときのチューニングがキツい予感
対象データが大きいときついね。 たかだか百万エッジ程度のグラフでも色々工夫しないとメモリ不足になるかGCばかり走る状態になる。
934 :
デフォルトの名無しさん :2012/10/04(木) 23:50:51.67
>>927 行数はわかりませんが、Hadoopくらいの複雑さを想定しています。
単体法や内点法のような数値計算もガリガリ書いています。
静的型付けが必要かと言われると、ちょっとわかりません。
数値計算部分はmatlabで書いたりするので。
>>928 情報ありがとうございます。
>>929 さんも推薦しているので、
craftを買ってみようと思います。
とある本とは、非公開会議の資料なので、伏せさせてください。
>>929 なるほど、1/10は誇張でしたか・・・
でも、仮に半分になったら嬉しいですね。
>>930 なるほど。
ただ、結局は機械語に帰着するので、そんなに違いはないような気もしますが。
>>931 そこは頑張って自作しようかと。
>>932 アセンブラレベルのチューニングはあまり重要視していないので、大丈夫かな・・・たぶん・・・
935 :
デフォルトの名無しさん :2012/10/04(木) 23:59:26.96
>>928 ・すごいHaskellたのしく学ぼう!
こっちもすごく良さそうですね!!
しかも、日本語なら少しだけ速く読めるので、
こっちがいいのかな・・・悩ましい・・・
チューニング時間が10倍になって相殺される
「すごいHaskellたのしく学ぼう!」が今のところ日本語の書籍ではダントツだと思うけど C言語とかにどっぷり浸かってる人なら「ふつうのHaskellプログラミング」もいいと思うよ
>>939 Amazon UK でまだ売ってる。
本体は38.99ポンド
通常発送(遅い方)の場合、
Amazon UK の設定するレートなら6196円で買える。
ポンドで買う(カード会社がレート設定する)なら46.97ポンド。
>>925 読んだこと無いけど米密林では評判悪いね
「Algorithms: A Functional Programming Approach」はアルゴリズムというよりは、 どちらかというとアルゴリズムを最適化するテクニックを多く学べる感じだ。 第3章からが本番。 関数の簡約の様子が詳しく書かれている。 所々、おまけでヒープの変化の様子を描いた図もある。 Burstall-Darlington 変換の考え方が学べる。 第4章のListの節はなかなか面白かった。 細かな最適化の話なんだが、関数合成時の中間データを省くテクニックや、 計算速度的には余計な結合演算(++)を取り除いたりするテクニックが学べる。 (後者はちょっと目から鱗だった) あとはTreeやArrayの節でも同じように細かなテクニックが述べられている。 第5章はスタックやヒープなどのデータ構造を表現する方法が学べる。 ここは、個人的にはたいして面白くなかったな。 手続き型言語でよくあるデータ構造を関数型でいかに表現するかという事で、 まぁ実装方法は予想の範囲を超てなく、驚きがなかったから。 ただ、分かりやすくはあった。 第6章はソーティングの話だが、クイックソートよりも マージソートやヒープソートの方が関数型では適している事が分かる。 各アルゴリズムの比較で、効率の計算が出てくるが、ちょっと難しいな。 なぜその計算になるのかの説明がちょっと簡略気味だ。 ただ、ここでも簡約の様子が図入りで載っているのは理解に助かった。 第7章からは、ちょっと飽きてきて、さらっと斜め読みしかしてない。
一方「Pearls of Functional Algorithm Design」の方は、 各章毎に最初に「**がしたい」という課題が提示され、 その問題を解決するアルゴリズムをチープなものからハイレベルなものへと 徐々に進化させながら解説する本だ。 各章で、たいていは最初に "specification" と言って、 その問題の解を導く関数が持つべき性質が Haskell の文法で示される。 で、その specification を素直に満たす関数をまず作り、 そして、どこがなぜ非効率なのかを解説しながら少しずつ改良させていくわけだ。 ちになみに、タイトルには無いが、こちらも Haskell の本だよ。
ゆうくんはHaskell本のだいせんせいなんだねぇ
へーどっちも結構面白そうだな おらなんだか欲しくなってきたぞ
ghcにおいて、最適化オプションの有無によって コンパイルするコードを変える事はできるでしょうか。 例えば、#ifdef #else #endif で分けるとか。
>>947 C Pre-processor はどの言語でも使える嫌われてもいいのならバンバン使えばよい
>>948 最適化オプション有りだとどんな名前のディレクティブが定義されるのでしょうか。
>>950 c の処理系ならもれなくついてくる cpp にかければいいと言いますが、
ghc なら -XCPP オプションを付ければ .hs ファイルの中で #ifdef などが直接使えるので、
あとは最適化オプションを付けたときに、ghc 側でどのようなディレクティブが
自動で定義されるかが分かればできそうです。
それが分からないんですけどね。
>>951 プラグマを使って最適化時にコンパイルするコードを変える方法が
載っていないような気がするのですが、見落としてますでしょうか。
まともな方法はないと思う 理論的には、Template Haskellは任意のIOを実行できるので、 OSの機能を使ってGHCに渡されてるオプションを調べたり、 デバッガを起動してGHCのメモリ内容を見たりすることは可能
そういうのはビルド環境のツールでやればいい。 CabalとかSetup.hsとかmakeとか。 コンパイラになんでも詰め込んでしまうとろくなことない。
>>954 コンパイラでやるのと Cabal でやるのとで、何か違いがあるのですか?
baka
// / / バカッ //⌒)∩__∩ /.| .| ノ ヽ / | | ● ● | / | 彡 ( _●_) ミ ワッフル ワッフル / | ヽ |∪| /_ // │ ヽノ \/ " ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ
#lineディレクティブってghcは認識してくれるんだっけ?
自分で調べろカス
cppをプリプロセッサとして使えるらしいからOKのはず
wxHaskellとgtk2hsの簡単な比較 起動時間比較 wx3秒。gtk0.5秒 導入の簡単さ wxの方が難しい GUIコードの長さ wxの方が短い 以上、チラ裏でした
GUIコードの長さってたいして変わらんと思うが それよりも、wx は ghci 上で動かないのが痛い
すごいH本でHaskell始めたのですが,質問です.14章1節のWriterでつまずいています.
エラーになってる関数は使っていませんが気にしないでください...
http://ideone.com/BXd8X なコードが
Hoge.hs:7:18:
Couldn't match expected type `(a0, b0)'
with actual type `Writer w0 a1 -> (a1, w0)'
In the second argument of `($)', namely `runWriter'
In the expression: fst $ runWriter
In an equation for `getValue': getValue = fst $ runWriter
というコンパイルエラーで落ちるのですが,どこが悪いのでしょうか?
runWriterの引数の型を間違えていると読めますが,どうおかしいのか私にはわかりませんでした.
>>963 (fst $) の型は (a, b) -> a だ。
これは、(fst $) は (a, b) 型の値に適用して a 型の値を返す、という意味だ。
あなたのプログラムでは、(fst $) を runWriter に適用している。
では、runWriter の型は (a, b) なのか?
違うよね。
runWriter の型は Writer x y -> (y, x) だ。
(fst $) は (a, b) 型の値に適用することが期待されているのに、
実際のプログラムソースでは (Writer x y -> (y, x)) 型の値に適用しようとしている。
マッチしないよ。
というのがエラーの内容だ。
で、あなたがやりたいことが getValue の型の通りだとするなら、
そこは fst $ runWriter ではなく fst . runWriter なのでは?
>>964 なるほど,ありがとうございます.
格好つけてポイントフリースタイルみたいな書き方をしたが,実際にはポイントフリースタイルと($)を混同していたのがそもそもの問題だったのですね...
fun $ このセクションの発想はなかったわ
ぬるほ
カッ
Haskell Platform 2012.4.0.0 は順調なんでしょうか。
Windows2000への再対応を切に望みます なんせサポートをうたってるのですから
そんなもん窓から投げ捨てろ
すいません、今、Mathematicaで行っている計算を Haskellに移行したいと思ってます。 Haskellの学習はまだです。 Mathematicaでは次の操作を行って株価の一覧を作成してます。(そのほかにもいろいろな指標を計算してます) ・株式コードからURLを作成する ・URLが指定するWebページのHTMLを取得する ・HTMLから正規表現で現在の株価を抜き出す これはHaskellでも可能でしょうか? ライセンスの問題でMathemaricaを使い続けることが難しくなりました。 考え方が近いようなので関数型言語への移行が適切かなと思ってます。 (ExcelVBA版は作ったのですが速度に問題がありました…)
可能 次の方どうぞ〜
むしろmathematicaってそんなことできたんだ… 別に関数型言語じゃなくてもpythonとかperlみたいなLLでいい
むしろその程度Haskellでできないと思う余地があるのか
出来ない言語があったら教えてもらいたいレベルだな
mathematicaすげえええええええええ
gawkですら出来るレベルだからね
>>976 >>977 すいませんでした。
VBAで作り直したとき、Webからのデータ取得や正規表現は
外部からCreateObjectで読み込んだので少し不安でした。
Do not talk about Mathematica.
>>973 >ExcelVBA版は作ったのですが速度に問題がありました…
この書き込みで最も有益な情報
excel vbaのせいではない気がする
こいつら低脳だな 実用的なことを一切やっていない マジ低脳の極み Perlが一番最高 こんなくそ言語やって何が楽しいんだ?低脳だろうなこいつら インテイゲンチャきどっててきもちわりいわ
>>973 webからデータ取得だけならLLで、って意見に同意。
もっともmathmaticaでも関数型プログラミング可能と謳っているからまずは
自分のコード見直してみたら?
Homeライセンスならグアム/サイパンでも行ったときホテルからUSDで買えば安いよ。
ハスケラーが他の言語をdisっているのは 自信のなさの裏返しなのかな?
他の言語をdisってるのよりも 他の言語ユーザをdisってるほうが良く見るな 馬鹿には無理、ってね
Haskellが難しく感じるのはほかの言語に慣れてるからでしょ 「○○言語ならこう書けるのに、なぜこんな書き方をさせるんだ!!!」みたいな。 まったくのプログラミング未経験者ならCやJavaよりむしろ簡単だと思う
あと何年かしたら普通にHaskellでプログラミング覚えたって世代が出てくるだろうからそれからだな
>>988 > まったくのプログラミング未経験者ならCやJavaよりむしろ簡単だと思う
それはどうだろうか。
私は、どちらを先に始めたかではなく、それに触れるまのでの間に
どのような考え方に慣れているかに依ると思う。
人はたいてい小学生(あるいはそれ以前)の頃からずっと、
課題を解決するのに「手順」を考える事を学習させられてきた。
その中で、更に「状態変化・状態遷移」の概念も知らず知らずすり込まれる。
問題 X を解決するには A をやると x になって、
それから B をやると y になるから、
最後に C をやればできるよ、というような感じで。
理科の実験手順も、料理のレシピも同じ。
この考え方は C や Java を理解するのに適している。
静的な、宣言的な考え方なんて、手続き的な考え方に比べれば、
学校教育の現場でほとんど出くわすことはないだろう。
たとえ出くわしても、意識しなければ素通りしていくだけで、身にならない。
だから、そんな人間が初めてのプログラミング言語として関数型言語に触れても、
今までの生活では意識してこなかった考え方を求められる事に変わりはない。
手続き的な考え方よりも宣言的な考え方の方により慣れ親しんで初めて、
C や Java より Haskell の方が簡単と感じる可能性が出てくるのだと思う。
関数型が普及していくのは間違いないけど、それがHaskellとは限らないな。
学校教育の現場か 数列の帰納的定義をやらずに終わる高校もあるのかね
ポインタや右辺値・左辺値あたりも結構なハードルだから 決して手続き型が初心者に易しいわけではない
おまいら次スレ大丈夫ですか ム板の人は特に無頓着な気がする
他人任せな奴も多いよね
初心者の世界では、変数はaからzだけで足りるし再帰もポインタもない
>>990 日常のなかで宣言的な考え方というのは確かに僅少ですね
最初に出会うのは‥‥数学的帰納法か?
Little Haskeller キボンヌ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。