1 名前:デフォルトの名無しさん mailto:sage [2017/01/15(日) 23:43:54.28 ID:Vh4eztBk.net] 関数型プログラミング言語 Haskell について語るスレです。 haskell.org (公式サイト) www.haskell.org/ 前スレ 関数型プログラミング言語Haskell Part28 echo.2ch.net/test/read.cgi/tech/1428597032/
692 名前:デフォルトの名無しさん mailto:sage [2017/06/14(水) 00:01:03.56 ID:ZT/uD64c.net] ideoneやpaiza.ioのようにhaskellコードのコンパイルと実行を同時にしてくれるようなローカルアプリはありますか? 補完とかはなくてもいいですし、exeも生成しなくていいのですが
693 名前:デフォルトの名無しさん mailto:sage [2017/06/14(水) 00:24:00.03 ID:VydZF3sS.net] ["aa","bb",f["cc","dd"]]=["aa","bb","cc","dd"]なるfが存在しないことは、 チャーチ・ロッサー性で説明できる。 チャーチ・ロッサー性は、簡単に言うと、計算の順番を変えても 最終的な計算結果が変わることが無いという性質。 もし上記のようなfがあるとすると、以下の2つの式の計算結果が同じでなければならない。 なぜなら、これら2つの式は、一番内側のfを先に計算するかどうかの違いしかないから。 null(tail(tail(tail ["aa","bb",f["cc","dd"]]))) null(tail(tail(tail ["aa","bb","cc","dd"]))) しかし、計算すればわかるが、上はtrueで下はfalseになるので矛盾する。 よってfは存在し得ない。 本当は、型なしラムダ計算に落としこんでからやる必要があるけど、 (型なしラムダ計算にチャーチ・ロッサー性があることは証明済み) 骨子としてはこんな感じ。
694 名前:デフォルトの名無しさん [2017/06/14(水) 00:35:10.46 ID:Ei72hKB9.net] 要するにLispのマクロの ,@ みたいな展開をしたいってことか?
695 名前:デフォルトの名無しさん mailto:sage [2017/06/14(水) 02:36:17.24 ID:jR7LtVt0.net] >> 683 まあ、こういうデータ構造なんか既視感あるよなと思ったら、リストじゃなくてツリーだよね つうか Data.Tree がまんまそれ
696 名前:デフォルトの名無しさん mailto:sage [2017/06/14(水) 05:34:36.84 .net] >>681 ↑ この人強そう
697 名前:デフォルトの名無しさん [2017/06/14(水) 09:21:04.82 ID:Zur2LRZk.net] >>678 >関数fの型によるけどその出力がStringなら["a","b",f ["c","d"]] の型はもちろん[String]だね。 そこまで分かってて、f ["c","d"]が単一のStringにならざるを得ない。 つまり ["a","b","c","d"] ではなく、 ["a","b","cd"] の様な単一の値としてしか返りようがないって分かるだろ。 あれか、複数の値を返せってか。 従来の値が欲しい方はどうすんだよ。
698 名前:デフォルトの名無しさん mailto:sage [2017/06/14(水) 09:53:35.84 ID:dwFQOh88.net] >>679 > 他の言語だと[Any] なListがあったりするけど(例えばScala) > よくあんなの使うなーって思う その例は極端すぎる。Anyは論外。型の否定と
699 名前:ッじ。(Scalaも推奨はしてないと思うが) > fがどんな値を返そうと左辺は要素が3のリストで ふつうに考えてそうだよね。 そこを以下のように暗算して、できるかと思っちゃった。 f[x, y] = x : [y] とすると、 [a, b, f[c, d]] = a : b : (c : [d]) = a : b : (c : d : []) = a : b : c : d : [] = [a, b, c, d] >>680 というわけで、ここは俺が暗算で頭の体操してミスってた。 優しく拒否してもらったがスマンw >>686 > ["aa","bb",f["cc","dd"]]=["aa","bb","cc","dd"]なるfが存在しないことは、 > チャーチ・ロッサー性で説明できる。 折角だが今の件はチャーチ・ロッサー性(合流性)は関係ないと思う。 合流性以前の到達性が問題なので。 [] [ここ壊れてます]
700 名前:デフォルトの名無しさん mailto:sage [2017/06/18(日) 12:36:58.87 ID:P8yIezdD.net] 配列xsとysと引数を2つ取る関数gがあって、 f g xs ys = map (\x -> map (g x) ys ) xs となるような関数fってあったりしますか? 例えば f (+) [1,2,3] [4,5,6] = [ [5,6,7], [6,7,8], [7,8,9]] となるような関数です
701 名前:デフォルトの名無しさん mailto:sage [2017/06/18(日) 12:50:16.34 ID:aJwV86NO.net] >>692 hoogle で調べてみても、それっぽいものが見当たりませんね。 少なくとも標準ライブラリにはありません。 なので、その定義に自分で適当に名前を付けて使ってください。
702 名前:デフォルトの名無しさん mailto:sage [2017/06/18(日) 12:56:47.67 ID:P8yIezdD.net] >>693 ありがとうございます ないならないで問題ありません たまに使うのですが、既にあるならわざわざ定義するのも無駄だなと思っただけなので
703 名前:デフォルトの名無しさん mailto:sage [2017/06/18(日) 15:28:29.26 ID:sgvQsVTs.net] >>692 f g xs ys = concatMap (¥x -> map (g x) ys ) xs でいいなら(つまりリストを1段階潰していいなら)あるよ。 g <$> xs <*> ys がその答え。
704 名前:デフォルトの名無しさん [2017/06/18(日) 17:41:11.73 ID:VE2N9ory.net] >>692 zipWithに配列の配列渡せば行けるか?と書いてみた。 zipWith (map.(+)) [1,2,3] $ repeat [4,5,6] うん。 素直に関数作った方がいいね。 リスト内包表記なら分かりやすいと思う。 f g xs ys = [map (g x) ys | x <- xs]
705 名前:デフォルトの名無しさん [2017/06/18(日) 17:41:54.37 ID:VE2N9ory.net] x配列の配列 oリストのリスト
706 名前:デフォルトの名無しさん mailto:sage [2017/06/18(日) 22:40:07.66 ID:3urB1Yg8.net] これで行けるよ。 f x = fmap . (. (:[])) . liftA2 x f (+) [1,2,3] [4,5,6] [[5,6,7],[6,7,8],[7,8,9]]
707 名前:デフォルトの名無しさん mailto:sage [2017/06/19(月) 05:32:16.99 ID:DP5W49kg.net] そういう関数ってすでにある?って質問なのにオレオレ実装載せてく人たち…
708 名前:デフォルトの名無しさん mailto:sage [2017/06/19(月) 06:40:21.02 ID:iu3OXdki.net] しかも、質問者の実装が一番素直で分かりやすい
709 名前:デフォルトの名無しさん mailto:sage [2017/06/19(月) 07:45:05.62 ID:f7LtpRLv.net] 隙あらば実装 いや、プログラム板ではそれでいいんじゃないか。
710 名前:デフォルトの名無しさん mailto:sage [2017/06/19(月) 10:22:09.65 ID:Gx/WCs0N.net] 組み込みの関数でラムダ式を隠蔽してしまうことには意味があるんじゃないか ところで質問者の例だと結果が可換なのでそうじゃない例の方が良かったのでは f (+) [1, 2, 3] [1, 3, 5] -> [[2,4,6],[3,5,7],[4,6,8]] f (+) [1, 3, 5] [1, 2, 3] -> [[2,3,4],[4,5,6],[6,7,8]] とか
711 名前:デフォルトの名無しさん mailto:sage [2017/06/19(月) 10:46:07.27 ID:6iW/OLTz.net] >>702 それならば、あなたはどのような意味を見いだしたのかまでちゃんと言わないと。 何にどのような意味を見いだすかは人それぞれですし。 私は、ソースは人間が読みやすい事に最大の意味を見いだします。 なので、計算結果を容易に想像できるという点で、 >>692 や >> 696 の下の定義は好きですね。
712 名前:デフォルトの名無しさん mailto:sage [2017/07/01(土) 02:37:46.49 ID:JHLae2yG.net] IOモナドは命令書という喩えが一番しっくり来た
713 名前:デフォルトの名無しさん [2017/07/01(土) 08:12:10.07 ID:yvgbUlYU.net] IOモナドっつーか、モナドは難しく考えんで良いだろと。 IO String >>= String IO String >> は結果を捨てる。>>= ¥_ -> の略記。 return String ってしたらIOなString返るから、return使えばモナドの途中で純粋な関数で加工出来る。 それがIOモナドにも具体的な型にも依存しない汎用的な表現が m a >>= a ってだけ。 これだけ覚えれば使うにゃ十分だし、使ってるうちにただの型クラスやってわかる。 結局型クラスも型を受け取れる型ってだけで、ただの型でもあるから、純粋関数の結果としてString返すと、IO StringとStringは型が違うよって怒られる。 だからIO Stringにする為にIO Stringな関数か、return使いましょうってだけ。 具体的な型を考えれば何のことはない。 returnはそう考えればまあ自然なんだが、リターンってよりレシーブって印象。
714 名前:デフォルトの名無しさん [2017/07/01(土) 09:35:49.67 ID:yvgbUlYU.net] main = getLine >>= return.tail >>= putStrLn getLine 一行入力でIO String生成。 >>= getLineに生成されたIO StringをStringとして右辺に渡す。 return.tail tailは受け取ったStringの先頭を省く。 そのままだとStringのままで、IO Stringを受け取る次の>>=に渡せないので、returnでStringをIO Stringにして返す。 >>=(2番目) 最終出力のputStrLnに向けてIO StringをStringにして渡す。 putStrLn 受け取ったStringを改行付き出力。 説明のために長く書いたけど、型を揃えれば良いって分かればこうも書ける。 main = getLine >>= putStrLn.tail 何もないところからIOを生成するmain = 直後の関数以降は基本的に純粋な型を受け取ってIOな型を返せばコンパイラ通るので、何の役にも立たないけどこれもコンパイル通る。 main = getLine >>= return.tail putStrLnも関数である以上、何らかの値を返してるので見ようと思えば見れる。 main >>= putStrLn.tail >>= print ()にIOを付けたIO ()が返ってると分かる。
715 名前:デフォルトの名無しさん mailto:sage [2017/07/01(土) 10:27:56.55 ID:8Dk+ywm5.net] IOと純粋関数の関係がどうしても理解できなかったけどwiki読んだらやっとわかったからオススメ https://wiki.haskell.org/IO_inside
716 名前:デフォルトの名無しさん mailto:sage [2017/07/03(月) 20:20:17.13 ID:n7+jlCYi.net] stack使ってるのですが、openFileでカレントディレクトリ以外のファイルを指定って出来ないんですかね?
717 名前:デフォルトの名無しさん [2017/07/03(月) 20:31:50.76 ID:UwBLUxpl.net] stack関係あったっけ? 何となく¥を¥¥ってしてないだけじゃないかと予想。
718 名前:デフォルトの名無しさん mailto:sage [2017/07/08(土) 21:56:26.43 ID:A29giBA8.net] タプル作ろうと思ってHoogleで f :: a -> b -> (a, b) f a b = (a, b) となるような関数探したら見つからないんだけどもしかしてない? 割と使いそうなイメージなんだけど
719 名前:デフォルトの名無しさん mailto:sage [2017/07/08(土) 22:11:48.22 ID:TJZt+GMQ.net] どういうときに使いたいのさ curry/uncurry ならたまに使うけど
720 名前:デフォルトの名無しさん mailto:sage [2017/07/08(土) 22:18:49.21 ID:ZOCy/rmL.net] これで https://wandbox.org/permlink/bSFTBbmr9cQGguSw
721 名前:デフォルトの名無しさん mailto:sage [2017/07/08(土) 22:48:00.26 ID:Tq0FsZsH.net] >>710 タプルコンストラクタ $ ghci GHCi, version 8.0.2: www.haskell.org/ghc/ :? for help Prelude> :t ((,)) ((,)) :: a -> b -> (a, b)
722 名前:デフォルトの名無しさん mailto:sage [2017/07/08(土) 22:53:26.22 ID:AXnSyqoB.net] >>713 おお、まさにこれです ありがとうございます
723 名前:デフォルトの名無しさん [2017/07/10(月) 01:15:03.97 ID:IPU+pjhL.net] すみません traceデバッグについてですが ある変数に色とかで印を付けて IOとは別の専用簡易コンソールに出力表示とか 簡単に出来ない物でしょうか。
724 名前:デフォルトの名無しさん mailto:sage [2017/07/15(土) 19:13:14.12 ID:bXz+G42e.net] GHC 8.2 で実装予定の backpack なるものが一体 現在のどのような問題をどのように解決することを目指したものか、 分かる方いますか? どうも、モジュールシステムの拡張みたいですが...
725 名前:デフォルトの名無しさん [2017/07/17(月) 23:01:46.61 ID:4tJqH+Y+.net] ご冥福
726 名前:デフォルトの名無しさん mailto:sage [2017/07/18(火) 03:45:58.72 ID:6+yJKiYC.net] すぐりって読むのだと思ってました
727 名前:デフォルトの名無しさん [2017/07/19(水) 22:41:31.74 ID:BqP8obNe.net] https://twitter.com/tanakh/status/886624071005294592 これ?
728 名前:デフォルトの名無しさん mailto:sage [2017/07/21(金) 21:39:30.54 ID:kkMUVecO.net] 文字列のリストがあって、それぞれの要素を順番にputStrLnするだけならmapM_よりtraverse_の方がいいですか?
729 名前:デフォルトの名無しさん mailto:sage [2017/07/22(土) 10:13:22.40 ID:/BTLbKbr.net] Haskellerなんですぐ死んでしまうん
730 名前:デフォルトの名無しさん mailto:sage [2017/07/22(土) 11:57:08.36 ID:/9K4Ed3n.net] えぇ・・・
731 名前:デフォルトの名無しさん mailto:sage [2017/07/22(土) 14:53:16.39 ID:4NLvcjES.net] 必要以上に多相にしたり制約を弱めるのは典型的な bad practice concat のかわりに join 使ったりしないでしょ
732 名前:デフォルトの名無しさん mailto:sage [2017/07/22(土) 14:54:33.27 ID:4NLvcjES.net] ライブラリコード書くときには可能な限り型クラス制約を弱めて多相に 利用するコードではむしろ反対に
733 名前:デフォルトの名無しさん mailto:sage [2017/07/22(土) 17:58:06.65 ID:1dVz8HPB.net] >>723 つまりtraverse_の方がいいって認識でいいですか?
734 名前:デフォルトの名無しさん mailto:sage [2017/07/22(土) 19:58:53.32 ID:AuEOuo+E.net] Haskellerはマジでメンヘラが多い
735 名前:デフォルトの名無しさん mailto:sage [2017/07/22(土) 22:29:16.45 ID:wIG0mEjF.net] パフォーマンスモニターを提供する ekg というライブラリがあるんだが、 これ、なかなか凄いな。 統計情報がHTTPプロトコルでリアルタイムに提供されるから、 モニタリング専用のアプリを使わずとも普通のブラウザで見れる。 カウントするものをプログラムの中で定義することもできるみたいだし、 けっこう本格的だ。 パフォーマンスチューニングが捗りそう。 ちなみに、俺はこのライブラリの存在をここで知った。 www.stephendiehl.com/posts/production.html このブログポストに商業アプリ制作にHaskellを使う際の心得みたいなことが書かれていて、 Performance and Monitoring の項で ekg が紹介されている。 このブログの他のポストもなかなか面白いから暇人は読んでみるといいよ。
736 名前:デフォルトの名無しさん mailto:sage [2017/07/23(日) 00:17:34.21 ID:m+ryfkmk.net] >>725 ちょい待ち >>723 や >>724 のアドバイスに従うなら、そこは mapM_ でしょ
737 名前:デフォルトの名無しさん mailto:sage [2017/07/24(月) 20:13:14.08 ID:Rqhmx9U8.net] 他の言語の書き方が良くなると聞いて始めてみたが、難しい・・・ というか今のとこ恩恵が分かんない^^;
738 名前:デフォルトの名無しさん mailto:sage [2017/07/24(月) 20:20:07.13 ID:RBhDn3mI.net] 他言語の書き方は俺は良くなったな
739 名前:デフォルトの名無しさん mailto:sage [2017/07/24(月) 21:03:53.98 ID:h3biSAhr.net] 過去何度か似たような質問や意見が出てるが、 今までこういう書き方だったのがHaskellのお陰でこう改善された、 という具体例が挙がった試しがない。 改善例が載っているブログなどの紹介すらない。 俺の中では、前後の違いを明確に説明できないものは改善とは認められない。 原因がはっきりしない事はあるだろうが、改善したと言うからには 少なくとも違いははっきりと説明してほしい。 それができないと言う事は、きっと違いが説明できないほど微妙で曖昧な変化を 改善と言っているのだろう。
740 名前:デフォルトの名無しさん mailto:sage [2017/07/24(月) 21:22:17.61 ID:emVJufwa.net] いやそんなの最初からちゃんとやれよと思うかもしれんが非関数型の言語を触っているときに比べて入出力をはっきりと意識するようにはなった 特に動的型付けだと何も考えなくても動くだけのものは作れてしまうからな
741 名前:デフォルトの名無しさん mailto:sage [2017/07/24(月) 21:27:21.43 ID:jM5xaigZ.net] 大リーグ養成ギブスはめられてるような気持ち
742 名前:デフォルトの名無しさん mailto:sage [2017/07/24(月) 21:56:08.66 ID:RBhDn3mI.net] >>731 /: : : : : __: :/: : ::/: : ://: : :/l::|: : :i: :l: : :ヽ: : :丶: : 丶ヾ ___ /;,, : : : //::/: : 7l,;:≠-::/: : / .l::|: : :l: :|;,,;!: : :!l: : :i: : : :|: : ::、 / ヽ /ヽヽ: ://: :!:,X~::|: /;,,;,/: :/ リ!: ::/ノ l`ヽl !: : |: : : :l: :l: リ / そ そ お \ /: : ヽヾ/: : l/::l |/|||llllヾ,、 / |: :/ , -==、 l\:::|: : : :|i: | / う う 前 | . /: : : //ヾ ; :|!: イ、||ll|||||::|| ノノ イ|||||||ヾ、 |: ::|!: : イ: ::|/ な 思 が /: : ://: : :ヽソ::ヽl |{ i||ll"ン ´ i| l|||l"l `|: /|: : /'!/l ん う ∠: : : ~: : : : : : : :丶ゝ-―- , ー=z_ソ |/ ハメ;, :: ::|. だ ん i|::ハ: : : : : : : : : : : 、ヘヘヘヘ 、 ヘヘヘヘヘ /: : : : : \,|. ろ な |!l |: : : : : : : : :、: ::\ 、-―-, / : : :丶;,,;,:ミヽ う ら 丶: :ハ、lヽ: :ヽ: : ::\__ `~ " /: : ト; lヽ) ゝ レ `| `、l`、>=ニ´ , _´ : :} ` / ,,、r"^~´"''''"t-`r、 _ -、 ´ヽノ \ノ / お ・ ,;'~ _r-- 、__ ~f、_>'、_ | で 前 ・ f~ ,;" ~"t___ ミ、 ^'t | は ん ・ ," ,~ ヾ~'-、__ ミ_ξ丶 | な 中 ・ ;' ,イ .. ヽ_ ヾ、0ヽ丶 l / ( ;":: |: :: .. .`, ヾ 丶 ! \____/ ;;;; :: 入:: :: :: l`ー-、 )l ヾ 丶 "~、ソ:: :い:: : \_ ノ , ヾ 丶
743 名前:デフォルトの名無しさん mailto:sage [2017/07/24(月) 22:18:09.60 ID:Dtg+FNV7.net] 俺は大幅に改善されたので満足です
744 名前:デフォルトの名無しさん mailto:sage [2017/07/24(月) 22:30:09.86 ID:DrMH5w+T.net] はすける始めたら彼女とセフレが出来ました!
745 名前:デフォルトの名無しさん mailto:sage [2017/07/25(火) 00:51:32.66 ID:oURyYS1P.net] デザインパターンのようなものが自然に学べる(要出典) >>732 IOモナドを学んでしまうとvoidとかなんやねん!て気持ちになる
746 名前:デフォルトの名無しさん mailto:sage [2017/07/25(火) 02:18:19.45 ID:kRJD7bjt.net] IO () ← なんやねん!
747 名前:デフォルトの名無しさん mailto:sage [2017/07/25(火) 11:48:16.84 ID:QpQhPQ2k.net] 空のタプルやね 引数にタプル使わないけど戻り値には使う 他の言語では最も書きにくいパターンを敢えて書く
748 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 03:54:31.04 ID:iGcNC8dh.net] 空のタポゥってvoidに相当するんでないのって訊いてんの!
749 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 07:51:05.82 ID:y/+6hAIl.net] 例えばIO ()なら空のタプル自体は要らなくとも「IOという文脈に包まれている」という情報は欲しい 遅延評価がデフォのHaskellで実行順序 を保証するためにはそれらのIOを繋げる必要がある voidは何も返さないからそれができない こんな感じで値そのものに意味はなくとも「それとセットになっている何か」が欲しいとき空のタプルを使うことが多い
750 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 08:18:47.17 ID:iGcNC8dh.net] 空タプルはvoidなんじゃないかっていってるの! voidが無いなんて嘘っぱちだろっていってるの! 実質 IO void やろってゆってんの!
751 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 08:24:32.65 ID:UvZuKEGA.net] 物狂いか
752 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 11:08:02.42 ID:BU4hr0QJ.net] IO () はIOモナドの中にしか現れられないが 他言語のvoidはその辺の関数に普通に紛れ込めてしまう もちろん通常は規約とかデザインパターンなどで読みやすく気をつけるわけだけど IOモナドならそういう意図しない副作用が無いことを 型レベルで保証してくれてありがたい
753 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 11:45:48.74 ID:tePeK+XY.net] 集合論でいうと()型の値の集合は空集合ではない デザインパターンでいうとSingleton だがvoidはSingletonではない そもそもvoidはオブジェクトか?
754 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 13:52:35.44 ID:cb3Opfj1.net] Haskellにおいてユニット型の値は () とボトムの2つ。
755 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 15:38:01.66 ID:tePeK+XY.net] ボトムは正規形になっていない式ではないのか 途中の式のことを値といっていいのか
756 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 16:36:16.86 ID:cb3Opfj1.net] >>747 https://wiki.haskell.org/Bottom > Bottom is a member of any type, even the trivial type () or the equivalent simple type: > > data Unary = Unary
757 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 18:13:58.43 ID:tePeK+XY.net] value of any typeとは言っていない
758 名前:デフォルトの名無しさん [2017/07/27(木) 18:57:57.46 ID:TN85Uszo.net] >>747 関数を返す関数もShowのインスタンスじゃ無いから表示出来ないだけで値として扱われてるし、途中の式も値として扱われるなら扱って良いんじゃ無い?
759 名前:デフォルトの名無しさん [2017/07/27(木) 19:03:38.43 ID:TN85Uszo.net] >>742 IO ()は出力関数の(どうせ捨てられる)値として便宜上付けてるだけだしなぁ。。。 別にIO Stringで毎回"Hello"とか返したっていいのをIO ()にしてるだけ。 受け取る意味はないけど、受け取って表示だって出来る。 そう言う意味じゃvoidとは言い難いな。
760 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 19:18:08.33 ID:20Yx27ly.net] 一体彼は何を躍起になってるんだろうか
761 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 20:05:00.63 ID:egT7olKo.net] >>749 型を集合とみなしたときの元(member)をずっと型が取り得る値(value)だと思い込んでた。 違うのか。 それは済まなかった。 私のレスは無視してくれ。
762 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 22:06:59.31 ID:vZOWG5O9.net] まあ確かに⊥を値と認めない流儀はあるからなあ
763 名前:デフォルトの名無しさん mailto:sage [2017/07/27(木) 22:15:49.20 ID:vZOWG5O9.net] 任意の型aに対して、()型の値(≠⊥)を返す関数 :: a -> () はただひとつ f _ = () つまり const () しかないので、「void型を返す関数」が(パラメータ多相を除いて) 一意に決まるということを受け入れるという自殺的蛮勇がないなら void 型と ()型を同視することはできない
764 名前:デフォルトの名無しさん mailto:sage [2017/07/29(土) 00:23:19.35 ID:4ZTKGS6D.net] ゲーム作りてえなあ
765 名前:デフォルトの名無しさん mailto:sage [2017/07/29(土) 01:03:41.38 ID:e8mE+qrd.net] raincatは全ステージクリアした スペランカー並みに弱い猫だなあれ
766 名前:デフォルトの名無しさん mailto:sage [2017/07/29(土) 11:39:03.53 ID:kqaT8BL8.net] 遅延評価でグラフィック描画して何か嬉しいことあるん?
767 名前:デフォルトの名無しさん mailto:sage [2017/07/29(土) 12:15:52.61 ID:SWzA4YZp.net] deleteを遅延するガベコレだけで邪魔臭いんだが 毒食わば皿までとnewも遅延するみたいな感じ
768 名前:デフォルトの名無しさん mailto:sage [2017/07/29(土) 20:11:41.20 ID:bMHI66Oo.net] GHCランタイムシステムのガベコレって、人間が操作するなら必ずここで一瞬停まるから、この瞬間にちょっとだけガベコレしといてねっていう細かい調整はできないの? とにかく食い尽くしてもうなくなったら、解放可能な記憶域ないか、ようやく探し始めるしか能がないの?
769 名前:デフォルトの名無しさん mailto:sage [2017/07/29(土) 21:04:34.50 ID:Txodz0Ts.net] >>760 標準ライブラリにGCを促す関数がある
770 名前:デフォルトの名無しさん mailto:sage [2017/07/29(土) 21:13:59.96 ID:GuKX0EtE.net] メモリー管理が陽に出てこないGC言語でGCについて語るAPIが存在するのも美しくないな 待機型処理の内部に組み入れられないんだろうか
771 名前:_ [2017/07/29(土) 21:43:41.58 ID:z3bKXBTm.net] ghc 8.2.1リリース age
772 名前:デフォルトの名無しさん mailto:sage [2017/07/29(土) 22:00:35.21 ID:ezVHy3/u.net] 実行頻度不明なのに強制GCしたらGCのオーバーヘッドに食い尽くされる可能性あるやろ 人力か機械学習でGCポイント探すしかないわ 線形型はよ
773 名前:デフォルトの名無しさん mailto:sage [2017/07/29(土) 22:05:39.73 ID:EGnuLLJd.net] Numeric Prelude標準モードできねえかな
774 名前:デフォルトの名無しさん mailto:sage [2017/07/30(日) 18:38:08.27 ID:Qtbkg44k.net] いつになったらGHCのコードに型を記述するんだよ あんなコードじゃ常に参加してる奴しか解読出来ないだろ
775 名前:デフォルトの名無しさん mailto:sage [2017/08/02(水) 14:19:58.09 ID:nRMWmSFr.net] デバッグで行単位で進める、 変数の値を都度観察できる、みたいなエディタというかIDEってありますかね?
776 名前:デフォルトの名無しさん mailto:sage [2017/08/02(水) 15:25:19.26 ID:D+JhlBxR.net] デバッグで苦しんだことがないから分からないが 観察するべき実行時エラーが出るものなのか 必死に型を記述した結果がこれか
777 名前:デフォルトの名無しさん mailto:sage [2017/08/02(水) 15:33:23.39 ID:W2G2gcC4.net] >>767 ghciのデバッガじゃいかんの?
778 名前:デフォルトの名無しさん mailto:sage [2017/08/02(水) 23:16:44.52 ID:Fofa317S.net] >>768 >>769 いや、型は合ってんだけど画像いじってて行列の合計数が合わんとか、出来映えがおかしいとかそういうの。途中でどうなってるのか観察したい。 emacsのREPLでちまちま動かして確認してんだけど面倒いなって。 途中でブレークポイント設定とかGHCにあるっぽいのは見たけど、そちらをもう少し当たるのが正解ですかね。
779 名前:デフォルトの名無しさん mailto:sage [2017/08/03(木) 00:12:26.54 ID:Ip+Lj8Tk.net] 純粋関数のprintデバッグができるDebug.Traceとかどうですか
780 名前:デフォルトの名無しさん mailto:sage [2017/08/03(木) 07:59:11.85 ID:d2xIcHkQ.net] プログラミング初心者だけど将来Haskell用のデバッガを作るのが夢です
781 名前:デフォルトの名無しさん mailto:sage [2017/08/03(木) 08:47:54.62 ID:jTGWEJQg.net] ジーニアス英和辞典 第五版にぴったりの例文があった Passion without action ismerelya dream.
782 名前:デフォルトの名無しさん mailto:sage [2017/08/03(木) 08:53:44.89 ID:z5sKoHNx.net] デバッガよりVisual Studio並みの最強IDEがほしいわ
783 名前:デフォルトの名無しさん mailto:sage [2017/08/03(木) 22:43:53.87 ID:PWpQLJ0B.net] Bounded クラスと Enum クラスのインスタンスである型 T について、 n 個の要素を持つリスト型 [T] の値を全て要素として持つリストを生成する関数を enumerate とします。 たとえば型 T の値が A と B の2つだとし、n=3 だとすると、 (enumerate 3 :: [T]) = [[A, A, A], [A, A, B], [A, B, A], [A, B, B], [B, A, A], [B, A, B], [B, B, A], [B, B, B]] となります。 ただし、生成されるリストの要素の順番は問いません。 私は下記のように定義しました。 enumerate :: (Bounded a, Enum a) => Int -> [[a]] enumerate 1 = map (:[]) [minBound .. maxBound] enumerate n = concatMap (\x -> map (x:) (enumerate (n-1))) [minBound .. maxBound] n-1個の既に作られたリストの各要素 (リスト) に新たに型 T のそれぞれの値を接頭する作り方です。 シンプルで分かりやすいのですが、問題が1つあります。 この関数が生成したリストの全要素を順に別の計算に消費するようなプログラムを作っているのですが、 上記の定義ですと、リストの全要素が消費し尽くされるまでほぼ全要素分のメモリが必要になります。 x : x : x : ... と積み上がった cons がメモリに残るような作りのためです。 消費は順に一つずつ行うので、理想的にはメモリも要素一つ分で足ります。 現実はそうもいかないと思いますが、全要素分のメモリを保持し続ける必要はないはずです。 メモリ消費量をもっと抑える良い方法はないでしょうか。
784 名前:デフォルトの名無しさん mailto:sage [2017/08/04(金) 03:26:35.06 ID:F7/4gW8S.net] >>775 ちゃんとプロファイル取ってないから確証はないけど enumerateの定義が悪くてメモリ食いすぎてるような気がする Control.Monad のreplicateMをリストモナドに対して使うと 同様に重複順列を作れるからそれならどうだろうか replicateM 3 [0, 1] -- > [[0,0,0],[0,0,1],[0,1,0],[0,1,1],[1,0,0],[1,0,1],[1,1,0],[1,1,1]] あとリストを順に消費していくような計算ならfoldl'が使えるはず あるいは、「EnumなT型の有限個の直積」をうまく新たにEnumのインスタンスにして、 succ: Enum a => a -> a で例えば succ [A, A, A] = [A, A, B] みたいに計算できるようにしておいて、 STRefを利用してsuccで更新しながら消費していく、とか
785 名前:デフォルトの名無しさん mailto:sage [2017/08/04(金) 06:02:27.89 ID:dl0ZTbjy.net] https://wandbox.org/permlink/jdlx4FhKT80IWQKN data T = A | B deriving Show hoge 0 = A hoge 1 = B fuga _ 0 _ = [] fuga k x n = let (d,m) = divMod n k in hoge m : fuga k (x-1) d piyo x = map (fuga 2 x) [0..2^x-1] main = print $ piyo 3
786 名前:デフォルトの名無しさん mailto:sage [2017/08/04(金) 07:58:50.98 ID:QkUZB/64.net] >>775 import Data.List enumerate 1 = map (:[]) [1..] enumerate n = concatMap (\x -> map (x:) (enumerate (n-1))) [1..] main = print $ foldl' (+) 0 $ map (foldl' (+) 0) $ enumerate 10000 これ(最適化無し)でメモリリークしないあたり 普通に深さ優先で要らなくなった枝はGCされてると思うけど
787 名前:デフォルトの名無しさん [2017/08/04(金) 08:14:23.88 ID:QkUZB/64.net] あー>>778 だと最後の一個が変わり続けるだけだから例としてはダメか 一応enumerateの引数やEnumリストの長さを変えてみても大丈夫だったけど
788 名前:デフォルトの名無しさん [2017/08/04(金) 22:00:01.39 ID:dl0ZTbjy.net] そんなことより8月4日21時から72時間のICFPのプログラミングコンテストがあるよ! HaskellerならICFPくらい知ってるよね! events.inf.ed.ac.uk/icfpcontest2017/ https://twitter.com/ICFPContest2017
789 名前:デフォルトの名無しさん mailto:sage [2017/08/04(金) 22:13:55.04 ID:hukhoKmj.net] みなさん、ありがとうございます。 >>776 前半の replicateM を使う方法は、プロファイリングしてみましたが、私のものとほとんど同じ結果でした。 メモリ消費の傾向もピークも同じ形です。 enumerate 14 で試したところ、最初にピークの 100MB ほどまでぐんぐんメモリを消費し、 その後 90MB 近くまで落ちてから一定です。 後半の方法はこれから試してみます。 >>777 挙げていただいたコードを Bounded と Enum を使って一般化して試してみました。 同様に enumerate 14 で実行してみると、メモリ消費傾向は全体的にほぼまっすぐな長方形に近い台形で、 ピークも 40kB と桁違いに少ないです。 >>778 メモリリークが起きていないことはどのようにして確認されました? 私は実行する時に RTS オプションの hc を付けてプロファイルを取って確認しました。 確かに深さ優先で一度ずつ探索する処理なのに、メモリが 100MB も消費されていて、 これは明らかにメモリリークしていると思ったのですが、どうでしょう? これから、私や >>776 の前半のやり方と >>777 のやり方の違いについて研究してみます。
790 名前:デフォルトの名無しさん [2017/08/05(土) 02:29:47.95 ID:B0WoWMTx.net] >>775 これの話に似てる? kanae.2ch.net/test/read.cgi/prog/1431362559/667-670n これみたいなメモ化を使えばいいような気もする echo.2ch.net/test/read.cgi/tech/1428597032/873 https://wiki.haskell.org/The_Fibonacci_sequence
791 名前:デフォルトの名無しさん mailto:sage [2017/08/05(土) 03:50:29.84 ID:pRMdXxul.net] >>781 40KBはありえないので一般化に失敗してると思われる
792 名前:デフォルトの名無しさん mailto:sage [2017/08/05(土) 04:37:17.71 ID:2UARNcsu.net] >>782 メモ化は空間計算量と引き換えに高速化する話だからむしろ逆のような フィボナッチで言うならInteger 3個分のメモリがあればn番目が計算できるでしょって話だから タプリングの方が解決策としては近いと思う 結局リストで定義しちゃうと(そして評価しちゃうと) そのイミュータブル性のために各要素はまた参照されるかもしれないから GHCは捨てられないんだと思ってる