1 名前:デフォルトの名無しさん [04/02/10 22:16] Haskellの公式HP www.haskell.org/ 日本語サイト www.sampou.org/cgi-bin/haskell.cgi www.teu.ac.jp/kougi/koshida/Prog6/index.html 過去ログ、関連スレは>>2-5
528 名前:デフォルトの名無しさん mailto:sage [2005/04/23(土) 23:02:55 ] FP ってなんですか?
529 名前:デフォルトの名無しさん mailto:sage [2005/04/24(日) 00:06:54 ] 一時期流行った自分視点のゲームだろ
530 名前:デフォルトの名無しさん mailto:sageネタをネタと(ry [2005/04/24(日) 13:13:48 ] そりゃFPSだ。 動的計画法のことだろ?
531 名前:デフォルトの名無しさん mailto:sage [2005/04/24(日) 18:54:43 ] Functional Programmingのことかと思った。
532 名前:デフォルトの名無しさん mailto:sage [2005/04/24(日) 21:37:20 ] > 動的計画法のことだろ? それはDP(dynamic programming)
533 名前:デフォルトの名無しさん mailto:sage [2005/04/24(日) 23:26:26 ] わかりにくいネタでごめん
534 名前:デフォルトの名無しさん mailto:sage [2005/04/25(月) 20:31:20 ] まじでどこで連載してるのか教えてくれ
535 名前:デフォルトの名無しさん mailto:sage [2005/04/25(月) 20:56:53 ] 情報処理学会誌ですね。 久しぶりにビニールを開けてみました。 相変わらず読むところが少ない…。
536 名前:デフォルトの名無しさん mailto:sage [2005/04/27(水) 11:28:18 ] 辛ければヨーグルトを使う
537 名前:デフォルトの名無しさん [2005/04/29(金) 15:38:56 ] GHCがpanicっていってコンパイル止まったよ。 間違ったソースの中には対応しきれないものがあるようだ。
538 名前:デフォルトの名無しさん mailto:sage [2005/04/29(金) 16:42:43 ] >>537 嘘はいけない。ghcにバグはない。
539 名前:デフォルトの名無しさん mailto:sage [2005/04/29(金) 16:49:25 ] ghc のバグじゃなくてコンパイルするソース側の
540 名前:デフォルトの名無しさん [2005/04/29(金) 16:57:37 ] >嘘はいけない。ghcにバグはない。 なんか凄い事聞いた気がする。 ほんと?
541 名前:デフォルトの名無しさん mailto:sage [2005/04/29(金) 18:00:14 ] ほんとにそうならghcのwebにバグレポートのリンクがあったりしないべ。
542 名前:デフォルトの名無しさん mailto:sage [2005/04/29(金) 18:49:30 ] Financial Planner
543 名前:537 [2005/04/29(金) 21:25:14 ] ほんとだよ。GHC cannot process input file. please report this to us とか出たもの。 もちろんソースは正しくないやつなんだが、それでもコンパイラが適切なエラーメッセージを 出せずに止まったことは事実。
544 名前:デフォルトの名無しさん mailto:sage [2005/04/29(金) 22:13:13 ] ああ、拡張機能や新機能を使うと稀に起こるよ、panic。 ちゃんと報告してあげて下さい。
545 名前:デフォルトの名無しさん mailto:sage [2005/04/30(土) 18:45:06 ] 例のHaskell連載って公開してるんだね www.ipsj.or.jp/07editj/promenade/
546 名前:デフォルトの名無しさん [2005/04/30(土) 19:44:34 ] ハスケル!ハスケル!
547 名前:デフォルトの名無しさん mailto:sage [2005/04/30(土) 21:27:04 ] _ ∩ ( ゚∀゚)彡 ( ⊂彡 | | し ⌒J
548 名前:デフォルトの名無しさん [2005/05/01(日) 20:14:08 ] LISP Macro みたいなことできますか? -- dotimes :: n -> (n -> IO()) -> IO() dotimes n f = __dotimes 0 where __dotimes i | i >= n = return () | otherwise = do (f i) __dotimes (i + 1) -- dotimes 10 ( \x -> putStr (show x)) こんなもの?
549 名前:デフォルトの名無しさん mailto:sage [2005/05/01(日) 23:02:28 ] 遅延評価だし、アクションが第一級の対象だから、 全ての関数がマクロであるようなものじゃないか?
550 名前:549 mailto:sage [2005/05/01(日) 23:05:09 ] なんかピントの外れたことを言ったな。 誰かフォローよろしく。
551 名前:デフォルトの名無しさん mailto:sage [2005/05/01(日) 23:19:07 ] dotimes' n f = sequence_ [ f n' | n' <- [0..n-1] ] main = dotimes' 10 (putStr.show)
552 名前:無理です。 mailto:sage [2005/05/01(日) 23:20:58 ] 例えばhaskellのif if p then c else a は、 case p of True -> c False -> a の構文糖衣とみなせる。逆でもよい。 マクロの代わりになるかどうかは、自分のifをcaseで定義できるかどうかを 考えてみればわかる。 myif mycase さあどうぞ。
553 名前:デフォルトの名無しさん mailto:sage [2005/05/01(日) 23:29:12 ] myif :: Bool -> a -> a -> a myif p c a = case p of True -> c; False -> a でいいんじゃないのか?
554 名前:デフォルトの名無しさん mailto:sage [2005/05/01(日) 23:37:45 ] >>553 thenとかelseはどこいった?
555 名前:デフォルトの名無しさん mailto:sage [2005/05/01(日) 23:43:22 ] シンタックスを定義できなてもマクロと言えると思うが。
556 名前:デフォルトの名無しさん mailto:sage [2005/05/01(日) 23:49:16 ] ↑それで消費者が納得すると思ってんのか?
557 名前:デフォルトの名無しさん mailto:sage [2005/05/01(日) 23:52:37 ] >>555 関数マクロと言うべきか。 >>548 の回答としては、 Q.LISP Macro みたいなことできますか? A.できません。
558 名前:デフォルトの名無しさん mailto:sage [2005/05/02(月) 00:05:54 ] haskellでは a `lambda` (a + 1) の様な表現ができないのが本質的っぽいね。
559 名前:デフォルトの名無しさん mailto:sage [2005/05/02(月) 00:11:04 ] つまり、遅延であろうがなかろうが、LISPのようなマクロを書けるかどうかは 引数評価を自分でコントロールできるかどうかにある。 少なくともLISPのマクロ内に出てくるシンボルみたく、引数の一部を 評価せずにキーワードそのものとして扱うみたいな仕組みがないと。
560 名前:デフォルトの名無しさん mailto:sage [2005/05/02(月) 00:25:50 ] 「遅延評価」の意味で「評価」と言うと意味が違うと思う。 引数の評価をコントロールするだけならhaskellでもできる。 「解釈」と言えばいいのかな?
561 名前:デフォルトの名無しさん mailto:sage [2005/05/02(月) 00:39:06 ] LISPのマクロはdefineを含むコードを生成できるけど、Haskellではそのような真似はできないはず。
562 名前:デフォルトの名無しさん mailto:sage [2005/05/02(月) 13:13:17 ] HaXmlで下のinputからoutputのような出力を得たいんですがどのようにすれば 良いでしょうか? ---input--- <function name='deleteBy' type='(a -> a -> Bool) -> a -> [a] -> [a]'> <description> similar to <f>delete</f>, but it allows the programmers to supply their own equality test </description> ---output--- ["deleteBy", "similar to delete, but it allows the programmers to supply their own equality test"] <description>の中の<f>の処理がうまく行かず下のような結果になってしまい ます。<description>の中のテキスト部分だけを抜き出したいです。別リスト にしないで1つの文字列として。 ["deleteBy", "similar to ", "delete", ", but it allows the programmers to supply their own equality test"]
563 名前:562 mailto:sage [2005/05/02(月) 13:22:01 ] コードとサンプルデータを載せます。 import System.IO import System.Environment import Text.XML.HaXml import Text.XML.HaXml.Pretty (content) main :: IO () main = do ~[arg] <- getArgs h <- openFile arg ReadMode str <- hGetContents h case xmlParse "list.xml" str of (Document _ _ (Elem _ _ contents)) -> mapM_ print $ map getCont contents getCont = map content . contFilter contFilter :: CFilter contFilter = f `o` (tag "function") f = cat [ ("name"?) , multi txt `o` (keep /> tag "description") ]
564 名前:562 mailto:sage [2005/05/02(月) 13:22:59 ] <module name="List"> <function name='deleteBy' type='(a -> a -> Bool) -> a -> [a] -> [a]'> <description> similar to <f>delete</f>, but it allows the programmers to supply their own equality test </description> <example> <in>deleteBy (\x y -> y `mod` x == 0) 4 [6,8,10,12]</in> <out>[6,10,12]</out> </example> </function> </module>
565 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 14:30:17 ] 今月の文章は先月の和田先生のよりわかりにくいなあ。 例題をどう解くかの説明が全くなくて、説明もHaskellの説明にはなってるけど 例題のプログラムの説明としてはかなり端折られてるのが原因かな。
566 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 22:34:11 ] バイナリファイルを弄りたいんですけど Haskellでビット演算の関数とか演算子とか あれば教えてください。
567 名前:デフォルトの名無しさん mailto:sage [2005/05/17(火) 23:38:07 ] :browse Bits
568 名前:デフォルトの名無しさん mailto:sage [2005/05/18(水) 22:14:20 ] >>567 ありがとうっす
569 名前:デフォルトの名無しさん [2005/05/20(金) 23:02:42 ] モナドって全然わかない
570 名前:デフォルトの名無しさん mailto:sage [2005/05/20(金) 23:16:00 ] ↑日本語もわかない人
571 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 01:33:08 ] 最近自分は悟った。 モノイドとか圏論とかの背景思想を無視して 使う立場だけからいうと モナドは数珠繋ぎ強制ギプスみたいなものだと。 (IO Char)とか(IO Int)とかの型は CharやIntの値がくるまれたカプセルみたいなもんだ。 ちなみにIO ()の()はCでいうvoid型 return xx とやると普通の値もIOモナドで包むことができる。
572 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 01:33:49 ] ただしIOモナドは一度くるんだら中身を取り出す方法がない。 IO型の関数を普通の関数と組み合わせても型違いで コンパイルエラーになる。 (IO ()ももちろん型違いでエラー) そこでモナドの中身の値を 橋渡しするアダプタ(>>=)を使う。 結局>>=や>>で(IO xxx)型の関数同士やreturn xxで 数珠繋ぎにするしかないように強制される。
573 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 01:42:17 ] そいつは面倒だあ
574 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 01:43:08 ] IOモナドってGPLみたいだなとか思った。
575 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 01:48:49 ] 数珠つなぎのしくみや値を包みこむ性質を利用して 他にもいろいろなモナドがあるし自分でも作れる(かもしれない) Stateモナドは数珠繋ぎを利用して IOモナドみたいな状態遷移を自分で作れる。 Maybeモナドは値を包むほうが主眼のモナド 実際の値の代わりにNothingというダミーを 突っ込んでおくことができる。 データベースのNULL値みたいに使える。
576 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 01:57:53 ] モナドと聞くと王監督の顔が思い浮かぶのは何故?
577 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 02:24:06 ] >>571 >CharやIntの値がくるまれたカプセルみたいなもんだ。 俺にはこの表現がなじまない。 カプセルってのは中身が取り出せてこそのものだよな。 だから、「CharやIntにに関係する何か」くらいの認識しかできない。
578 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 12:13:59 ] 自分でIO型の関数作れば 前のIO関数から>>=で渡された 中身の生の値をちゃんと自由に扱える。 「取り出す方法が無い」んじゃなくて 「>>=を使って(間接的に)取り出すしか方法が無い」が 正しいかも。
579 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 12:15:56 ] monadic I/Oの意味論を破壊して喜ぶって、マゾですか?
580 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 12:16:44 ] そーゆーのには、 C言語とアセンブラがお勧め(w
581 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 12:30:25 ] >576 ワロス 俺も思いついた
582 名前:デフォルトの名無しさん [2005/05/21(土) 16:33:47 ] もな〜ももなど?
583 名前:デフォルトの名無しさん [2005/05/21(土) 20:30:44 ] >>549 そのとおりだよね。
584 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 20:44:49 ] >>583 だからー、 その件はLISPマクロのようには書けないって話だろーが
585 名前:デフォルトの名無しさん [2005/05/21(土) 21:04:10 ] >>559 名前渡し?遅延評価ってそういうことなのでは?
586 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 21:12:59 ] 名前をキーワードとして扱う?CLtL4の仕様ですか?w
587 名前:566 mailto:sage [2005/05/21(土) 21:23:20 ] 某バイナリファイルのヘッダ構造体の読み込み関数が だいたい目処がたってきますた。 ところでdata宣言で作った構造体?にたいする Javaのシリアライズみたいな仕組みやライブラリって Haskellにはないんすかね? リフレクションみたいな仕組みがないと無理? ファイルフォーマットをリストで与えて結果もリストで返すみたいなのは できそうだけどそれじゃせっかくの強力な型システムが活かせないような、、
588 名前:デフォルトの名無しさん [2005/05/21(土) 21:25:51 ] >>585 あ、違うか 名前渡してないもんね 普通の意味の値の他に名前も値にできるようでないと圏論的には不完全なようなキガス
589 名前:デフォルトの名無しさん [2005/05/21(土) 21:28:21 ] とゆーことは変数のポインタでいいのかどうか
590 名前:デフォルトの名無しさん mailto:sage [2005/05/21(土) 21:39:32 ] >圏論的には不完全 というと?
591 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 16:51:02 ] ちょっと質問です。 二項関係 r の反射的・対称的・推移的閉包に (x,y) が属するかどうかを判定する関数 inEqvCl ってのを書いてみたんですけど、もうちょっとすっきりした書き方とかないでしょうか? inEqvCl :: Eq a => (a,a) -> [(a,a)] -> Bool inEqvCl _ [] = False inEqvCl (x,y) s = chk s y x where chk lst v u | v == u = True | v `elem` ux = True | otherwise = or $ map (chk lst' v) ux where lst' = [ p | p <- lst, u /= fst p, u /= snd p ] ux = do p <- lst if u == fst p && u /= snd p then return $ snd p else if u == snd p && u /= fst p then return $ fst p else fail "" 実行例 (2,1) `inEqvCl` [(0,2),(3,4),(5,4),(1,5),(5,0),(6,7),(8,7)] => True (1,6) `inEqvCl` [(0,2),(3,4),(5,4),(1,5),(5,0),(6,7),(8,7)] => False
592 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 21:57:54 ] >>591 こんなのでどうかな。 題意を理解していないので間違ってたらスマソ import List inEqvCl :: Eq a => (a, a) -> [(a, a)] -> Bool inEqvCl _ [] = False inEqvCl (x, y) s | x == y = True | y `elem` ns = True | otherwise = any con ns where ns = map snd $ filter ((==x) . fst) exts exts = s ++ map (uncurry $ flip (,)) s con n = inEqvCl (n, y) (s\\[(x, n), (n, x)])
593 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 22:23:13 ] 面白そうなのでオレもやってみた。 -- 同値類のリストを算出 classify :: Eq a => (a, a) -> [[a]] -> [[a]] classify (x, y) [] = [[x, y]] classify (x, y) (c : cs) | x `elem` c = (y : c) : cs | y `elem` c = (x : c) : cs | otherwise = c : classify (x, y) cs inEqvCl :: Eq a => (a, a) -> [(a, a)] -> Bool inEqvCl (x, y) lis = (not . null) (filter (f x y) (foldr classify [] lis)) where f x y c = x `elem` c && y `elem` c いろいろ最適化の余地があるが。
594 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 22:32:57 ] あ、>>593 間違ってるわ。これだと [(3, 4), (1, 3), (2, 4)] とかで うまくいかない。
595 名前:591 mailto:sage [2005/05/22(日) 22:42:11 ] >>592-594 ありがとうございます。 やっぱり短く書けるんですね。
596 名前:デフォルトの名無しさん [2005/05/23(月) 22:10:44 ] 無限のリストだと止まらなくなるかな
597 名前:シミュレーション板GPスレから来ました [2005/05/24(火) 01:12:59 ] PolyGP: A Polymorphic Genetic Programming System in Haskell ↑のプログラムソース PolyGP.tar って、uclのサイトから消えている様ですが、 どこかにバックアップないでしょうか? よろしく、おながいします。
598 名前:591 mailto:sage [2005/05/24(火) 05:44:25 ] とりあえず問題が2つありました。 1. 反射的閉包なんで、inEqvCl (x,x) [] == Trueにならないといけない。 >>592 さんのからinEqvCl _ [] = Falseを取り除けばOK。 2. (\\)は最初の1つしか取り除かないので、最初の集合に対称なものがあると拙い。 (\\)の代わりに下の(//)を使って対処。 (//) :: Eq a => [a] -> [a] -> [a] xs // ys = [ x | x <- xs, x `notElem` ys ] >>596 無限リストは今回は対象外なので問題ないです。(^^;
599 名前:デフォルトの名無しさん mailto:sage [2005/05/27(金) 00:42:11 ] Haskellの配列の更新(//)は一部変更でも配列全部作り直したり してるんですか? リングバッファとかに使っても大丈夫ですか?
600 名前:デフォルトの名無しさん mailto:sage [2005/05/27(金) 01:42:54 ] 600
601 名前:599 mailto:sage [2005/05/27(金) 22:02:30 ] >>599 自己レス ttp://d.hatena.ne.jp/tanakh/20040809#p1 ここみるとだめっぽい感じでした GCが仕事してくれること期待して 配列ガシガシ使い捨てにでもするか
602 名前:デフォルトの名無しさん mailto:sage [2005/05/27(金) 22:21:03 ] いつまでたっても関数型のボトルネックだな>配列・構造体 これが解決しない限り関数型が栄えることは無い
603 名前:デフォルトの名無しさん mailto:sage [2005/05/27(金) 22:21:57 ] 俺達でwadlerを唸らせる解を考えよう
604 名前:デフォルトの名無しさん [2005/05/28(土) 01:00:55 ] 配列も、マクロな視点で見ればただの変数に変わりない だから、修正された瞬間複製するのが妥当な戦略だろう しかし、オリジナルが参照されないとわかっているなら複製する必要ないから複製を省略する。 ここまで考えてふと思いついた。 すなわち差分をもっとけばいいんじゃないかと。 配列n番目更新しますた!更新しますた!という情報を各インデクス毎に持っとくわけよ 配列を全て更新しおわたとしても、またさらに更新するかもしれない その場合はまたその差分を作るわけよ するとどうだい? 差分として分解された各配列の要素はまるでりすt(ry おれには難しすぎたようだ!
605 名前:デフォルトの名無しさん mailto:sage [2005/05/28(土) 01:13:09 ] >>602 Uniqueness Typing
606 名前:デフォルトの名無しさん [2005/05/28(土) 05:03:54 ] 配列や構造体もモナドにしたら?
607 名前:デフォルトの名無しさん mailto:sage [2005/05/28(土) 08:38:44 ] starray とかいうモナドがあると聞いたが 漏れは調べてないので諸君調べて報告してくれ
608 名前:デフォルトの名無しさん mailto:sage [2005/05/28(土) 11:15:19 ] マクド
609 名前:デフォルトの名無しさん mailto:sage [2005/05/28(土) 13:50:31 ] >>606 つIOUArray
610 名前:デフォルトの名無しさん [2005/05/28(土) 14:11:18 ] 伝説のモナド
611 名前:デフォルトの名無しさん [2005/05/28(土) 14:23:54 ] ナボナ@亀屋万年堂 www.navona.co.jp/ これのことでしょ?
612 名前:デフォルトの名無しさん [2005/05/28(土) 20:20:45 ] >>607 それはスタレイました
613 名前:デフォルトの名無しさん [2005/05/28(土) 20:52:42 ] >>28 で紹介されているrrr.jin.gr.jp/ のRWikiがNot Foundで見れません。 どうしたらよかとですか?
614 名前:613 mailto:sage [2005/05/28(土) 20:54:47 ] 自己解決しました。 ://pub.cozmixng.org/~the-rwiki/rw-cgi.rb にありました。
615 名前:デフォルトの名無しさん [2005/05/30(月) 20:59:12 ] ハスケルを勉強したい時にはどうしたらいいですか? 日本語の丁寧なチュートリアル文献がありますか? >>1 のは難しいですよ
616 名前:デフォルトの名無しさん mailto:sage [2005/05/30(月) 21:15:20 ] >>615 1. haskellで適当なコードを書く 2. -ddump-realCをつけてコンパイル 3. 1と2の結果を見比べる
617 名前:デフォルトの名無しさん mailto:sage [2005/05/30(月) 21:46:39 ] >>615 ttp://www.geocities.jp/shido_takafumi/hs/index_hs.html とか。
618 名前:デフォルトの名無しさん mailto:sage [2005/05/30(月) 22:05:26 ] >>616 これなかなか良いね。
619 名前:デフォルトの名無しさん mailto:sage [2005/05/30(月) 22:21:34 ] >>615 www.sampou.org/cgi-bin/haskell.cgi?Programming%3aWayToHaskeller&l=jp とかはどう?
620 名前:デフォルトの名無しさん mailto:sage [2005/05/30(月) 22:29:19 ] >>616 Cに落とさなくてもcore言語レベルでいいんじゃない?
621 名前:デフォルトの名無しさん [2005/05/31(火) 09:34:43 ] mona do !
622 名前:デフォルトの名無しさん [2005/06/02(木) 00:38:18 ] monadius
623 名前:sage [2005/06/02(木) 14:55:24 ] Hugsなんだけど Main> -1 ってやると -1 Main> ( - 1) 2 とやると ERROR - Unresolved overloading *** Type : (Num a, Num (a -> b)) => b *** Expression : fromInt (-1) 2 んん?(-) は単項演算子なのか!? しかしMain> ( - ) 1 2 とやると -1 とかえってくる。 (-)は二項演算子ってことになってるんじゃなかったのか!? www.sampou.org/haskell/tutorial-j/numbers.html >negate は Haskell では唯一採用された前置演算子です。 >これを (-) と書くことはできません。 >それは、こう書けば、減算関数になってしまうからです。 どうなってるの?>識者の方々
624 名前:デフォルトの名無しさん mailto:sage [2005/06/02(木) 15:56:22 ] -1 (- 1) (- 1) 2 の - はnegateのことで単項演算子 (-) 1 2 ((-) 1) 2 (1 -) 2 1 - 2 の - は二項演算子
625 名前:デフォルトの名無しさん mailto:sage [2005/06/02(木) 17:54:00 ] >>624 それって上の引用の記述と矛盾してないかって事。 HugsはHaskell98モードでも再現したよ。 上の記述が古いのかHugsの独自仕様なのか、、、 実際-1と書けたほうが便利だけどね。 一瞬 「(\x -> x - 1) を 自動的に -1 に変換してるのかHaskell凄えな」 と思ったけど 型が全然違うし。
626 名前:デフォルトの名無しさん mailto:sage [2005/06/02(木) 19:21:51 ] 括弧のついてない - はその直前に第1引数になるものがなければ単項演算子として解釈されるってだけなんじゃないの。
627 名前:デフォルトの名無しさん mailto:sage [2005/06/02(木) 20:15:18 ] >>623 原文は >negate is the function applied by Haskell's only prefix operator, minus; we can't call it (-), because ... だから、誤訳かと。 一応報告しておいた。
628 名前:デフォルトの名無しさん [2005/06/02(木) 23:01:09 ] >>625 >それって上の引用の記述と矛盾してないかって事。 どこが?