1 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 20:28:13 ] haskell.org www.haskell.org/ 日本語サイト www.sampou.org/cgi-bin/haskell.cgi www.shido.info/hs/ 過去ログ 関数型プログラミング言語Haskell Part1 pc.2ch.net/tech/kako/996/996131288.html Part2 pc2.2ch.net/test/read.cgi/tech/1013846140/ Part3 pc8.2ch.net/test/read.cgi/tech/1076418993/ Part4 pc8.2ch.net/test/read.cgi/tech/1140717775/ Part5 pc8.2ch.net/test/read.cgi/tech/1149263630/ Part6 pc11.2ch.net/test/read.cgi/tech/1162902266/ Part7 pc11.2ch.net/test/read.cgi/tech/1174211797/ ・2chの仕様により、行頭の半角スペースは表示されません。 コードをインデントしたいときは、代わりに または全角スペースを使うことができます。
83 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 11:03:25 ] 部下がpoint-free styleで1000行くらいのバグ入りコードを提出 という悪夢を見てしまった
84 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 13:55:48 ] >>83 現在適当な粒度の関数に分解する鶴を開発中です
85 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 13:57:05 ] >>79 無責任名誉会長は俺ね。
86 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 19:07:03 ] >>70 素直にλを残した方が分かりやすいわな。 main = getArgs >>= mapM_ (\a -> readFile a >>= putStr)
87 名前:79 mailto:sage [2007/11/11(日) 19:39:30 ] しかし、Haskellなどの関数型言語専門会社っていうのは憧れます。 自分はまだ初心者でチュートリアル勉強している段階ですけど、この世界が 広がったら素晴らしいなぁと本気で思ってますよ。 私の現在の妄想は、最近メジャーになってきたWebサービスの関数型版。 住所 -> GoogleMapAPI -> 天気予報 -> 天気マーク付き地図
88 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 19:53:47 ] バカっつーか、中学生臭い
89 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 19:59:51 ] >>87 それは俗に言う「マッシュアップ」というやつではないか? 関数型言語と関係なくそこら辺の奴でも作れるぞ。
90 名前:デフォルトの名無しさん mailto:sage [2007/11/11(日) 20:11:17 ] そうだな ただのマッシュアップだな masuidriveのブログとか見るといいような気がするよ そして >>71-77 ,86の諸氏よありがとう よく理解できないから明日色々試してみるわ… Haskell挫折しそう… 書いてて楽なのは分かるんだけど…分かるんだけど…
91 名前:79 mailto:sage [2007/11/12(月) 07:08:04 ] いや、マッシュアップを関数型でやってるのを見たいんだけど。 もうあるの?
92 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 11:01:32 ] プロシンあたりで誰か発表してるかも〜 とか無責任に書いてみる
93 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 16:47:36 ] >>86 そこまで来たらやっぱりこう書きたくなる main = getArgs >>= mapM_ ((>>= putStr) . readFile)
94 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 16:56:09 ] 好みが分かれるもんだな 俺はラムダ抽象が嫌いなのでwhere節を使う
95 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 19:48:05 ] >>94 お前の好みはhaskellには不向きだな。
96 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 20:14:14 ] そうか?俺がHaskell好きな理由の一つがこれなんだが where節みたいにローカル変数を使った後に定義できる言語は他にはCleanくらいしか知らない それに嫌いって言っても使うことは結構ある。>>86 みたいな例なら迷わずwhereを使うってだけで
97 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 20:58:37 ] >>96 関数の内部で関数を定義できる言語はいくらでもある。rubyとか。
98 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 21:06:16 ] それは知ってる。でも関数を「使った後に定義」はできんだろ
99 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 21:18:00 ] 使った後に定義ってどういう意味?
100 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 21:19:56 ] >>99 ソースコード上で定義が参照よりも後に現れること f x = g -- ここでgを使う where g = 2 -- ここでgを定義
101 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 21:26:38 ] int main(char args[][]){ owata(); } void owata(){ writefln("\(^o^)/"); }
102 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 21:27:46 ] 使った後に定義してるわけじゃないけど、遅延評価が便利って言いたいわけね。
103 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 21:28:18 ] >>101 >>98 はローカル関数の話な、誤解させてすまん
104 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 21:30:21 ] >>102 なんというエスパー
105 名前:96 mailto:sage [2007/11/12(月) 21:32:27 ] >>102 遅延評価はあまり関係ないと思う。あくまでコード上に現れる順序の問題 極端な話、正格な言語で f x = y where y = 2 が f x = let y = 2 in y -- このletは正格 の構文糖なだけでも俺には十分
106 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 22:26:37 ] Lisp 系だったらその手の構文糖は作り放題だけどね。 実際、昔 ELisp でそんな感じの macro 自作して使ってたし。
107 名前:デフォルトの名無しさん mailto:sage [2007/11/12(月) 23:36:21 ] はいはい自慢はいいですよ
108 名前:デフォルトの名無しさん [2007/11/13(火) 00:18:43 ] 興ざめするから自慢とか言わないでくれよ…
109 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 12:48:47 ] なら、自己満
110 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 19:37:02 ] 初心者です。 今、いろんなテキスト漁って勉強中ですが、モナドのところ見てて不思議に思いました。 これって、早晩知らなくてもHaskellが書けるようになったりするんじゃないのでしょうか。 今はまだ途上なので、透過参照を維持できるように云々と理論的な面が表に強く出て ますけど、近いうちに標準のAPIからは隠蔽されていくということはないですか?
111 名前:デフォルトの名無しさん [2007/11/13(火) 19:37:31 ] それなら良いわ
112 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 19:42:46 ] >>110 >>73 をモナドを使わずに書いてください
113 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 19:57:53 ] >>110 歴史的にはどうか知らんが、モナドは参照透過性のために仕方なくあるわけじゃなくて、 道具として積極的に使われてる。だからHaskellでモナドが使えなくなることは考えられない。 モナドを知らなくてもIOを書けると良い、という話なら、現状でもできると思う。
114 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 20:22:01 ] 質問です >>93 をみてこんなの↓つくってみたんだけど、 main :: IO () main = getArgs >>= mapM_ ((>>= putStrLn.conv).readFile) >> getCPUTime >>= print where conv :: String -> String conv = unlines.(map ((map toLower).(filter (/= '\"')))).lines 最初に与えたファイルパスのぶんが読まれないっぽいんよ c:\Users\aiueo> main < c:\a.txt c:\b.txt と入力すると、b.txtの中身とCPUTimeだけが表示されるんだよね エロい人なぜだか教えてください
115 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 20:27:40 ] >>110 モナドを使わないと、実用的なHaskellのプログラムは書けない。 モナドの理論的な側面を詳しく知らなくとも、モナドを使うことはできる。 結論: モナドの理論的な側面は今は無視して、モナドを使ってHaskellのプログラムを書けばよろし。 理論的なことは後から少しずつ覚えていけばよろし。
116 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 20:29:38 ] >>114 「<」これはリダイレクション
117 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 20:30:00 ] >>114 だってそれa.txtは標準入力に与えられてるもんよ c:\Users\aiueo> main c:\a.txt c:\b.txt こーやれ
118 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 20:39:55 ] >>116 ,117 ありがとう!
119 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 21:09:22 ] ちょっとお前ら聞きたいんだけどさ なんで>>86 みたく書くんだ? main = mapM_ (\a -> putStr =<< readFile a) =<< getArgs でよくね?モナド使わないときとモナド使うときで読む方向違うのってやりにくくね? なんか理由あんの?おせーておせーて
120 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 21:14:55 ] 俺も時々下から順に実行されるdoが欲しくなる
121 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 21:25:47 ] >>113 >>115 ありがとうございます。"モナド"という言い方がよくありませんでした。Maybeとか リストのモナドは仰るように積極的に使われていると自分も思いました。 ただ、IOモナドがよく分からんのですね。特にIORefとか。この手のものは、単に 透過参照性を維持するためのテクニックと見えてしまいます。
122 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 21:34:19 ] >>119 だったら>>75 が自然に見えてくるだろう
123 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 21:38:12 ] でも、>>75 はコンパイル通らんぞw
124 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 21:41:42 ] >>123 処理系とそのバージョンは? Control.Arrowをインポートしたかどうか。
125 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 21:48:31 ] いや、明らかに型が合わんだろ… readFile :: String -> IO String putStr :: String -> IO String (>>>) :: (Arrow a) => a b c -> a c d -> a b d instance Arrow (->)
126 名前:125 mailto:sage [2007/11/13(火) 21:49:19 ] 間違えた putStr :: String -> IO () ね
127 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 21:52:41 ] >>121 参照透過性を壊さないでIOを実現するに当たって、現状よりマシなインタフェースがあるってこと?
128 名前:デフォルトの名無しさん mailto:sage [2007/11/13(火) 23:40:51 ] >>124 無理やりコンパイル通せばこうなるぞ。 main = getArgs >>= mapM_ (readFile >>> (>>= putStr)) Kleisli使うのは俺はパスw
129 名前:デフォルトの名無しさん [2007/11/14(水) 01:19:08 ] 2次関数が苦手だったから関数言語なんて滅びてほしい
130 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 01:31:50 ] 釣られないぞ
131 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 05:55:26 ] a -> IO b は Kleisli IO a b と同じ構造をもつんだけど、Haskell のnewtypeが違う型として扱ってしまうために、>>75 のように楽天的にはいかないんですな だからといって 型シノニムで定義できるわけでもないので、しょうがないんだけど
132 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 14:53:09 ] これでどうよ! main = getArgs >>= mapM_ (readFile >=> putStr)
133 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 15:38:28 ] 入門HaskellのP104にあるインスタンス宣言について質問なんですが instance (Eq a) => Eq (Maybe a) where の(Eq a) => はどうして必要なんでしょうか?
134 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 16:05:38 ] >>133 中身が比較できないとMaybeも比較できないじゃん 具体的には、 instance (Eq a) => Eq (Maybe a) where Nothing == Nothing = True Just a == Just b = a == b -- このa==bが意味を持つことを保証しないといけない _ == _ = False
135 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 16:39:52 ] >>134 Maybe aとaを同一視してましたorz わかりやすい説明ありがとうございました。
136 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 19:13:05 ] do cs <- getContents hoge <- getContents putStr hoge ↑のような式を>>=を使って書き直した場合、どのような式になるのでしょうか?
137 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 19:17:43 ] >>136 getContents >>= \cs -> getContents >>= putStr
138 名前:136 mailto:sage [2007/11/14(水) 20:05:49 ] すいません do cs <- getContents hoge <- getContents putStr hoge じゃなくて do hoge <- getContents cs <- getContents putStr hoge の間違いでしたorz
139 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 21:17:45 ] >>138 getContents >>= \hoge -> getContents >>= \cs -> putStr hoge このケースでは(>>=)を使う旨みはないね。
140 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 22:11:24 ] この場合、 A. getContentsを2回やってからputStr B. putStr hogeをやるために1個目のgetContentsをやって2個目のは保留 のどっちの動作になるんだっけ。 遅延評価的にはBだよね?
141 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 22:18:38 ] >>140 IO動作は上から順に(厳密には>>=の左辺から右辺へ)実行される getContentsの動作は特殊で、読み込み自体は文字列が必要とされるまで遅延される だから、順序としては、 1. 1個目のgetContentsが実行され、ハンドルがセミクローズされる。遅延読みのため即座にリターン 2. 2個目のgetContentsが実行され、ハンドルがセミクローズ状態なので例外発生 で、putStrは実行されない
142 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 22:28:25 ] そういう風な動作になるのか。ちょっと勘違いしてた。Thanks
143 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 22:55:19 ] ここってクロスコンパイルネタはスレ違いですか?
144 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 23:11:31 ] ここしかないだろw
145 名前:デフォルトの名無しさん mailto:sage [2007/11/14(水) 23:31:03 ] クロスコンパイルの場合、GHC(6.4.xや6.6.x)のMakefileって修正なしで通りますか? 依存関係を無視したり、更新情報を無視したり、 無いファイルを参照したり、必要なターゲットを生成しなかったりと 明らかに修正しなければならない部分が多々あるようですが
146 名前:143=145 mailto:sage [2007/11/15(木) 00:01:32 ] 私の環境で6.6.1をクロスコンパイルする場合、少なくとも ホスト、ターゲットで共通 ・distrib以下のファイルに実行許可がされていない ・configureでgmpのヘッダ、ライブラリ位置を指定しても途中から無視する ・makeをやり直した場合、すでに生成したファイルで且つ更新の必要がないものでも再ビルドする場合がある ホストでは、 ・libraries/Cabal/cabal-setup/CabalSetup.hcを生成してくれない ・かといってターゲットとして生成したファイルだとundefined referenceが発生するので-keep-hc-filesを指定してCabalSetup.oをリコンパイルしなければならない ・hc-file-bundleする際、libraries/haskell-src/Language/Haskell/Parser.hsという存在しないファイルをアーカイブしようとする (現在ビルド中ですので途中までしかわかっておりませんが)ターゲットでは ・compiler/primop*.hs-inclが空ファイルで生成される ・compiler/stage1にインタフェースファイルが生成されないためpreludeのビルドに失敗する 等が確認できました i386-unknown-openbsd → arm-unknown-openbsdという特殊な環境ということもありますが、 普通の環境ではすんなりクロスコンパイルできるのか疑問に思えました
147 名前:143 mailto:sage [2007/11/15(木) 00:07:35 ] ちなみにOpenBSD-makeではなくGNU-makeを使用しています
148 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 01:19:56 ] Ubuntu上のemacs22+ghc6-6.1でHaskellのプログラムを色々試しているんですが C-c, C-lを実行するとよくEmacsが固まってしまって何の入力も受け付けなく なってしまいます。そのたびにkill -KILLをしているんですが 同じような症状の人はいないでしょうか?
149 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 01:36:11 ] debianですが、固まりませんね。
150 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 03:01:07 ] IORefについて質問です。 do ioref <- newIORef 0 modifyIORef ioref (+1) readIORef ioref >>= print という式の中でmodifyIORef ioref (+1)がiorefの値を変更している仕組みが どうしてもわかりません。予想としては ・modifyIORefを使うと引数の値を変更できると言語の根っこの部分で決められている という事かなと思っているんですが、この考えでいいんでしょうか?
151 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 07:23:12 ] >>150 C言語の例でよければ *ioref=*ioref+1; で変更されるのは*iorefであってiorefではない。 Perlなら $$ioref=$$ioref+1; といった具合で。 Cで詳細に書いてみる。 void modifyIORef(int * ioref,int (*fn)(int)){ *ioref=fn(*ioref); } int add1(int arg){ return arg+1; } int readIORef(int * ioref){ return *ioref; } int main(){ int * ioref; ioref=newIORef(0); modifyIORef(&add1); printf("%d\n",readIORef(ioref)); return 0; } まあ(>>=)の部分(doで省略される部分とか)までより近く書くともっと長くなりますが。 それ以前にかけるかどうかちょっと自信ないけど。 *iorefは変更されてもiorefは1回の初期化時の変更のみということで。
152 名前:150 mailto:sage [2007/11/15(木) 08:04:34 ] >>151 つまりHaskellは、定数だけでなく、変更される変数の値を保存しておくための(つまり再代入可能な) 場所も用意しているということなんでしょうか?
153 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 10:27:06 ] >>152 実装上はその通り。GHCにはヒープ上に変更可能オブジェクトを置くための機構があるし、 多分Hugsも似たようなもの。 一方で、言語について「Haskellは〜用意している」という言い方をするのは誤解がある気がする。 実際、>>151 の言うように、IORefを使っても(Haskellの普通の)変数の値が変更されることはないし、 言語の根幹に変更を迫るような拡張じゃない。 扱える型を限定すれば、自分で(ファイル入出力を使ったりして)IORefみたいなものを書くこともできる。
154 名前:150 mailto:sage [2007/11/15(木) 13:37:19 ] >>153 よくわかりました。ありがとうございます。 今入門HaskellとふつうのHaskellの二冊を読みながら色々試しているんですが もうちょっと詳しい説明が欲しいなと思うことがよくあります。 そこでプログラミングPerlのような ・どのようにHaskellでプログラミングするか ・Haskellはどういう理由でこういう風になっているのか を解説した本が欲しいのですが、テンプレに載っている洋書で↑の内容に 合っている本はないでしょうか?
155 名前:143 mailto:sage [2007/11/15(木) 13:54:41 ] Makefileを読む時間的余裕が無かったのでとりあえず find compiler/stage1 -name ¥*.o -exec rm {} ¥;して make -C compiler boot stage=1 && make -C compiler stage=1したら ビルド&インストールに成功したようです 後でパッケージを作って本インストールするつもりです 日本語のクロスコンパイルのドキュメントが少ないので 作業過程を簡単に書かせていただきたいと思います (需要は無いでしょうけど) うざったいと思われる方は「クロスコンパイル」をNGワードにしてください
156 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 13:56:24 ] >>154 ・どのようにHaskellでプログラミングするか →『Haskell: The Craft of Functional Programming』 ・Haskellはどういう理由でこういう風になっているのか →『Introduction to Functional Programming Using Haskell』 かなあ。両方とも良い本だと思う。まだ全部読み切ってないけど。
157 名前:150 mailto:sage [2007/11/15(木) 21:41:29 ] >>156 その二冊ですね。お金に余裕ができたら買ってみます。 話は変わるのですがHaskellのガベージコレクションは他の言語(java,ruby...) と比べて動作する機会がほとんどないと思うんですがどうでしょうか。 変数の宣言時にしか値を入れられなくて、グローバル変数とスタック上に 載せられるローカル変数でほとんど全てが賄えるなら どこからも参照されていないデータ(ガベージコレクタの対象になるデータ) ができるなんてことはまずないと思うんですが・・・
158 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 22:41:43 ] >>157 そんなことはない。遅延評価のために何でもかんでもヒープに割り当てないといけないので、 Haskellは平均的な言語よりずっと多くゴミを出す。 GHCでコンパイルしたプログラムなら、+RTS -Sstderrオプションをつけて実行すれば GCがどれくらい動いたかが分かる。 適当なプログラムで試してみたけど、約3秒の実行時間中にヒープから700MBほど確保し、 そのうち約9割は第0世代のGCで即座に捨てられてた。
159 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 22:45:57 ] 具体的に数字出されるとびっくりするなw
160 名前:デフォルトの名無しさん [2007/11/15(木) 22:47:23 ] 俺もびっくりしたwww
161 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 23:07:27 ] 700MB? 700mBの間違いじゃないのか
162 名前:デフォルトの名無しさん mailto:sage [2007/11/15(木) 23:15:22 ] 700*2^20 bytesね 741,834,476 bytes allocated in the heap 108,671,480 bytes copied during GC (scavenged) 2,030,404 bytes copied during GC (not scavenged) 13,955,072 bytes maximum residency (11 sample(s)) 1415 collections in generation 0 ( 0.55s) 11 collections in generation 1 ( 0.43s) 32 Mb total memory in use
163 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 01:10:19 ] やさしい Haskell 入門を今見ているんですが 4.4 遅延パターン www.sampou.org/haskell/tutorial-j/patterns.html での最初の例 reqs = client init resps resps = server reqs client init (resp:resps) = init : client (next resp) resps server (req:reqs) = process req : server reqs がどういう意味なのかさっぱりわかりませんorz どうして↑がだめで client init resps = init : client (next (head resps)) (tail resps) だとOKなんでしょうか?
164 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 02:19:04 ] >>162 これって瞬間最大メモリ使用量が700MBってこと?
165 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 02:50:58 ] うさのパソコンはメモリ256MB!
166 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 02:52:24 ] アプリ側がメモリ確保に成功しても、 OS側で本当に実メモリを消費したとは限らないから 調べないと分からないか。
167 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 03:27:46 ] >>164 アロケートされたメモリの数が700MBってことなのだが、実際はgeneration 0に割り当てられた少ないメモリが使いまわされているだけだから、メモリの使用量自体は少ないはず。
168 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 07:15:29 ] >>164 OSから確保したのが32MB 実際のヒープオブジェクトの総量が瞬間最大で13,955,072 bytes コピーGCだからOSから確保した領域の半分以下しか貯められない
169 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 17:49:52 ] StateモナドでunsafeInterleaveIO的な関数って書けますか? do xs <- interleaveState $ sequence $ replicate 3 get sequence $ map set xs で get set get set get setの順になるようなやつ
170 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 18:08:04 ] unsafe禁止令
171 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 18:26:23 ] xs <- sequence $ replicate 3 $ interleaveState get の間違いか? どっちにしても無理だろ
172 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 18:36:40 ] >>171 すいません、間違いでした 無理orz
173 名前:デフォルトの名無しさん mailto:sage [2007/11/16(金) 22:22:17 ] モナドと代数的データ型に的を絞って詳しく扱ってるテキストはないでしょうか
174 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 03:16:48 ] foo >>= bar としたときに実際に>>=がどのインスタンスに定義されている>>=の処理を行うのか、 というのはどうやって決まるんでしょうか?
175 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 07:11:03 ] >>174 型推論。fooの型とbarの型とその式の使われ方が勘案される。
176 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 11:11:46 ] >>175 それはコンパイル時と実行時のどちらでされるものなんでしょうか?
177 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 11:43:58 ] >>176 実行時
178 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 11:57:24 ] ・型推論自体はコンパイル時。 ・ただし、型クラスのディスパッチは実行時まで遅延される。 ・ただし、どのインスタンスについてのコードを生成すれば良いか静的に決まる場合は、 最適化の一環としてディスパッチを省略する。 こんな感じか。
179 名前:174 mailto:sage [2007/11/17(土) 12:49:35 ] >>177 、178 なるほど、静的に型をチェックしつつ、動作は動的に決まるんですね。 ところで 数学パズル ものまね鳥をまねる―愉快なパズルと結合子論理の夢の鳥物語 ttp://www.amazon.co.jp/%E6%95%B0%E5%AD%A6%E3%83%91%E3%82%BA%E3%83%AB-%E3%82%82%E3%81%AE%E3%81%BE%E3%81%AD%E9%B3%A5% E3%82%92%E3%81%BE%E3%81%AD%E3%82%8B%E2%80%95%E6%84%89%E5%BF%AB%E3%81%AA%E3%83%91%E3%82%BA%E3%83%AB%E3%81%A8%E7%B5% 90%E5%90%88%E5%AD%90%E8%AB%96%E7%90%86%E3%81%AE%E5%A4%A2%E3%81%AE%E9%B3%A5%E7%89%A9%E8%AA%9E-%E3%83%AC%E3%82%A4%E3% 83%A2%E3%83%B3%E3%83%89-%E3%82%B9%E3%83%9E%E3%83%AA%E3%83%A4%E3%83%B3/dp/4627019017/ref=sr_1_9?ie=UTF8&s=books&qid=1195271100&sr=1-9 この本を読んだことがある人いますか?関数プログラミングの土台の考え方がわかる本らしいんですが。
180 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 13:28:59 ] >>179 途中まで読んだだけだけどコンビネータの話。 S,K,I とか。Yコンビネータも出てきたかは覚えてない。
181 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 16:07:56 ] a 1 = "hoge" a 2 = 2 のような引数によって異なる型の値を返すことはOKなんでしょうか?
182 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 16:22:37 ] >>181 template haskell
183 名前:デフォルトの名無しさん mailto:sage [2007/11/17(土) 16:25:26 ] >>181 ダメ