関数型プログラミング言語 Haskell について語るスレです。
Haskell Language(公式サイト)
https://www.haskell.org/
日本Haskellユーザーグループ - Haskell-jp
https://haskell.jp/
前スレ
関数型プログラミング言語Haskell Part32
https://mevius.5ch.net/test/read.cgi/tech/1548720347/
関数型プログラミング言語Haskell Part33
レス数が950を超えています。1000を超えると書き込みができなくなります。
1デフォルトの名無しさん
2020/02/10(月) 18:17:36.49ID:L6eYQqyh863デフォルトの名無しさん
2021/07/11(日) 06:49:31.34 リストのシャッフルは、2値ランダムと分割統治法で構成できるという境地に至った
864デフォルトの名無しさん
2021/07/11(日) 16:41:58.17ID:KhXXWhgG 余談だけど
オードリー・タン氏に性的に食指が動く
男性っているのかな。
オードリー・タン氏に性的に食指が動く
男性っているのかな。
865デフォルトの名無しさん
2021/07/16(金) 17:38:36.16 あののののの! なんで型コンストラクタ名が被ったらいけないんですか!
型が違うならそのコンストラクタ名くらい被ったっていいじゃないですか!
型が違うならそのコンストラクタ名くらい被ったっていいじゃないですか!
866デフォルトの名無しさん
2021/07/16(金) 23:35:14.79 Esqueleto では SELECT 〜 FROM ONLY an_table 〜 みたいに ONLY を付けることで継承テーブルを対称から外すように指示することはできないんですか?
生SQLを書くしかありませんか?
生SQLを書くしかありませんか?
867デフォルトの名無しさん
2021/07/17(土) 15:02:59.17ID:eTC1af8g >>864
ちょまどは鳳唐好きだって言ってた
ちょまどは鳳唐好きだって言ってた
868デフォルトの名無しさん
2021/07/17(土) 17:39:27.65ID:44fEdIj7 私は、MBAを取るために、ハワイにある伝統的なビジネススクールに通っていたとき、どこかの大企業で
働く中間管理職が教えるマネジメント「論」や経済「論」を学ぼうとしている自分に気付いた。
ビジネス経験のない先生は、学校制度の外に一度も出たことがない人だ。つまり彼は、5歳で幼稚園に入ってから
ずっと学校制度の中にいるにもかかわらず、学生たちに実社会について教えようとしていることだ。
とんだお笑い草だと思った。
講師陣や中間管理職や教師のほとんどは、ゼロからビジネスを立ち上げるのに何が必要なのかについては何も知らなかった。
ロバートキヨサキ「人助けが好きなあなたに贈る金持ち父さんのビジネススクール」P62〜63
彼らのほとんどは、学校という象牙の塔を出ると、企業社会という象牙の塔に入った。
安定した仕事と給料に依存していた。つまり、素晴らしいビジネス論をもっている人は
たくさんいたが、現実の世界でビジネスをゼロから立ち上げ、大きな富を蓄えるのを可能にする、
素晴らしいビジネススキルのある人はほとんどいなかったということだ。
彼らのほとんどは給料なしで生きていけなかった。
ロバートキヨサキ「人助けが好きなあなたに贈る金持ち父さんのビジネススクール」P63
働く中間管理職が教えるマネジメント「論」や経済「論」を学ぼうとしている自分に気付いた。
ビジネス経験のない先生は、学校制度の外に一度も出たことがない人だ。つまり彼は、5歳で幼稚園に入ってから
ずっと学校制度の中にいるにもかかわらず、学生たちに実社会について教えようとしていることだ。
とんだお笑い草だと思った。
講師陣や中間管理職や教師のほとんどは、ゼロからビジネスを立ち上げるのに何が必要なのかについては何も知らなかった。
ロバートキヨサキ「人助けが好きなあなたに贈る金持ち父さんのビジネススクール」P62〜63
彼らのほとんどは、学校という象牙の塔を出ると、企業社会という象牙の塔に入った。
安定した仕事と給料に依存していた。つまり、素晴らしいビジネス論をもっている人は
たくさんいたが、現実の世界でビジネスをゼロから立ち上げ、大きな富を蓄えるのを可能にする、
素晴らしいビジネススキルのある人はほとんどいなかったということだ。
彼らのほとんどは給料なしで生きていけなかった。
ロバートキヨサキ「人助けが好きなあなたに贈る金持ち父さんのビジネススクール」P63
869デフォルトの名無しさん
2021/07/17(土) 18:54:41.40ID:lhv7ZvYo 言語設計者に対する悪口はそこまでにしてやれ
870デフォルトの名無しさん
2021/07/18(日) 08:48:06.51ID:p5uFvWrN まあ、生きていけないぞー死ぬぞーってのが机上の空論の中でも最悪の論だよな
実際には死なない人が多い
実際には死なない人が多い
871デフォルトの名無しさん
2021/07/18(日) 22:53:21.56 すいません、僕がスレを軽率に上げてしまったばっかりにワードサラダBOTの餌食なってしまうとは・・・
872デフォルトの名無しさん
2021/07/19(月) 09:08:56.51ID:Niob4uA5 現状これはとりあえず有効にしとけみたいなGHC拡張ってなにがありますか
873デフォルトの名無しさん
2021/07/19(月) 10:46:43.62ID:jaES3hbu874デフォルトの名無しさん
2021/07/26(月) 04:08:52.62ID:FlIQ/SVE ttps://cognicull.com/ja
Haskellやるのにこの辺は履修済みであることが求められるの?
Obj-Cだとほぼなくてもアプリは書けるけども
Haskellって数学じゃないのに数学のフリしてるところあるよね
利用者も然りで余計混乱を招いてる気がする
Haskellやるのにこの辺は履修済みであることが求められるの?
Obj-Cだとほぼなくてもアプリは書けるけども
Haskellって数学じゃないのに数学のフリしてるところあるよね
利用者も然りで余計混乱を招いてる気がする
875デフォルトの名無しさん
2021/07/26(月) 12:01:28.04ID:nPPC7Onz876デフォルトの名無しさん
2021/07/27(火) 03:35:04.64 Data.Arrayって廃止されたの?
GHC.Arr を使えってこと?
GHC.Arr を使えってこと?
877デフォルトの名無しさん
2021/07/27(火) 05:37:33.58ID:O4N47kXx >>876
Data.Array は array パッケージにあります。
Data.Array は array パッケージにあります。
878デフォルトの名無しさん
2021/07/27(火) 15:27:28.97ID:6BJr6nx6 >>874
フリじゃなくて実際、他のメジャー言語よりは数学的裏付けがされてると思う
利用者も然りなのはむしろ良い傾向
他言語はhaskell以上に、ウェイがノリで書いたようなゴミライブラリが流行ってたり、侍エンジニアレベルのゴミ文献が蔓延ってたりする阿鼻叫喚状態
フリじゃなくて実際、他のメジャー言語よりは数学的裏付けがされてると思う
利用者も然りなのはむしろ良い傾向
他言語はhaskell以上に、ウェイがノリで書いたようなゴミライブラリが流行ってたり、侍エンジニアレベルのゴミ文献が蔓延ってたりする阿鼻叫喚状態
879デフォルトの名無しさん
2021/07/28(水) 02:22:30.38 >>877
詳しい情報サンクス
詳しい情報サンクス
880デフォルトの名無しさん
2021/07/30(金) 13:54:44.53ID:kX7UidPf >>874
Haskell書いてるときにそういう系統の知識が要求されたことはないなぁ、いくつかの概念の出自が圏論だと聞いたことはあるが
Haskell書いてるときにそういう系統の知識が要求されたことはないなぁ、いくつかの概念の出自が圏論だと聞いたことはあるが
881デフォルトの名無しさん
2021/07/30(金) 14:32:21.44ID:yBIo03BR すごいHaskellに素晴らしい数学の解説書ってレビューがついてた時はクスっと来たけど
882デフォルトの名無しさん
2021/08/02(月) 07:34:32.07ID:Rllz2LO9 例えばOOPの継承関係を否定する
否定するなら対案を出せと言われる
この過程は数学ではないけど結果的には半順序関係とか圏とか出てくる
否定するなら対案を出せと言われる
この過程は数学ではないけど結果的には半順序関係とか圏とか出てくる
883デフォルトの名無しさん
2021/08/16(月) 04:30:28.47ID:aZY1/RTa 純粋関数型でキャッシュは実装可能?
例えばOOPでは計算に時間がかかる値はキャッシュしておいて次の読み取りで
キャッシュから返すという事ができる。
このキャッシュの管理をOOPらしいカプセル化によってまともに実装できる
例えばOOPでは計算に時間がかかる値はキャッシュしておいて次の読み取りで
キャッシュから返すという事ができる。
このキャッシュの管理をOOPらしいカプセル化によってまともに実装できる
884デフォルトの名無しさん
2021/08/16(月) 18:24:35.56ID:O8pAbV/G885デフォルトの名無しさん
2021/08/18(水) 20:19:16.73ID:MamsdVYI886デフォルトの名無しさん
2021/08/19(木) 00:24:27.59ID:anV9aH6F 低級言語でインタプリタを作れそうなシェルスクリプト的な位置づけだよ
単一の高級言語を強制されない
単一の高級言語を強制されない
887デフォルトの名無しさん
2021/08/19(木) 16:00:36.29ID:IKqVi/r3 関数型言語ってリストとかツリーみたいな再帰的なデータ構造扱うのは得意だけど
有向・無向グラフ(のアルゴリズム)扱うの難しくない?
有向・無向グラフ(のアルゴリズム)扱うの難しくない?
888デフォルトの名無しさん
2021/08/19(木) 18:40:13.11ID:JntO5v5E >>887
難しいと感じるかどうかは本人の気持ちなので何とも言えません。
ただ、haskellでのグラフ理論の扱いに関しては、
カジュアルな解説もフォーマルな論文もたくさんあります。
ライブラリもあります。
扱ったことはないけど、何となくイメージだけで
難しそうだ、
haskellの苦手分野だと思っているのであれば、
自分に読めそうな記事にいくつかトライしてみてはどうでしょうか。
難しいと感じるかどうかは本人の気持ちなので何とも言えません。
ただ、haskellでのグラフ理論の扱いに関しては、
カジュアルな解説もフォーマルな論文もたくさんあります。
ライブラリもあります。
扱ったことはないけど、何となくイメージだけで
難しそうだ、
haskellの苦手分野だと思っているのであれば、
自分に読めそうな記事にいくつかトライしてみてはどうでしょうか。
889デフォルトの名無しさん
2021/08/19(木) 21:01:34.14ID:anV9aH6F >>887
Erlangのようなメッセージ送信を考えればわかるが
メモリを共有していない相手にも送れるデータ構造が得意
メッセージとして文字列ばかり使ってるとカプセル化も型情報も無駄になる
だから文字列に似ているが異なるデータ構造が役に立つ
Erlangのようなメッセージ送信を考えればわかるが
メモリを共有していない相手にも送れるデータ構造が得意
メッセージとして文字列ばかり使ってるとカプセル化も型情報も無駄になる
だから文字列に似ているが異なるデータ構造が役に立つ
890デフォルトの名無しさん
2021/08/25(水) 21:36:21.14ID:NimliznV Applicativeの(*>)演算って何の意味があるの?
第一引数はどうせ捨てられるんでしょ。
第一引数はどうせ捨てられるんでしょ。
891デフォルトの名無しさん
2021/08/25(水) 23:09:37.51ID:SkXNk2uR 確かに左辺 :: f aで言うところのa型の値は捨てるが
Maybeとか[]みたいな直和型でどの値コンストラクタを使って構築されたかの情報は影響するよ
Maybeとか[]みたいな直和型でどの値コンストラクタを使って構築されたかの情報は影響するよ
892デフォルトの名無しさん
2021/08/26(木) 21:35:42.38ID:Wv9PZvrP >>891
それは第1引数をパターンマッチすることで、たとえ第2引数が同じ値でも、
(*>)の計算結果を変えられることに意味があるってこと?
Sum型やProduct型もApplicativeのインスタンスになってるけど、
これらだと(*>)には意味がない?
(当然(<*>)など他の演算には意味があると思うけど)
それは第1引数をパターンマッチすることで、たとえ第2引数が同じ値でも、
(*>)の計算結果を変えられることに意味があるってこと?
Sum型やProduct型もApplicativeのインスタンスになってるけど、
これらだと(*>)には意味がない?
(当然(<*>)など他の演算には意味があると思うけど)
893デフォルトの名無しさん
2021/08/28(土) 14:58:50.16ID:WIQMD65A >>890
Parsecで左辺の句がいらないときに使う
Parsecで左辺の句がいらないときに使う
894デフォルトの名無しさん
2021/09/01(水) 17:56:43.60 ぼくようメモ:
OpenSUSE でPostgreSQLを使用した開発をしていてstack buildで
postgresql-libpq パッケージを途中にビルドする際
pg_config が無いと言われコケることがある
背景: OpenSUSE は postgres-devel から pg_config を削除した。我々は libpq.pc を代わりに使うべきである。
ソース: https://redmine.lighttpd.net/issues/2965
解決法:
stack build --flag postgresql-libpq:use-pkg-config
としてビルドする
OpenSUSE でPostgreSQLを使用した開発をしていてstack buildで
postgresql-libpq パッケージを途中にビルドする際
pg_config が無いと言われコケることがある
背景: OpenSUSE は postgres-devel から pg_config を削除した。我々は libpq.pc を代わりに使うべきである。
ソース: https://redmine.lighttpd.net/issues/2965
解決法:
stack build --flag postgresql-libpq:use-pkg-config
としてビルドする
895デフォルトの名無しさん
2021/09/08(水) 22:14:55.40 そうか!Trueskill のHaskell実装がなくて論文読んで自分で実装する力がなくても
Haskellから実行時にbash 呼び出してPython3 のTrueskillライブラリに標準入力でPythonコードを流し込んで
演算結果を文字列で貰ってきて、それをParserCombinatorで作った字句解析器で読み取ってHaskellのデータに戻せばいいじゃん
あたいったら天才ね!
Haskellから実行時にbash 呼び出してPython3 のTrueskillライブラリに標準入力でPythonコードを流し込んで
演算結果を文字列で貰ってきて、それをParserCombinatorで作った字句解析器で読み取ってHaskellのデータに戻せばいいじゃん
あたいったら天才ね!
896デフォルトの名無しさん
2021/09/09(木) 09:49:18.76ID:rktYy8hS s/天才/脳筋/
897デフォルトの名無しさん
2021/09/10(金) 01:55:27.29ID:bkZL74IR 関数定義の左辺の部分的で、関数名と仮引数名の後の | と = の間の部分って何て名称だっけ?
f x y | x < y = ...
これの x < y の部分。
あるいは関数定義をこう書く方法の呼び方とか。
この文法や制限などをネットで調べたいんだけど、
名称が思い出せず検索に難儀してる。
できれば英語でお願い。
f x y | x < y = ...
これの x < y の部分。
あるいは関数定義をこう書く方法の呼び方とか。
この文法や制限などをネットで調べたいんだけど、
名称が思い出せず検索に難儀してる。
できれば英語でお願い。
898デフォルトの名無しさん
2021/09/10(金) 03:22:07.48ID:bkZL74IR >>897
すまん、思い出した、guard だ。
すまん、思い出した、guard だ。
899デフォルトの名無しさん
2021/09/10(金) 22:23:35.11ID:kwXNo1Gk >>896
g を忘れてね?
g を忘れてね?
900デフォルトの名無しさん
2021/09/22(水) 10:43:55.15ID:02VLVXq+ パターンの質問です
Rational型の数が平方数であるかどうか判定するプログラムで
isSquare r = r >= 0 && r == ( sqrtR r )^2
sqrtI = truncate . sqrt . fromInteger
sqrtR r = let
( a, b ) = ( numerator r, denominator r )
in ( sqrtI a ) % ( sqrtI b )
というのを書きました
もちろんこれはうまくいきます
しかし numerator, denominator をいちいち取り出すのが鬱陶しいので
sqrtR ( a :% b ) = ( sqrtI a ) % ( sqrtI b ) ------- @
と書きたかったのですがうまくいきません
Rational型の数が平方数であるかどうか判定するプログラムで
isSquare r = r >= 0 && r == ( sqrtR r )^2
sqrtI = truncate . sqrt . fromInteger
sqrtR r = let
( a, b ) = ( numerator r, denominator r )
in ( sqrtI a ) % ( sqrtI b )
というのを書きました
もちろんこれはうまくいきます
しかし numerator, denominator をいちいち取り出すのが鬱陶しいので
sqrtR ( a :% b ) = ( sqrtI a ) % ( sqrtI b ) ------- @
と書きたかったのですがうまくいきません
901デフォルトの名無しさん
2021/09/22(水) 10:44:01.62ID:02VLVXq+ ネットで調べると
{-# LANGUAGE PatternSynonyms, ViewPatterns #-}
numDenum :: Integral a => Ratio a -> (a,a)
numDenum x = ( numerator x, denominator x )
pattern ( :% ) :: Integral a => a -> a -> Ratio a
pattern a :% b <- ( numDenum -> ( a,b ) )
where a :% b = a % b
というおまじないがstack exchangeで見つかってコレつけるとうまく行きました
うまくいったんですがサッパリわかりません
コレ何者ですか?
そもそも@はなんでうまく動かないんですか?
{-# LANGUAGE PatternSynonyms, ViewPatterns #-}
numDenum :: Integral a => Ratio a -> (a,a)
numDenum x = ( numerator x, denominator x )
pattern ( :% ) :: Integral a => a -> a -> Ratio a
pattern a :% b <- ( numDenum -> ( a,b ) )
where a :% b = a % b
というおまじないがstack exchangeで見つかってコレつけるとうまく行きました
うまくいったんですがサッパリわかりません
コレ何者ですか?
そもそも@はなんでうまく動かないんですか?
902デフォルトの名無しさん
2021/09/22(水) 11:58:51.92ID:Sp73Mnte 計算結果をパターンマッチさせようとして失敗してるのでは
値を値コンストラクタにばらしてその値コンストラクタに応じて処理を変えるのがパターンマッチ
(マッチさせる対象がList aなら、:なのか[]なのかに応じて「先頭:後ろ」か空リストかが束縛される)
で、計算結果をマッチさせたいならビューってのを定義してあげないといけませんよって話のような
値を値コンストラクタにばらしてその値コンストラクタに応じて処理を変えるのがパターンマッチ
(マッチさせる対象がList aなら、:なのか[]なのかに応じて「先頭:後ろ」か空リストかが束縛される)
で、計算結果をマッチさせたいならビューってのを定義してあげないといけませんよって話のような
903デフォルトの名無しさん
2021/09/22(水) 18:38:05.18ID:02VLVXq+ >>902
レスありがとうございます
原因わかりました
ご指摘の通り「計算結果にはパターンマッチさせられない、パターンマッチに入っていい関数はコンストラクタのみ」なのでRatio a型のコンストラクタである( :% )を使ってたのでそこは問題ないと思ってたんですが肝腎要の( :% )が定義されてるGHC.Realをimportしてませんでした
Data.Ratioをimportしたら自動的に(:%)も使えるもんだと思い込んでいました
Pattern synonymsについては
https://qiita.com/as_capabl/items/d2eb781478e26411a44c
でちょっと理解できました、が、そもそも使わなくても良くなりました
ご協力感謝です
レスありがとうございます
原因わかりました
ご指摘の通り「計算結果にはパターンマッチさせられない、パターンマッチに入っていい関数はコンストラクタのみ」なのでRatio a型のコンストラクタである( :% )を使ってたのでそこは問題ないと思ってたんですが肝腎要の( :% )が定義されてるGHC.Realをimportしてませんでした
Data.Ratioをimportしたら自動的に(:%)も使えるもんだと思い込んでいました
Pattern synonymsについては
https://qiita.com/as_capabl/items/d2eb781478e26411a44c
でちょっと理解できました、が、そもそも使わなくても良くなりました
ご協力感謝です
904デフォルトの名無しさん
2021/09/22(水) 20:18:48.06ID:02VLVXq+ 備忘録がてら調べてわかった事書いておきます
Pattern Synonyms は今回のようにライブラリの提供者が型のコンストラクタを提供してない、しかしパターンマッチは使いたいとかの場合に使える拡張のようです
{-# LANGUAGE PatternSynonyms, ViewPatterns #-}
を使うと
pattern ( マッチさせたい表現) <-
( その型から取り出したい値を取り出す関数)
-> ( 取り出した値にマッチさせるパターン) )
( where さらにコンストラクタシノニムとしても使いたい場合の逆変換関数 )
の形で使うようです
例えばInt型でxが偶数であった場合にdiv x 2をパターンマッチで拾うために
pattern TwiceOf x <-
( ( \t -> ( div t 2 , even t ) ) -> ( x, True ) )
のように定義しておいて
main = do
case 2 of { DoubleOf x -> print x; _ -> print "odd" }
case 3 of { DoubleOf x -> print x; _ -> print "odd" }
のように利用できるようです
TwiceOf はあくまでパターンマッチの表現のみで使える“仮の”コンストラクタですがpattern文にwhere句を
pattern DoubleOf x <-
( ( \t -> ( div t 2 , even t ) ) -> ( x, True ) )
where TwiceOf x = 2*x
のように追加するとあたかもInt型の新しいコンストラクタが追加されたように振る舞い“DoubleOf 2”のような表現が許されるようになるようです
今回の場合はどうすべきか悩みどころです
ライブラリの開発者が低レベルの(:%)を公開しない理由もわかるので無理クリ(:%)を使うのもどうなんつて気もするし、かと言ってまだHaskellの標準として認められてない、GHCでしか使えない拡張使うのもどうなんという気もするし
Pattern Synonyms は今回のようにライブラリの提供者が型のコンストラクタを提供してない、しかしパターンマッチは使いたいとかの場合に使える拡張のようです
{-# LANGUAGE PatternSynonyms, ViewPatterns #-}
を使うと
pattern ( マッチさせたい表現) <-
( その型から取り出したい値を取り出す関数)
-> ( 取り出した値にマッチさせるパターン) )
( where さらにコンストラクタシノニムとしても使いたい場合の逆変換関数 )
の形で使うようです
例えばInt型でxが偶数であった場合にdiv x 2をパターンマッチで拾うために
pattern TwiceOf x <-
( ( \t -> ( div t 2 , even t ) ) -> ( x, True ) )
のように定義しておいて
main = do
case 2 of { DoubleOf x -> print x; _ -> print "odd" }
case 3 of { DoubleOf x -> print x; _ -> print "odd" }
のように利用できるようです
TwiceOf はあくまでパターンマッチの表現のみで使える“仮の”コンストラクタですがpattern文にwhere句を
pattern DoubleOf x <-
( ( \t -> ( div t 2 , even t ) ) -> ( x, True ) )
where TwiceOf x = 2*x
のように追加するとあたかもInt型の新しいコンストラクタが追加されたように振る舞い“DoubleOf 2”のような表現が許されるようになるようです
今回の場合はどうすべきか悩みどころです
ライブラリの開発者が低レベルの(:%)を公開しない理由もわかるので無理クリ(:%)を使うのもどうなんつて気もするし、かと言ってまだHaskellの標準として認められてない、GHCでしか使えない拡張使うのもどうなんという気もするし
905デフォルトの名無しさん
2021/09/23(木) 10:16:50.52ID:F+2SAjcM >>904
> かと言ってまだHaskellの標準として認められてない、GHCでしか使えない拡張使うのもどうなんという気もするし
まさかGHCの言語拡張はすべて使わないつもりですか?
せっかくの表現力が著しく落ちますよ。
今あるいは将来 GHC 以外のツールでコンパイルする計画があるのなら仕方ありませんが、
そうでなければ言語拡張の使用を躊躇する理由が見あたりません。
私なら、
・プログラムが意図した動きをし、
・かつソースコードが読みやすくなる
なら言語拡張を積極的に利用します。
意図通り動くけど可読性が落ちるなら、そこで初めて迷いますね。
> かと言ってまだHaskellの標準として認められてない、GHCでしか使えない拡張使うのもどうなんという気もするし
まさかGHCの言語拡張はすべて使わないつもりですか?
せっかくの表現力が著しく落ちますよ。
今あるいは将来 GHC 以外のツールでコンパイルする計画があるのなら仕方ありませんが、
そうでなければ言語拡張の使用を躊躇する理由が見あたりません。
私なら、
・プログラムが意図した動きをし、
・かつソースコードが読みやすくなる
なら言語拡張を積極的に利用します。
意図通り動くけど可読性が落ちるなら、そこで初めて迷いますね。
906デフォルトの名無しさん
2021/09/23(木) 20:01:57.83ID:0hgEU0Ok907デフォルトの名無しさん
2021/09/26(日) 07:18:33.81ID:m/60KM4j Stack Overflow に面白い質問が投稿されていた。
要約すると return 1 getLine という式の型は Num t => t で、その値は 1 らしいんだが何で? というもの。
質問者は勘違いして、何で return と getLine が互いに打ち消し合うのかと訊いていたが。
https://stackoverflow.com/questions/69325169/haskell-a-return-before-is-cancelled-out-by-a-monad-after-how
なかなか興味深い。
考えてみると haskell の理解がいっそう深まる。
要約すると return 1 getLine という式の型は Num t => t で、その値は 1 らしいんだが何で? というもの。
質問者は勘違いして、何で return と getLine が互いに打ち消し合うのかと訊いていたが。
https://stackoverflow.com/questions/69325169/haskell-a-return-before-is-cancelled-out-by-a-monad-after-how
なかなか興味深い。
考えてみると haskell の理解がいっそう深まる。
908デフォルトの名無しさん
2021/09/26(日) 19:38:43.50 最近並列処理を齧り始めました
ランダム値の生成にmwc-random パッケージの System.Random.MWC.createSystemRandom で生成した GenIO を、全体を通して利用する環境として Reader モナドに入れて使いまわしていたとします
ここにSTM で並列処理機能を新規に追加する場合、forkIO したスレッド内で一々そのスレッド専用に GenIO を生成し直すべきでしょうか?
というのは、それをしないと
各スレッドで共通の GenIO がコピーされ使用される場合、各スレッドで同じ値が生成されていってしまいランダムの意味をなさないのではないかと思うからです
ではこの疑似ランダム生成器を TVar に入れるかとなると、資源の取り合いになって、1スレッド時よりパフォーマンスが低下して元も子もないではないかという懸念があります
ここまで思考実験すると、やはり forkIO したスレッド毎に一々、その中で専用の疑似ランダム生成器を新調する必要があるという考えに至りました
スレッド数が多くなると疑似ランダム生成器を作るコストがバカにならなくなっていくでしょうが、その辺は頑張るしかないよということで、ぼくの考えは合っていますか?
ランダム値の生成にmwc-random パッケージの System.Random.MWC.createSystemRandom で生成した GenIO を、全体を通して利用する環境として Reader モナドに入れて使いまわしていたとします
ここにSTM で並列処理機能を新規に追加する場合、forkIO したスレッド内で一々そのスレッド専用に GenIO を生成し直すべきでしょうか?
というのは、それをしないと
各スレッドで共通の GenIO がコピーされ使用される場合、各スレッドで同じ値が生成されていってしまいランダムの意味をなさないのではないかと思うからです
ではこの疑似ランダム生成器を TVar に入れるかとなると、資源の取り合いになって、1スレッド時よりパフォーマンスが低下して元も子もないではないかという懸念があります
ここまで思考実験すると、やはり forkIO したスレッド毎に一々、その中で専用の疑似ランダム生成器を新調する必要があるという考えに至りました
スレッド数が多くなると疑似ランダム生成器を作るコストがバカにならなくなっていくでしょうが、その辺は頑張るしかないよということで、ぼくの考えは合っていますか?
909デフォルトの名無しさん
2021/09/26(日) 21:46:38.01ID:m/60KM4j >>908
そこまでしっかり考察したのなら、質問する前にまず実験してみようよ。
そこまでしっかり考察したのなら、質問する前にまず実験してみようよ。
910デフォルトの名無しさん
2021/09/27(月) 16:47:57.85 >>909
実験してみたら、各スレッドで別の値が生成されていました
しかしドキュメント見ると It uses mutable state so same generator shouldn't be used from the different threads simultaneously.と書いてあるんですが
これはどう受け取ったらいいんですかね
各スレッドで別の値が生成されているなら用を為してる(ように思える)からいいじゃないかとも思うのですが
何か別の理由があって、そう思えてもやはり使うなという事なんでしょうか?
実験してみたら、各スレッドで別の値が生成されていました
しかしドキュメント見ると It uses mutable state so same generator shouldn't be used from the different threads simultaneously.と書いてあるんですが
これはどう受け取ったらいいんですかね
各スレッドで別の値が生成されているなら用を為してる(ように思える)からいいじゃないかとも思うのですが
何か別の理由があって、そう思えてもやはり使うなという事なんでしょうか?
911デフォルトの名無しさん
2021/09/27(月) 18:11:25.46ID:XYchXu+H >>910
mutable stateの排他制御をしてないから複数のスレッドで実行するとまずいことが起こるかもしれない、ってことじゃないの?
排他制御
https://ja.wikipedia.org/wiki/%E6%8E%92%E4%BB%96%E5%88%B6%E5%BE%A1
mutable stateの排他制御をしてないから複数のスレッドで実行するとまずいことが起こるかもしれない、ってことじゃないの?
排他制御
https://ja.wikipedia.org/wiki/%E6%8E%92%E4%BB%96%E5%88%B6%E5%BE%A1
912デフォルトの名無しさん
2021/09/27(月) 20:38:39.08ID:MDVYajz0913デフォルトの名無しさん
2021/09/29(水) 15:57:53.68ID:lU7q1h04914デフォルトの名無しさん
2021/09/30(木) 07:09:39.49ID:N1l0weLI915デフォルトの名無しさん
2021/09/30(木) 09:21:54.92ID:LH+TfD4u すべからく警察だ!
916デフォルトの名無しさん
2021/09/30(木) 09:22:48.41 >>911
具体的にどういうケースでどういう問題が起こるか解らないので、取り敢えずドキュメントにスレッド間で共有はやめろとある以上、大人しく従うことにします
>>912
STM版が、3950Xエコモードシングル500分の処理が30スレッド割り当てで220分くらいになりましたが
CPU使用率も75%前後で残念でした
競合するリソースが多過ぎたからではと思い、競合を避ける事を考えていると
そもそもSTMを使わず、スレッド毎にローカルにデータを貯めて処理して最後に各スレッドで部分的に仕上げたデータをChanで流して
、受信した側でデータを総括する、初歩的な方式を思いついたので書き換えました
getChanContentsを使いましたが、EOFみたいな最後の通知方法が判らずに、全スレッドの処理が終わりもう誰もデータを流すことのないチャネルから性懲りもなく読みだそうとしてしまい
例外が発生して困っていました
幸いスレッドの数は判っているのでチャネルからtakeする数をスレッド数ちょっきりとして切り上げた所、遅延評価が幸いしてその先を読もうとしなくなり例外は発生しなくなりました(本質的解決かは判りません)
これにより処理が18分で終わりました
スレッド毎にcreateSystemRandomするように書き換えると21分かかるようになりました
オーバヘッド込みでも500分かかっていた時代から驚異的な進化を遂げました
憧れだった Software Transactional Memory は期待程速くなくがっかりしました
STMは最初に検討するべきではなく、巧く競合が発生しないように書けないときの最後の手段なのかなと思いました
具体的にどういうケースでどういう問題が起こるか解らないので、取り敢えずドキュメントにスレッド間で共有はやめろとある以上、大人しく従うことにします
>>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:33.11ID:Ai6xyiAS 物理cpuが四つとかの擬似マルチスレッドではそんなに早くならないと思ってたけど、ものによってはそんなにも早くなるもんなんだな
918デフォルトの名無しさん
2021/10/04(月) 21:32:31.29ID:zxVeK0W2 と思ったら3950x gpuでほんとに物理スレッドがたくさんある場合の話か
919デフォルトの名無しさん
2021/10/05(火) 23:20:55.55ID:75xrYyRf920デフォルトの名無しさん
2021/10/06(水) 01:58:31.84ID:3ymQugFf921デフォルトの名無しさん
2021/10/06(水) 22:57:04.48ID:MRfRTuXd 関数モナドと同じように、引数一つ取るモナド作ったらambiguousって怒られるかなと思ったんだけど、コンストラクタ書かないとならないからうまくいかない。
この値は関数モナドにしか解決されないのかな
この値は関数モナドにしか解決されないのかな
922デフォルトの名無しさん
2021/10/07(木) 09:52:08.72ID:AVdaEi5L C++のoperator()()に相当する演算を多重定義できないので曖昧ではない
923デフォルトの名無しさん
2021/10/17(日) 18:41:32.26ID:DQz0YbVB なんjでめんだこって言う女装子がhaskell勉強していてdao of functional programmingっていう海外の人が書いた文献がわかりやすいってことでそれ読んでいるらしいが
ここの人にもそれ読んでいる人いる?
ここの人にもそれ読んでいる人いる?
924デフォルトの名無しさん
2021/10/17(日) 20:11:52.85ID:LTEsEtXo これか
The Dao of Functional Programming
https://github.com/BartoszMilewski/Publications/blob/master/TheDaoOfFP/DaoFP.pdf
圏論関係の内容だな
The Dao of Functional Programming
https://github.com/BartoszMilewski/Publications/blob/master/TheDaoOfFP/DaoFP.pdf
圏論関係の内容だな
925デフォルトの名無しさん
2021/10/17(日) 20:37:14.39ID:DQz0YbVB926デフォルトの名無しさん
2021/10/17(日) 21:08:39.75ID:LTEsEtXo プログラミングの本質を学ぶには圏論について学ぶ必要があるということらしい
学んですぐ役立つというものではないようで、すぐ役立つ知識がお望みなら他をあたってくれ、とか
学んですぐ役立つというものではないようで、すぐ役立つ知識がお望みなら他をあたってくれ、とか
927デフォルトの名無しさん
2021/10/17(日) 23:35:51.47ID:QqhGhKAl 見せてもらおうか、圏論とやらを。
928デフォルトの名無しさん
2021/10/18(月) 00:33:18.04ID:BIt/UTxD929デフォルトの名無しさん
2021/10/18(月) 02:49:04.06ID:mrfOLNSK また圏論か
もういいよ
もういいよ
930デフォルトの名無しさん
2021/10/18(月) 12:08:52.29ID:7GcdH/zA さあ ねがいを いえ
931デフォルトの名無しさん
2021/10/18(月) 15:15:47.20ID:r9t2S6+p932デフォルトの名無しさん
2021/10/22(金) 12:14:30.91ID:9P3eVRHd Free monad とは何か? の、シンプルかつ的を射た説明がsrackoverflowにあった。
(John Wiegley の回答)
https://stackoverflow.com/questions/13352205/what-are-free-monads
これを読んでから他の色んなFree monadの記事を読むと、すんなり理解できる。
これ、本質がよく解っている人の回答だよね。
こんな格好良く回答ができるよう精進したい。
(John Wiegley の回答)
https://stackoverflow.com/questions/13352205/what-are-free-monads
これを読んでから他の色んなFree monadの記事を読むと、すんなり理解できる。
これ、本質がよく解っている人の回答だよね。
こんな格好良く回答ができるよう精進したい。
933デフォルトの名無しさん
2021/10/22(金) 21:20:57.92 UTF-8 のHaskell ソースコードに書き込んだ日本語文字列を通信先に渡す為に Shift_JIS の String にしたいのですが
module Main where
import Data.Text.ICU.Convert as ICU
import Data.Text as T
import Data.ByteString.Char8 as BS
main :: IO ()
main = do
conv <- open "Shift_JIS" Nothing
let
utf8txt = T.pack "皆は、赤ちゃんしゅきぃ?"
sjis_bs = fromUnicode conv utf8txt
この sjis_bs をどうしたら Shift_JIS の String になるんですか?
BS.unpack だと
ツ皆ツづ債、ツ静板つソツづ。ツづアツつオツづ」ツつォツつ。ツ?
になってしまいます
module Main where
import Data.Text.ICU.Convert as ICU
import Data.Text as T
import Data.ByteString.Char8 as BS
main :: IO ()
main = do
conv <- open "Shift_JIS" Nothing
let
utf8txt = T.pack "皆は、赤ちゃんしゅきぃ?"
sjis_bs = fromUnicode conv utf8txt
この sjis_bs をどうしたら Shift_JIS の String になるんですか?
BS.unpack だと
ツ皆ツづ債、ツ静板つソツづ。ツづアツつオツづ」ツつォツつ。ツ?
になってしまいます
934デフォルトの名無しさん
2021/10/22(金) 23:18:21.74ID:5ielnrPe haskellってpythonに影響与えてるんやな
どおりで雰囲気似てる感じするんか
どおりで雰囲気似てる感じするんか
935デフォルトの名無しさん
2021/10/23(土) 01:09:52.51ID:o3xA5lbA レイアウトと呼ばれるインデントスタイルは、Pythonが1991年に最初にリリースであり、85年以前にあった
Mirandaを参考に1990年にHaskellは登場したはず。
Mirandaを参考に1990年にHaskellは登場したはず。
936デフォルトの名無しさん
2021/10/29(金) 12:55:32.45ID:SqmTIce6 不動点演算子がわからなくて泣ける
再帰呼び出しになってないのに再帰になってるのはわかるんだけど
再帰呼び出しになってないのに再帰になってるのはわかるんだけど
937デフォルトの名無しさん
2021/10/29(金) 18:35:44.90ID:ZN5Hp6rJ >>936
何が分からないのか分からない
何が分からないのか分からない
938デフォルトの名無しさん
2021/10/29(金) 18:40:46.51ID:uCUCIWXe939デフォルトの名無しさん
2021/10/29(金) 20:05:05.45ID:1mMf/Evz 遅延評価の才能がないと x = f x を思いつかないんだよな
y f = f (y f) しか分からない
y f = f (y f) しか分からない
940デフォルトの名無しさん
2021/10/29(金) 21:04:54.17ID:ZN5Hp6rJ941デフォルトの名無しさん
2021/11/05(金) 06:38:08.04ID:UB8UVAT8942デフォルトの名無しさん
2021/11/14(日) 05:07:45.42ID:HK5ctRa0943デフォルトの名無しさん
2021/11/14(日) 21:26:09.61ID:bsdXePE0 なんで消すの?
944デフォルトの名無しさん
2021/11/15(月) 02:14:35.96ID:jBQU3T8q >>943
Applicativeクラスにpure関数があるから。
Monad則やApplicative則を満たしてるなら、
まず間違いなく pure = return だから片方で充分。
それにreturnって名前があまりに実態とかけ離れてるしね。
Applicativeクラスにpure関数があるから。
Monad則やApplicative則を満たしてるなら、
まず間違いなく pure = return だから片方で充分。
それにreturnって名前があまりに実態とかけ離れてるしね。
945デフォルトの名無しさん
2021/11/15(月) 12:46:13.83ID:KyLp+2Ep 初歩的な質問ですが、複数の設定ファイル読み込みするのに
readFile で全体取得してから処理するのと
withFile で hGetLine しながら処理するのではどちらがいいとかありますか?
主に処理速度の点について聞きたいです。
readFile で全体取得してから処理するのと
withFile で hGetLine しながら処理するのではどちらがいいとかありますか?
主に処理速度の点について聞きたいです。
946デフォルトの名無しさん
2021/11/15(月) 18:22:40.27ID:W9vQbDtp >>945
そういうのは、自分で実験すればすぐに確かめられるのでは?
そういうのは、自分で実験すればすぐに確かめられるのでは?
947デフォルトの名無しさん
2021/11/15(月) 21:51:56.85ID:NLyY6NK4 >>944
Applicativeにpureがあるのはなんで?
Monadのreturnだけにするのは変ですか?
零元がApplicativeの責務なのがピンときてないんです。Monadだと何と合わないんでしょう
Applicativeにpureがあるのはなんで?
Monadのreturnだけにするのは変ですか?
零元がApplicativeの責務なのがピンときてないんです。Monadだと何と合わないんでしょう
948デフォルトの名無しさん
2021/11/16(火) 02:22:00.49ID:EE8p/B0u949デフォルトの名無しさん
2021/11/16(火) 21:38:06.78ID:au51kzu/ 正確に綴ってくれ
950デフォルトの名無しさん
2021/11/16(火) 22:40:31.75ID:t6DDIn3B 読んでみたけどよくわかんないなあ。AMPを満たすためにApplicative m => Monad mが必要ってことは書いてあるようだけど
Monadからreturnを削除して、pureに統一する理由って書いてあるかな?
読み飛ばしたかもしれんけど。
return = pureだから、統一しても同じっていうのは分かるんだけど、Applicativeにpureが必要な理由がわからない。
Applicativeの4つのルールを満たすためにpureが必要なことは、Applicativeの定義に書いてあるけど、圏論わかんないから、このルールが何で必要なのか分からん。
Monoidal Functor?とかいうやつの表現のために単位元(零元じゃなかったね)が必要なんだろうけど、圏論わからんないから分からん。
Monoidと関係あるんだろうか。それなら加法のために単位元が必要なのはわかるんだけど。
Monadからreturnを削除して、pureに統一する理由って書いてあるかな?
読み飛ばしたかもしれんけど。
return = pureだから、統一しても同じっていうのは分かるんだけど、Applicativeにpureが必要な理由がわからない。
Applicativeの4つのルールを満たすためにpureが必要なことは、Applicativeの定義に書いてあるけど、圏論わかんないから、このルールが何で必要なのか分からん。
Monoidal Functor?とかいうやつの表現のために単位元(零元じゃなかったね)が必要なんだろうけど、圏論わからんないから分からん。
Monoidと関係あるんだろうか。それなら加法のために単位元が必要なのはわかるんだけど。
951デフォルトの名無しさん
2021/11/16(火) 22:42:08.60ID:t6DDIn3B 誰か噛み砕いて教えて下さい
952デフォルトの名無しさん
2021/11/17(水) 06:46:33.09ID:4zMdVbrs より抽象度の高い方であるApplicativeのpureを生かすのは
私はごく自然に感じるけど
mappendと<>も機能的にダブってるから
将来Monoidからmappendが消えるよって
Monoidのドキュメントに書いてあるけど
もしかしてそれも疑問だったりする?
Semigroupの方から<>を消して、
Monoidのmappendを残すんじゃダメなの? って
私はごく自然に感じるけど
mappendと<>も機能的にダブってるから
将来Monoidからmappendが消えるよって
Monoidのドキュメントに書いてあるけど
もしかしてそれも疑問だったりする?
Semigroupの方から<>を消して、
Monoidのmappendを残すんじゃダメなの? って
953デフォルトの名無しさん
2021/11/17(水) 08:05:13.47ID:fLzDfeGp >>950
圏論は一切関係なく、いかに誤りの無いプログラムが書けるか、
またソースコードが読みやすくなるかという実用的な理由です。
そういう観点でもう一度読んでみてください。
Haskellは実用的な汎用プログラミング言語であることを目指して作られました。
なので、今回のような理由での提案は個人的にはすごく納得できるし、大賛成です。
圏論は一切関係なく、いかに誤りの無いプログラムが書けるか、
またソースコードが読みやすくなるかという実用的な理由です。
そういう観点でもう一度読んでみてください。
Haskellは実用的な汎用プログラミング言語であることを目指して作られました。
なので、今回のような理由での提案は個人的にはすごく納得できるし、大賛成です。
954デフォルトの名無しさん
2021/11/17(水) 12:44:32.78ID:f9gix7Cx コメントありがとです。
Semigroupは半群、Monoidは単位元付きの半群ですよね。
言われてみると、<>に統一してmappendは消しても自然な気がする。
すごいHでログ文字列がmappendで追加されていく、サンプルを読んだことがあるので、Monoidは受け入れやすいんです。
Semigroupに単位元がないことは不思議に思わないです。半群というものを聞いたことがあったのと、
ログの例に戻ると、文字列なしのログはありえないと考えれば、単位元がないMonoidがあってもあまり不思議に思わないです。
言ってることが上と変わってきてるかもしれないですが、Applicativeが不思議に思うのは、ここに単位元?(というか単位元を生成する)pureがあること。
Applicativeの結合<*>って持ち上げられた型だけで構成されてます: f (a -> b) -> f a -> f b。
圏論何も知らないで言いますが、単位元pureは持ち上げられた型f aが自然な気がするんです。a -> f aではなく。
雰囲気でそう感じてるだけですが。
そんでもって、a -> f aが登場するのって、Monad.(>>=)だよなあってことで、だったら、returnがMonadにあるのは自然なんじゃないかな、と思うわけです。
そうすると、pureってなんのためにあるんだろう。同じ型ならMonadだけあるほうが自然だなと感じたわけです。
たぶんこれは圏論を知っていれば、変に思わないのかなと思って、そう言ったわけです。
推敲できてない感ありますが、伝わりますかね?
Semigroupは半群、Monoidは単位元付きの半群ですよね。
言われてみると、<>に統一してmappendは消しても自然な気がする。
すごいHでログ文字列がmappendで追加されていく、サンプルを読んだことがあるので、Monoidは受け入れやすいんです。
Semigroupに単位元がないことは不思議に思わないです。半群というものを聞いたことがあったのと、
ログの例に戻ると、文字列なしのログはありえないと考えれば、単位元がないMonoidがあってもあまり不思議に思わないです。
言ってることが上と変わってきてるかもしれないですが、Applicativeが不思議に思うのは、ここに単位元?(というか単位元を生成する)pureがあること。
Applicativeの結合<*>って持ち上げられた型だけで構成されてます: f (a -> b) -> f a -> f b。
圏論何も知らないで言いますが、単位元pureは持ち上げられた型f aが自然な気がするんです。a -> f aではなく。
雰囲気でそう感じてるだけですが。
そんでもって、a -> f aが登場するのって、Monad.(>>=)だよなあってことで、だったら、returnがMonadにあるのは自然なんじゃないかな、と思うわけです。
そうすると、pureってなんのためにあるんだろう。同じ型ならMonadだけあるほうが自然だなと感じたわけです。
たぶんこれは圏論を知っていれば、変に思わないのかなと思って、そう言ったわけです。
推敲できてない感ありますが、伝わりますかね?
955デフォルトの名無しさん
2021/11/17(水) 12:50:22.84ID:f9gix7Cx ちなみに自分は、自分の価値観に反してるから却下すべきだと言ってるのではなくて、
どうしてこういう構造が正しいの?実際の理論やコードでの利用例に照らしてどんな利点や意味があるのと知りたいだけです。
どうしてこういう構造が正しいの?実際の理論やコードでの利用例に照らしてどんな利点や意味があるのと知りたいだけです。
956デフォルトの名無しさん
2021/11/17(水) 15:59:19.97ID:oGkdvxh0 そもそもapplicativeなるものが数学の圏論的に何意味するかよくわからんのだよな
monadの方はwikiのmonad (category theory)の項があってキッチリ解説されてるし
https://en.m.wikipedia.org/wiki/Monad_(category_theory)
Tがcategory C上のmonadであるときfmap Tをμ。η_Tで定めればコレがfunctor C→Cを定義するのもわかるんだけど、applicativeについておんなじような解説が中々見当たらない
どっかでDescartes closed categoryがどうたらいうのを見た事あるんだけど誰か知りません?
monadの方はwikiのmonad (category theory)の項があってキッチリ解説されてるし
https://en.m.wikipedia.org/wiki/Monad_(category_theory)
Tがcategory C上のmonadであるときfmap Tをμ。η_Tで定めればコレがfunctor C→Cを定義するのもわかるんだけど、applicativeについておんなじような解説が中々見当たらない
どっかでDescartes closed categoryがどうたらいうのを見た事あるんだけど誰か知りません?
957デフォルトの名無しさん
2021/11/17(水) 16:59:55.76ID:fpCU2YNN 「アプリカティブ関手はモノイド圏における強laxモノイド関手だよ、何か問題でも?」
https://blog.miz-ar.info/2018/12/applicative-functor/
https://blog.miz-ar.info/2018/12/applicative-functor/
958デフォルトの名無しさん
2021/11/17(水) 17:27:50.45ID:f9gix7Cx >>956
多分これの概要部分は見てるんですよね。
https://en.m.wikipedia.org/wiki/Applicative_functor
後ろの方はさておき、概要部分は自分はさっぱりでしたが。
多分これの概要部分は見てるんですよね。
https://en.m.wikipedia.org/wiki/Applicative_functor
後ろの方はさておき、概要部分は自分はさっぱりでしたが。
959デフォルトの名無しさん
2021/11/30(火) 20:23:52.94ID:SegqCGCa haskell勉強しようかなって思ってるんですけどおすすめ書籍ってなにかありませんか?
ちなみにocamlでプログラム書いたことあります
型システム入門を原文で7割ほど読破しました
ちなみに大学受験の数学はそこそこ自信あります
一階述語論理の記号扱って解いていました
圏論の知識はありません
ちなみにocamlでプログラム書いたことあります
型システム入門を原文で7割ほど読破しました
ちなみに大学受験の数学はそこそこ自信あります
一階述語論理の記号扱って解いていました
圏論の知識はありません
960デフォルトの名無しさん
2021/11/30(火) 20:27:04.88ID:SegqCGCa ちなみにモナドは日本語版wikipediaの記事を読んだのみです
型クラスはわかります
MaybeまではわかりましたがIOモナドで躓きました
ocamlとは違って参照型がない言語だってことは意外に思いました
型クラスはわかります
MaybeまではわかりましたがIOモナドで躓きました
ocamlとは違って参照型がない言語だってことは意外に思いました
961デフォルトの名無しさん
2021/12/02(木) 00:19:03.82ID:c82IwjxK (>>=)がただのデータコンストラクタだったらモナドはただの構文木なのに
data M b = Bind (M a) (a -> M b) | ...
みたいな定義ができない型システムだから
代数的データ型を使わないでラムダをたくさん使うことになってみんな躓く
data M b = Bind (M a) (a -> M b) | ...
みたいな定義ができない型システムだから
代数的データ型を使わないでラムダをたくさん使うことになってみんな躓く
962デフォルトの名無しさん
2021/12/02(木) 13:13:42.19ID:kpMV/tat そりゃそうやろ?
データコンストラクタと展開されるべき関数の違いをプログラマが指定しなければ処理系は与えられたexpressionをどこまで展開すべきか決定できんやろ?
データコンストラクタと展開されるべき関数の違いをプログラマが指定しなければ処理系は与えられたexpressionをどこまで展開すべきか決定できんやろ?
レス数が950を超えています。1000を超えると書き込みができなくなります。
ニュース
- 小野田紀美・経済安保担当相「何か気に入らないことがあればすぐに経済的威圧をする国への依存はリスク」 ★2 [Hitzeschleier★]
- 日本行き空路49万件キャンセル 中国自粛呼びかけ 日本行きチケット予約の約32%に相当 ★2 [ぐれ★]
- 【中国局長】両国関係に「深刻な影響」 首相発言の撤回要求 [蚤の市★]
- 外務省局長は無言で厳しい表情…日中の高官協議終了か 高市首相“台湾”発言で中国が強硬対応 発言撤回求めたか…★3 [BFU★]
- 日経平均の下落率3%超す、財政懸念で長期金利上昇 ★2 [お断り★]
- 【インバウンド】中国人観光客の日本での消費額は年間約2兆円超…中国政府は公務員の出張取り消し [1ゲットロボ★]
- 【実況】博衣こよりのえちえち歌枠🧪
- 【高市速報】日本人の3割「中国への武力行使に踏み切る必要がある」ANN世論調査 [931948549]
- 【雑談】暇人集会所part18
- 高市早苗「支持者の理解を得られないので台湾発言を撤回できない」 [931948549]
- 外務省局長、よくわからないまま帰国へ [834922174]
- 中国外務省「日中関係の悪化は高市早苗首相が原因」と名指しで強く非難。キタ━(゚∀゚)━! [153490809]
