[過去ログ] 関数型プログラミング言語Haskell Part33 (1002レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
906: 2021/09/23(木)20:01 ID:0hgEU0Ok(1) AAS
>>905
まぁそうですね
完全日曜プログラマーなので気分良く書けばいいか
907(3): 2021/09/26(日)07:18 ID:m/60KM4j(1/2) AAS
Stack Overflow に面白い質問が投稿されていた。
要約すると return 1 getLine という式の型は Num t => t で、その値は 1 らしいんだが何で? というもの。
質問者は勘違いして、何で return と getLine が互いに打ち消し合うのかと訊いていたが。
外部リンク:stackoverflow.com
なかなか興味深い。
考えてみると haskell の理解がいっそう深まる。
908(1): 2021/09/26(日)19:38 AAS
最近並列処理を齧り始めました
ランダム値の生成にmwc-random パッケージの System.Random.MWC.createSystemRandom で生成した GenIO を、全体を通して利用する環境として Reader モナドに入れて使いまわしていたとします
ここにSTM で並列処理機能を新規に追加する場合、forkIO したスレッド内で一々そのスレッド専用に GenIO を生成し直すべきでしょうか?
というのは、それをしないと
各スレッドで共通の GenIO がコピーされ使用される場合、各スレッドで同じ値が生成されていってしまいランダムの意味をなさないのではないかと思うからです
ではこの疑似ランダム生成器を TVar に入れるかとなると、資源の取り合いになって、1スレッド時よりパフォーマンスが低下して元も子もないではないかという懸念があります
ここまで思考実験すると、やはり forkIO したスレッド毎に一々、その中で専用の疑似ランダム生成器を新調する必要があるという考えに至りました
スレッド数が多くなると疑似ランダム生成器を作るコストがバカにならなくなっていくでしょうが、その辺は頑張るしかないよということで、ぼくの考えは合っていますか?
909(1): 2021/09/26(日)21:46 ID:m/60KM4j(2/2) AAS
>>908
そこまでしっかり考察したのなら、質問する前にまず実験してみようよ。
910(2): 2021/09/27(月)16:47 AAS
>>909
実験してみたら、各スレッドで別の値が生成されていました
しかしドキュメント見ると It uses mutable state so same generator shouldn't be used from the different threads simultaneously.と書いてあるんですが
これはどう受け取ったらいいんですかね
各スレッドで別の値が生成されているなら用を為してる(ように思える)からいいじゃないかとも思うのですが
何か別の理由があって、そう思えてもやはり使うなという事なんでしょうか?
911(1): 2021/09/27(月)18:11 ID:XYchXu+H(1) AAS
>>910
mutable stateの排他制御をしてないから複数のスレッドで実行するとまずいことが起こるかもしれない、ってことじゃないの?
排他制御
外部リンク:ja.wikipedia.org
912(1): 2021/09/27(月)20:38 ID:MDVYajz0(1) AAS
>>910
パフォーマンスの実験もね。
理論上パフォーマンスが落ちると分かっていても、実用上は問題ない場合も多い。
913: 2021/09/29(水)15:57 ID:lU7q1h04(1) AAS
>>907
そこで関数モナドが出てくるのは知らないと思い至らないなあ
勉強になった
914: 2021/09/30(木)07:09 ID:N1l0weLI(1) AAS
>>907
セミコロンを書かない言語ではすべからく改行直後に
(getLine)と書くとどうなるか問題が出てくる
915: 2021/09/30(木)09:21 ID:LH+TfD4u(1) AAS
すべからく警察だ!
916: 2021/09/30(木)09:22 AAS
>>911
具体的にどういうケースでどういう問題が起こるか解らないので、取り敢えずドキュメントにスレッド間で共有はやめろとある以上、大人しく従うことにします
>>912
STM版が、3950Xエコモードシングル500分の処理が30スレッド割り当てで220分くらいになりましたが
CPU使用率も75%前後で残念でした
競合するリソースが多過ぎたからではと思い、競合を避ける事を考えていると
そもそもSTMを使わず、スレッド毎にローカルにデータを貯めて処理して最後に各スレッドで部分的に仕上げたデータをChanで流して
、受信した側でデータを総括する、初歩的な方式を思いついたので書き換えました
getChanContentsを使いましたが、EOFみたいな最後の通知方法が判らずに、全スレッドの処理が終わりもう誰もデータを流すことのないチャネルから性懲りもなく読みだそうとしてしまい
例外が発生して困っていました
幸いスレッドの数は判っているのでチャネルからtakeする数をスレッド数ちょっきりとして切り上げた所、遅延評価が幸いしてその先を読もうとしなくなり例外は発生しなくなりました(本質的解決かは判りません)
これにより処理が18分で終わりました
スレッド毎にcreateSystemRandomするように書き換えると21分かかるようになりました
オーバヘッド込みでも500分かかっていた時代から驚異的な進化を遂げました
憧れだった Software Transactional Memory は期待程速くなくがっかりしました
STMは最初に検討するべきではなく、巧く競合が発生しないように書けないときの最後の手段なのかなと思いました
917: 2021/09/30(木)16:59 ID:Ai6xyiAS(1) AAS
物理cpuが四つとかの擬似マルチスレッドではそんなに早くならないと思ってたけど、ものによってはそんなにも早くなるもんなんだな
918: 2021/10/04(月)21:32 ID:zxVeK0W2(1) AAS
と思ったら3950x gpuでほんとに物理スレッドがたくさんある場合の話か
919(1): 2021/10/05(火)23:20 ID:75xrYyRf(1) AAS
>>907
型注釈してないのに、インスタンスとして関数モナドが選択されるのはどうしてですか?
getLineが影響していますか?
920: 2021/10/06(水)01:58 ID:3ymQugFf(1) AAS
>>919
return 1 getLine は (return 1) getLine だから、
(return 1) が関数(a->b) じゃないと型が合わないんじゃないかな?
921: 2021/10/06(水)22:57 ID:MRfRTuXd(1) AAS
関数モナドと同じように、引数一つ取るモナド作ったらambiguousって怒られるかなと思ったんだけど、コンストラクタ書かないとならないからうまくいかない。
この値は関数モナドにしか解決されないのかな
922: 2021/10/07(木)09:52 ID:AVdaEi5L(1) AAS
C++のoperator()()に相当する演算を多重定義できないので曖昧ではない
923: 2021/10/17(日)18:41 ID:DQz0YbVB(1/2) AAS
なんjでめんだこって言う女装子がhaskell勉強していてdao of functional programmingっていう海外の人が書いた文献がわかりやすいってことでそれ読んでいるらしいが
ここの人にもそれ読んでいる人いる?
924(2): 2021/10/17(日)20:11 ID:LTEsEtXo(1/2) AAS
これか
The Dao of Functional Programming
外部リンク[pdf]:github.com
圏論関係の内容だな
925: 2021/10/17(日)20:37 ID:DQz0YbVB(2/2) AAS
>>924
すまんリンク探させてしまってすまない
ワイが貼るべきやった
ワイは圏論わからないから読まずじまいだったわ
いつか圏論習得できたらその際に読もうかなって思ってる
926: 2021/10/17(日)21:08 ID:LTEsEtXo(2/2) AAS
プログラミングの本質を学ぶには圏論について学ぶ必要があるということらしい
学んですぐ役立つというものではないようで、すぐ役立つ知識がお望みなら他をあたってくれ、とか
927: 2021/10/17(日)23:35 ID:QqhGhKAl(1) AAS
見せてもらおうか、圏論とやらを。
928: 2021/10/18(月)00:33 ID:BIt/UTxD(1) AAS
>>924
同じ著者の
Category Theory for Programmers
外部リンク:github.com
929: 2021/10/18(月)02:49 ID:mrfOLNSK(1) AAS
また圏論か
もういいよ
930: 2021/10/18(月)12:08 ID:7GcdH/zA(1) AAS
さあ ねがいを いえ
931: 2021/10/18(月)15:15 ID:r9t2S6+p(1) AAS
動画リンク[YouTube]
外部リンク[html]:bangumi.ouj.ac.jp
932: 2021/10/22(金)12:14 ID:9P3eVRHd(1) AAS
Free monad とは何か? の、シンプルかつ的を射た説明がsrackoverflowにあった。
(John Wiegley の回答)
外部リンク:stackoverflow.com
これを読んでから他の色んなFree monadの記事を読むと、すんなり理解できる。
これ、本質がよく解っている人の回答だよね。
こんな格好良く回答ができるよう精進したい。
933: 2021/10/22(金)21:20 AA×

934: 2021/10/22(金)23:18 ID:5ielnrPe(1) AAS
haskellってpythonに影響与えてるんやな
どおりで雰囲気似てる感じするんか
935: 2021/10/23(土)01:09 ID:o3xA5lbA(1) AAS
レイアウトと呼ばれるインデントスタイルは、Pythonが1991年に最初にリリースであり、85年以前にあった
Mirandaを参考に1990年にHaskellは登場したはず。
上下前次1-新書関写板覧索設栞歴
あと 67 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ
ぬこの手 ぬこTOP 0.035s