関数型プログラミング言語Haskell Part32
: デフォルトの名無しさん [ageteoff] 2019/01/29(火) 09:05:47.90:gJP/u7IJ 関数型プログラミング言語 Haskell について語るスレです。 haskell.org (公式サイト) ttp://https://www.haskell.org/ 日本Haskellユーザーグループ ttp://https://haskell.jp/ 前スレ 関数型プログラミング言語Haskell Part31 ttps://mevius.5ch.net/test/read.cgi/tech/1506447188/ : デフォルトの名無しさん [ageteoff] 2019/01/29(火) 09:06:37.34:gJP/u7IJ 過去スレ一覧 30) ttp://mevius.2ch.net/test/read.cgi/tech/1484491434/ 29) ttp://peace.2ch.net/test/read.cgi/tech/1436869629/ 28) ttp://peace.2ch.net/test/read.cgi/tech/1428535861/ 27) ttp://peace.2ch.net/test/read.cgi/tech/1420718555/ 26) ttp://peace.2ch.net/test/read.cgi/tech/1406436392/ 25) ttp://peace.2ch.net/test/read.cgi/tech/1393313450/ 24) ttp://toro.2ch.net/test/read.cgi/tech/1382705669/ 23) ttp://toro.2ch.net/test/read.cgi/tech/1376111807/ 22) ttp://toro.2ch.net/test/read.cgi/tech/1364009659/ 21) ttp://toro.2ch.net/test/read.cgi/tech/1358702176/ 20) ttp://toro.2ch.net/test/read.cgi/tech/1350428908/ 19) ttp://toro.2ch.net/test/read.cgi/tech/1340760070/ 18) ttp://toro.2ch.net/test/read.cgi/tech/1331902463/ 17) ttp://toro.2ch.net/test/read.cgi/tech/1325510368/ 16) ttp://toro.2ch.net/test/read.cgi/tech/1317958045/ 15) ttp://hibari.2ch.net/test/read.cgi/tech/1310199414/ 14) ttp://hibari.2ch.net/test/read.cgi/tech/1299385928/ 13) ttp://hibari.2ch.net/test/read.cgi/tech/1286706874/ 12) ttp://hibari.2ch.net/test/read.cgi/tech/1272536128/ 11) ttp://pc12.2ch.net/test/read.cgi/tech/1252382593/ 10) ttp://pc12.2ch.net/test/read.cgi/tech/1231861873/ 09) ttp://pc11.2ch.net/test/read.cgi/tech/1211010089/ 08) ttp://pc11.2ch.net/test/read.cgi/tech/1193743693/ 07) ttp://pc11.2ch.net/test/read.cgi/tech/1174211797/ 06) ttp://pc11.2ch.net/test/read.cgi/tech/1162902266/ 05) ttp://pc8.2ch.net/test/read.cgi/tech/1149263630/ 04) ttp://pc8.2ch.net/test/read.cgi/tech/1140717775/ 03) ttp://pc8.2ch.net/test/read.cgi/tech/1076418993/ 02) ttp://pc2.2ch.net/test/read.cgi/tech/1013846140/ 01) ttp://pc.2ch.net/tech/kako/996/996131288.html : デフォルトの名無しさん [ageteoff] 2019/01/29(火) 09:07:46.66:gJP/u7IJ 関連サイト (英語) Haskell - Wikibooks, open books for an open world (ページ内に内容をまとめたPDFあり) ttp://https://en.wikibooks.org/wiki/Haskell Learn You a Haskell for Great Good! (『すごいHaskellたのしく学ぼう!』の無料オンライン版) ttp://http://learnyouahaskell.com/chapters Real World Haskell (同名書籍の無料オンライン版) ttp://http://book.realworldhaskell.org/read/ (以下、日本語) Haskell入門 5ステップ - HaskellWiki (公式サイト内、日本語入門セクション) ttp://https://wiki.haskell.org/Haskell%E5%85%A5%E9%96%80_5%E3%82%B9%E3%83%86%E3%83%83%E3%83%97 Haskell - Wikibooks (上記Wikibooksの同タイトル日本語版。多くの項目が未編集) ttp://https://ja.wikibooks.org/wiki/Haskell Programming in Haskell ttp://http://www.sampou.org/cgi-bin/haskell.cgi Haskell のお勉強 ttp://http://www.shido.info/hs/ Haskell Programming ttp://http://www.geocities.jp/m_hiroi/func/haskell.html 本物のプログラマはHaskellを使う:ITpro ttp://http://itpro.nikkeibp.co.jp/article/COLUMN/20060915/248215/ [入門]関数プログラミング―質の高いコードをすばやく直感的に書ける! ttp://http://gihyo.jp/dev/feature/01/functional-prog : デフォルトの名無しさん [sage] 2019/01/31(木) 07:01:01.92 手続き型でゴリゴリやってきた人にとって関数型は マラソンの選手に、匍匐前進と水泳で近道するよう強制しているかのようです : デフォルトの名無しさん [] 2019/01/31(木) 07:24:27.44:4JULsXj7 手前味噌ですが、Haskell入門以前と言う電子書籍をAmazonでご購入下さい。 まさに貴方のような方に関数脳を作ってもらうための本です^^ : デフォルトの名無しさん [sage] 2019/01/31(木) 20:10:32.50:KXLDvKfy IOモナドは手続きモナド : デフォルトの名無しさん [sage] 2019/02/01(金) 07:26:12.68:L0GRy80q 初心者がHaskellでオンライン問題集みたいなの解いてんだけど Haskellでやるとこういうの楽しくてええな : デフォルトの名無しさん [sage] 2019/02/02(土) 00:12:37.55 CPS書き換えドリル 次の英文を○○構文を用いて同じ意味の英文に書き換えなさい的な : デフォルトの名無しさん [sage] 2019/02/03(日) 12:58:27.43:5bolWXfM haskell紹介してるブログとか色々あるけどどこも肝心要のところがすっぽり抜けててイライラするな・・ 例えば fact 0 = 1 fact n = n * fact(n - 1) これ無限ループになっちゃって終わらないでしょ終端条件も書いてないし。 fact 3を展開すると 3 * ( 2 * ( 1 * ( 1 * ……… 0を入力すれば1になるってことはこの先ずーっと1が繰り返されるだけだし。 同じ値が2度続いたら処理を止めるとか変な仕組みでも入ってるのかねー : デフォルトの名無しさん [sage] 2019/02/03(日) 14:29:08.38:0VpSvizO 自分で動かしてみればわかるけど ちゃんと終わるよ ttp://https://wandbox.org/permlink/goI0n8nF0ac90ofx : ◆QZaw55cn4c [sage] 2019/02/03(日) 15:04:51.94:t4xt++Qj >無限ループになっちゃって終わらないでしょ終端条件も書いてないし。 いえいえ、終端条件が >fact 0 = 1 です、n ∈ N たる n からはじまって 0 で終わる、と読みます fact 3 = 3 * fact 2 = 3 * 2 * fact 1 = 3 * 2 * 1 * fact 0 = 3 * 2 * 1 * 1 で止まります. : デフォルトの名無しさん [sage] 2019/02/03(日) 15:10:17.81:DVkCUlxV 恥ずかしいぞ >fact 0 = 1 で、これ以上再帰してないじゃん : デフォルトの名無しさん [sage] 2019/02/03(日) 20:51:10.38:5bolWXfM それじゃ納得できないんだけども 終わるから大丈夫仕様ですってもやっとするから で書いたように1が無限に続いちゃうと思うんだけどな 0が入力されたら1を返すってことだから 1 - 1でまた繰り返しちゃうよね そもそもどの値が来たら終わるか全く記述がないよね そういうところも納得できないっていうかおかしい : デフォルトの名無しさん [sage] 2019/02/03(日) 21:08:06.34:RwDwNYzW が説明してくれたとおりなのだけど、納得できない? : デフォルトの名無しさん [sage] 2019/02/03(日) 21:13:08.06:5bolWXfM あの説明で納得するようならここ来てないから あれだとブログの説明と何も変わらない まさか1かtrueを返したら問答無用で終わる仕様だったりするのかねー : デフォルトの名無しさん [sage] 2019/02/03(日) 21:15:44.35:DVkCUlxV ああ 言っている意味は分かったけど 続かねーぞ よく考えてみ 恥ずかしい思いするだろうけど っていうか、のひとが書いてるじゃん fact 1 = 1 * fact 0 = 1 * 1 で終了だろ これ納得できないとしたら、別のところで引っかかっている パターンマッチを理解していないとか : デフォルトの名無しさん [sage] 2019/02/03(日) 21:18:28.59:DdA3Wm74 バカで思い込みが激しいって最悪だぞ?どっちかにしろ。 : デフォルトの名無しさん [sage] 2019/02/03(日) 21:19:06.57:5bolWXfM それじゃ終わらない 終了条件が書いていないから なんどもいうように * 1がずーっと続くようにしか見えない だからこの例題見たときにイライラしてたんだよね 前提となってる仕様があるけど説明省いたとかそれ系かなと : ◆QZaw55cn4c [sage] 2019/02/03(日) 21:19:41.63:t4xt++Qj では逆に質問しましょうか、そこから両者が部分的にでも合意できるポイントを探ることにしましょう >fact 0 = 1 >fact n = n * fact(n - 1) これをあなたはどのように解釈したかを、もう少し詳しめに記述していただくことは可能でしょうか、私の記述は今は が精一杯ですが、あなたの返答をみて改善できる点はないか検討したいと思います : デフォルトの名無しさん [sage] 2019/02/03(日) 21:20:07.09:RwDwNYzW ほとんど同じ説明だが… 関数の定義が fact 0 = 1 fact n = n * fact(n - 1) となっている。 このとき、左辺が右辺に置き換えられる (簡約という) つまり fact 3 は 3 * fact 2 に置き換えられる そして fact 2 は 2 * fact 1 に置き換えられる そして fact 1 は 1 * fact 0 に置き換えられる ひとつめの関数の定義により、fact 0 は 1 に置き換えられるので 置き換えはここでとまる 以上をまとめると fact 3 = 3 * fact 2 = 3 * 2 * fact 1 = 3 * 2 * 1 * fact 0 = 3 * 2 * 1 * 1 = 6 : デフォルトの名無しさん [] 2019/02/03(日) 21:22:45.27:I0qputsI fact 0で問答無用で終わる仕組みですが。。。 以上にやさしい説明はないと思われ。 普通の言語(ここで : ◆QZaw55cn4c [sage] 2019/02/03(日) 21:22:54.49:t4xt++Qj 終了条件は >fact 0 = 1 です。関数 fact の引数が 0 なら、1 を関数の値として返し、fact の求値作業は終了します。 fact への入力が 1 でないならば >fact n = n * fact(n - 1) の定義をつかって、最初の入力 n よりも小さい値 n - 1 (< n) を使った関数定義がつかえるように変換します : デフォルトの名無しさん [sage] 2019/02/03(日) 21:25:18.35:5bolWXfM 理解したのはの通りで 仮定として1かtrueを返したら再帰は止まる仕様になってると推測してる だからfact(1)で無限に続いちゃうよね 1 - 1で fact 0をevalしてまたfact(1)になる そこで終了条件が必要だけど何にも書いてないから記述通りならずーっと続く としか見えないんだよね : デフォルトの名無しさん [sage] 2019/02/03(日) 21:26:42.72:DVkCUlxV いやだから fact 1 で1が出てくる でまた、fact 1になって永遠に続くとかの勝手な思い込みでしょ あるいは、 fact 0 =1 になるから、また fact 1 -1 になると思ってるとか だから、永遠に1が続くと勘違いしちゃっている : デフォルトの名無しさん [sage] 2019/02/03(日) 21:27:00.44:5bolWXfM ということはやっぱり1を返したら必ず再帰は止まる仕様であってるのかな? だったらすっきりするんだけども : デフォルトの名無しさん [sage] 2019/02/03(日) 21:28:01.94:DVkCUlxV >1 - 1で fact 0をevalしてまたfact(1)になる ならねーよ そこが恥ずかしいところだ : デフォルトの名無しさん [] 2019/02/03(日) 21:29:01.89:I0qputsI 途中で。。。 まあいい。 Pythonでも再帰出来る。 特別な話じゃない。 def fact(n): if n == 0: return 1 else: return (n * fact(n - 1)) : デフォルトの名無しさん [sage] 2019/02/03(日) 21:29:11.55:RwDwNYzW > >だからfact(1)で無限に続いちゃうよね >1 - 1で fact 0をevalしてまたfact(1)になる >そこで終了条件が必要だけど何にも書いてないから記述通りならずーっと続く そうはならない fact 1 = 1 * fact 0 に簡約される そして fact 0 = 1 であって fact 0 = 0 * fact(0 - 1) とは絶対にならないからここで終わる 高校数学がわかるなら、漸化式と同じだと思えばよい : デフォルトの名無しさん [sage] 2019/02/03(日) 21:30:12.31:RwDwNYzW そうそう。そのとおり。 : ◆QZaw55cn4c [sage] 2019/02/03(日) 21:31:19.47:t4xt++Qj >1 - 1で fact 0をevalしてまたfact(1)になる >fact 0 = 1 というのは、関数 fact のうち fact(0) (引数が 0) のときの値は 1 である、と確定的な記述をしています。ここで答えが決まったので、さらに答えを求めるための関数適用作業には入りません、それはそういう意味です どうして eval したあと fact(1) になる、と判断したのでしょうか? fact(0) = 1 の 1 というのは fact() の値であって、fact の引数ではなく、また fact の引数になりうる記述は 「fact 0 = 1」という記述の中には見つからないのですが >fact n = n * fact (n - 1) この記述のなかには、たとえば 引数が 7 だとすると「 fact 8 を fact 7 の値をつかって表現する」ということですから、fact 8 を eval する「途中で」 fact 7 を eval しようとする、ということは書かれています : デフォルトの名無しさん [] 2019/02/03(日) 21:32:49.38:I0qputsI その考えであってる。 : ◆QZaw55cn4c [sage] 2019/02/03(日) 21:32:49.97:t4xt++Qj 「1 を返したら」とまるのではなく fact 0 = 1 と fact の求値が、この行で確定しているから、止まるのです。 fact 0 = 100 という定義であっても、とまりますよ : デフォルトの名無しさん [sage] 2019/02/03(日) 21:33:05.02:5bolWXfM いやいやfact(1)の評価は0なんだし fact 0の定義があるからまた1 どう考えても続くんだよね そもそも再起から脱出するためのコードがどこにもないから怪しいとも踏んでる 何か前提となってる仕様がありそうだ : デフォルトの名無しさん [sage] 2019/02/03(日) 21:34:47.28:5bolWXfM やっぱりそうなんだ そういう重要なことは早めに説明書きしといてくれないと大混乱だわ まースッキリしたありがと そういう仕様なら色々めんどくさいな・・・ : デフォルトの名無しさん [sage] 2019/02/03(日) 21:35:32.72:RwDwNYzW >いやいやfact(1)の評価は0なんだし 違う どこにそんなことが書かれている? : ◆QZaw55cn4c [sage] 2019/02/03(日) 21:35:45.64:t4xt++Qj >いやいやfact(1)の評価は0なんだし ここが違っています。 fact(1) の評価は 1 * fact(0) であって、 0 じゃないです fact(0) の値が具体的になにかは、fact(0) を意識しはじめた時点では分からないのですよ : デフォルトの名無しさん [sage] 2019/02/03(日) 21:37:12.79:PKgH5/Eo バカ過ぎて泣けてくる… : デフォルトの名無しさん [sage] 2019/02/03(日) 21:37:24.99:DVkCUlxV おもろいな だんだんネタに思えてきた fact nの定義をよく見ろ fact 0 = 1 で再帰していないじゃん ここで止まるだろ 普通に考えれば 他の言語も一緒だろ ただそれをパターンマッチでやってるだけ : デフォルトの名無しさん [sage] 2019/02/03(日) 21:37:39.39:RwDwNYzW えーと、すまん、「どんな場合でも」再帰は1を返したら終了すると考えているのなら それは大間違いだ : デフォルトの名無しさん [] 2019/02/03(日) 21:38:05.69:I0qputsI fact 1の評価は1 * fact 0 fact 0のみが再帰してない。(基底部) 再帰は再帰部と基底部が必ず最低1個ずつ存在する。 : デフォルトの名無しさん [sage] 2019/02/03(日) 21:39:25.68:RwDwNYzW > >理解したのはの通りで >仮定として1かtrueを返したら再帰は止まる仕様になってると推測してる この推測が間違っているので、いったん忘れて素直にプログラムを読んでみよう : デフォルトの名無しさん [sage] 2019/02/03(日) 21:39:35.29:5bolWXfM 教えてもらったからもう大丈夫だよ 1で再起が止まる仕様なら納得だし fact(1)を入力したら 1-1を評価するから fact 0 特に問題ないよ 1で止まる仕様らしいからそれを前提にコード考えないといかんのか・・ ややこしいことになるねこれ : デフォルトの名無しさん [sage] 2019/02/03(日) 21:41:09.23:RwDwNYzW や でお墨付きを与えたのが間違いだった 君はまだ理解できていない (断言) : デフォルトの名無しさん [sage] 2019/02/03(日) 21:41:42.22:5bolWXfM どーゆーこと もうそれで覚えちゃったんだけども・・ : デフォルトの名無しさん [sage] 2019/02/03(日) 21:43:10.37:RwDwNYzW 忘れろ 忘れてプログラムを読み直しな : ◆QZaw55cn4c [sage] 2019/02/03(日) 21:43:22.74:t4xt++Qj >1で再起が止まる仕様なら納得だし 理解が不十分じゃないかと危惧します、その台詞「1 で再起がとまる」という言葉ですが、「何が」 1 で再起が止まる、と考えているのですか? あなたの発言は、いちいち「何が」「どうだ」の「何が」が欠けているので不安です : ◆QZaw55cn4c [sage] 2019/02/03(日) 21:43:58.19:t4xt++Qj 覚える、という言葉はこういうときに使うものではないと思いますよ : デフォルトの名無しさん [sage] 2019/02/03(日) 21:44:56.66:RwDwNYzW もういちど繰り返すが、 に書いたように 「仮定として1かtrueを返したら再帰は止まる仕様になってると推測している」 が大間違いだ : デフォルトの名無しさん [sage] 2019/02/03(日) 21:46:13.57:PKgH5/Eo 釣り宣言マダー? : デフォルトの名無しさん [sage] 2019/02/03(日) 21:46:48.03:5bolWXfM それだとの通りで揺らがない この記述だと無限に *1が続くわけだから なにか終了条件が必要なわけで 1を返したら再帰が止まる仕様ならなるほど納得 : ◆QZaw55cn4c [sage] 2019/02/03(日) 21:47:09.11:t4xt++Qj >fact(1)を入力したら 1-1を評価する どうしてそう考えたのですか?そのような記述がどこに書かれていたのか説明いただけませんか? : デフォルトの名無しさん [sage] 2019/02/03(日) 21:49:35.33:DdA3Wm74 > この記述だと無限に *1が続くわけだから 何で?続かないが。ちゃんと読め。 : デフォルトの名無しさん [sage] 2019/02/03(日) 21:49:54.21:5bolWXfM 大混乱してきた 1で再帰は必ず止まるんでないならさらにわからなくなるんだけども : デフォルトの名無しさん [sage] 2019/02/03(日) 21:49:57.06:DVkCUlxV わかるじゃん fact 0で1が出てきたら、また、勝手に再帰させて fact 1に戻っちゃう 勝手に脳内変換させちゃってる : デフォルトの名無しさん [sage] 2019/02/03(日) 21:51:42.20:5bolWXfM fact(1)はfact(n-1)によってfact(0)になるよね 実は式自体が予想外の評価するってことなのかな? いやまさかね・・ : ◆QZaw55cn4c [sage] 2019/02/03(日) 21:52:52.90:t4xt++Qj >この記述だと無限に *1が続くわけだから あなたの理解になにが足りないのかがわかるような気がしてきました。 「fact の引数が 1 である」と「fact の求値が 1 である」とを区別していないようですね この二つは厳然として異なります fact 0 = 1 は、fact(0) の「求値が」1 である、といっているのです fact n = n * fact (n - 1) は、たとえば fact 8 = 8 * fact 7 fact 7 = 7 * fact 6 fact 6 = 6 * fact 5 fact 5 = 5 * fact 4 fact 4 = 4 * fact 3 fact 3 = 3 * fact 2 fact 2 = 2 * fact 1 という記述を纏めて表現しているのであり、これは fact n の「求値」は fact (n - 1) という、もともとの引数 n とは違う n - 1 という引数を使った fact の求値で定義しているのです : デフォルトの名無しさん [sage] 2019/02/03(日) 21:53:28.07:RwDwNYzW もしかすると、だけど fact 0 = 1 を実行した直後に fact 1 = 1 * fact 0 が続くと考えている? もうしそうだとしたらそこが間違いで fact 0 = 1 fact n = n * fact(n - 1) はそのどちらかしか実行されない : ◆QZaw55cn4c [sage] 2019/02/03(日) 21:53:48.18:t4xt++Qj >1で再帰は必ず止まるんでない 「何が」 1 で再帰が止まる、と考えているのですか? 「何が」の部分を答えてください : ◆QZaw55cn4c [sage] 2019/02/03(日) 21:56:12.46:t4xt++Qj >fact 0で1が出てきたら、 何が 1 となるのか、そこをはっきり書いてください、「出てきたら」っていいますが、「何が」 1 と出てきたら、なんでしょうか? >また、勝手に再帰させて 何が 1 となるのか、0 となるのか、そこをはっきりさせないことには、それ以降の思考は不可能ですよ、あなたには「また勝手に再帰させて」とかいうことを考える段階ではありません : デフォルトの名無しさん [sage] 2019/02/03(日) 21:57:58.25:5bolWXfM ごめん意味不明わからん もちろんそのように考えてる fact 0 = 1の結果はすぐ反映されるんじゃないの? : デフォルトの名無しさん [sage] 2019/02/03(日) 21:58:56.17:DVkCUlxV いや 俺は本人じゃないから あくまでも、彼の脳内を勝手に想像しただけ 1がつづくケースを考えただけ そのものでは無いかもしれないけど、どちらにしようが似たようなケースでしょ : ◆QZaw55cn4c [sage] 2019/02/03(日) 21:59:44.40:t4xt++Qj これは失礼… : デフォルトの名無しさん [sage] 2019/02/03(日) 22:00:18.19:RwDwNYzW ああ、良かった >fact 0 = 1の結果はすぐ反映されるんじゃないの? そうだよ。そして fact 0 は 1 を返すから、もう再帰呼出しは起こらないよね? fact 3 = 3 * fact 2 = 3 * 2 * fact 1 = 3 * 2 * 1 * fact 0 = 3 * 2 * 1 * 1 = 6 : デフォルトの名無しさん [sage] 2019/02/03(日) 22:02:19.10:5bolWXfM いやいや終了条件が何も書かれてないから結局は続くよ どのみちfact 0が1となるならまたfact(1-1)でfact(0)でしょ 間違ってないはずなんだけど何か使ってる人には常識的なお約束事とかあるのかな : デフォルトの名無しさん [sage] 2019/02/03(日) 22:02:55.82:DVkCUlxV >fact 0 = 1の結果はすぐ反映されるんじゃないの? ようするにそこでとまる 数学の階乗だから fact nの引数は再帰する度に-1される。 どこかで、factの引数が0になったら、それ以上は再帰しない 難しい話じゃないし、他の言語で再帰理解していたら、分かるはず 自分で落ち着いて考えてごらん : デフォルトの名無しさん [sage] 2019/02/03(日) 22:06:24.90:5bolWXfM いやただのカウンターだったとしても止まらないし やっぱりおかしいとは思う 何か前提がありそうな気はする : デフォルトの名無しさん [sage] 2019/02/03(日) 22:07:56.45:DdA3Wm74 fact 3 = 3 * fact 2 = 3 * 2 * fact 1 = 3 * 2 * 1 * fact 0 -- fact 0が・・ = 3 * 2 * 1 * 1 -- 1になる。factもうないのにここから何が続くの? = 6 : デフォルトの名無しさん [sage] 2019/02/03(日) 22:08:07.10:RwDwNYzW >どのみちfact 0が1となるならまたfact(1-1)でfact(0)でしょ fact 1 = 1 * fact (1-1) = 1 * fact 0 となるけど、これは fact 1 の時の処理だね fact 0 の場合は 1 を返すだけだから、fact(1-1) という処理はもう出てこないよ 今の話は fact 3 = 3 * fact 2 = 3 * 2 * fact 1 = 3 * 2 * 1 * fact 0 = 3 * 2 * 1 * 1 = 6 のうち 3 * 2 * 1 * fact 0 が 3 * 2 * 1 * 1 に変化するところだよ : デフォルトの名無しさん [sage] 2019/02/03(日) 22:08:36.79:DVkCUlxV だとすると文法自体理解していない あるいは関数自体 もっと、詳しく書くと >どのみちfact 0が1となるならまたfact(1-1)でfact(0)でしょ 定義を見てごらん fact 0 = 1 でこれは、=の右にfactが無いからこれで再帰はしないで、ここで終了 fact n = n * fact n-1 で=の右にfactがあるから再帰する : デフォルトの名無しさん [sage] 2019/02/03(日) 22:10:11.03:5bolWXfM = 3 * 2 * 1 * 1 = 3 * 2 * 1 * 1 * fact( 1 - 1 ) = 3 * 2 * 1 * 1 * 1 * fact ( 1 - 1) どこまでも続くじゃない・・ : デフォルトの名無しさん [sage] 2019/02/03(日) 22:11:04.78:DdA3Wm74 これはアカンよ… : デフォルトの名無しさん [sage] 2019/02/03(日) 22:13:50.28:DdA3Wm74 中学校の数学でそうはならないってことは習うから、学校の数学でそこまで勉強してからプログラミングに手を出しても遅くないのでは? : デフォルトの名無しさん [sage] 2019/02/03(日) 22:14:19.16:5bolWXfM fact 0 = 1で終了するというのが納得いってない もしそうであれば1を返せば再帰は終了すると仮定したんだ そもそもfact 0 = 1ってマクロ定義みたいなもんだし 直ちに評価されて式に代入されるよね : デフォルトの名無しさん [sage] 2019/02/03(日) 22:17:47.65:DVkCUlxV 他の言語で再帰ってのは理解しているの? fact 0 = 1で=の右にfactが無いから、再帰は終了 だから、終了条件は書かれている。 もしこれが理解できないのなら、関数定義とか、パターンマッチとかもっと基本的なことに 戻らないと理解できないと思う : デフォルトの名無しさん [sage] 2019/02/03(日) 22:18:13.63:5bolWXfM プログラミング言語は数学じゃないから 再帰から脱出するならそのためのコードは絶対必要なはずなんだ それがないってことは仕掛けがあるはずで その仮定が1を返せば再帰から脱出できるという考え でも違うらしいから大混乱してる : デフォルトの名無しさん [sage] 2019/02/03(日) 22:19:53.64:RwDwNYzW fact 0 = 1 で「終了する」というのが間違い fact 0 = 1 では、fact 0 が 1を返す(正確に言うと1に簡約する) ということしか定義していない ただ、もうfact関数を呼び出していないので、再帰呼出しはここで止まる そして fact 0 = 1 がマクロ定義ということも勘違いなので忘れよう が解説してくれた fact 3 = 3 * fact 2 = 3 * 2 * fact 1 = 3 * 2 * 1 * fact 0 -- fact 0が・・ = 3 * 2 * 1 * 1 -- 1になる。factもうないのにここから何が続くの? = 6 : デフォルトの名無しさん [sage] 2019/02/03(日) 22:21:37.72:5bolWXfM Cで再帰させるなら終了条件にヒットしたらフラグたててreturnで戻ってく 関数定義の仕方ならサッと見たけど特に疑問はなかったよ パターンマッチっていってもマクロ定義みたいなもんだし特にどうということも : デフォルトの名無しさん [sage] 2019/02/03(日) 22:22:31.24:RwDwNYzW 上に書いたけど、漸化式は理解している? 同じ書き方をします Haskellは数学を基盤としているので、数学的な記述方法でプログラムが書けます 「再帰から脱出するならそのためのコードは絶対必要なはずなんだ」とあるけど、 もう書かれているよ fact 0 = 1 って : デフォルトの名無しさん [sage] 2019/02/03(日) 22:24:44.77:5bolWXfM いやだから・・ fact 0は1なんだからその次はfact(1)になるでしょ 何も間違ってないと思うんだけど。 : デフォルトの名無しさん [sage] 2019/02/03(日) 22:25:28.82:RwDwNYzW >fact 0は1なんだからその次はfact(1)になるでしょ その次はもうないよ : デフォルトの名無しさん [sage] 2019/02/03(日) 22:26:23.52:5bolWXfM それは終了条件じゃないよね 何が正解なのかさらに混乱して来た : デフォルトの名無しさん [sage] 2019/02/03(日) 22:26:31.18:DdA3Wm74 ならないよ。そこが間違ってるんだよ。 : デフォルトの名無しさん [sage] 2019/02/03(日) 22:28:21.00:RwDwNYzW 君の言い方に合わせると「終了条件」と考えてよい 正しく説明すると になる : デフォルトの名無しさん [] 2019/02/03(日) 22:28:40.54:I0qputsI 1で止まる仕様と言うか。。。 掛け算だから1を返すだけ(掛けても変わらない数)で、足し算なら0を返すよ。 sum1toN 0 = 0 sum1toN n = n + sum1toN (n - 1) : デフォルトの名無しさん [sage] 2019/02/03(日) 22:28:53.80:DdA3Wm74 終了条件だよ。 のPythonコードで言うと if n == 0: return 1 の部分と同じだよ。 : デフォルトの名無しさん [sage] 2019/02/03(日) 22:30:37.00:5bolWXfM だから・・ fact 0は1なんだから続くじゃない? 延々と再帰するようにしか見えない : デフォルトの名無しさん [sage] 2019/02/03(日) 22:30:46.46:o+jOfHnE この人の脳内だと、 fact 0 = 1 が fact 0 = fact 1 になってるんじゃないだろうか : デフォルトの名無しさん [sage] 2019/02/03(日) 22:32:38.86:5bolWXfM PythonやJavaは知らないのでなんとも : デフォルトの名無しさん [sage] 2019/02/03(日) 22:33:23.20:DVkCUlxV この人 77で書いてるけど、文法まともに読んでないんだよ Haskell 文法自体は一見綺麗で簡単そうに見えるけど 実際には、理解するのが非常に難しい(今回の再帰のとこじゃないんだけど) 適当に文法流し読みして理解しようとするのが 間違っている もっとも、階乗の再帰は、他の人の説明で理解できるだろうと思うが : デフォルトの名無しさん [sage] 2019/02/03(日) 22:34:03.06:DdA3Wm74 fact 0は1なんだから、 fact 3 = 3 * fact 2 = 3 * 2 * fact 1 = 3 * 2 * 1 * fact 0 -- fact 0が・・ = 3 * 2 * 1 * 1 -- 1になる。factもうないのにここから何が続くの? = 6 はい!ここで一旦休憩!君に問題。 3 * 2 * 1 * 1はいくつだ? : デフォルトの名無しさん [sage] 2019/02/03(日) 22:34:30.64:RwDwNYzW うーん、C言語だと int fact(int n) { if (n == 0) return 1; else return n * fact (n - 1); } と書くのと同じなんだけどねえ : デフォルトの名無しさん [sage] 2019/02/03(日) 22:37:00.44:5bolWXfM だから =3 * 2 * 1 * 1 * fact(1-1) =3 * 2 * 1 * 1 * 1*fact(1-1) =3 * 2 * 1 * 1 * 1*1*fact(1-1) という具合にいつまでもfactは続くよ だから色々納得いかないことあるんだけど : デフォルトの名無しさん [sage] 2019/02/03(日) 22:37:36.15:QPZpvG6g もうHaskellはあきらめるんだ…… : デフォルトの名無しさん [sage] 2019/02/03(日) 22:39:05.88:RwDwNYzW この1行目はどこから出てきたの? =3 * 2 * 1 * 1 * fact(1-1) この辺を脳内でテキトーに処理してるからわからないんだよ fact 3 のところから地道に書きながら置き換えてみな : デフォルトの名無しさん [sage] 2019/02/03(日) 22:41:48.43:5bolWXfM それで地道にやったら になったよ あれ以外どうしろと・・ : デフォルトの名無しさん [sage] 2019/02/03(日) 22:42:17.34:DdA3Wm74 算数のテストで 3 * 2 * 1 * 1は?って問題に、 3 * 2 * 1 * 1 * fact(1-1)って答えるの? それは算数でも数学でもプログラミング言語でも間違いだよ。 算数でも数学でもプログラミング言語でも答えは6だよ。 : デフォルトの名無しさん [sage] 2019/02/03(日) 22:42:33.19:RwDwNYzW そうなのか。C言語はやったことがあるようだけど は理解できてる? : デフォルトの名無しさん [sage] 2019/02/03(日) 22:43:47.92:5bolWXfM そこはどうでもいいところだから書かなかった : デフォルトの名無しさん [sage] 2019/02/03(日) 22:43:59.88:RwDwNYzW ああ、 みたいに一気に展開するのではなくて、 fact 3 = のところからひとつずつ地道に置き換えてみた? もしやってないなら、今すぐやってみよう : デフォルトの名無しさん [sage] 2019/02/03(日) 22:44:48.18:RwDwNYzW どうでもよくないから君は間違っている : デフォルトの名無しさん [sage] 2019/02/03(日) 22:45:27.31:5bolWXfM あれでいいんだけど似たような制御構造がないよね haskellのコードは全く別物に見える : デフォルトの名無しさん [sage] 2019/02/03(日) 22:45:46.73:wI7xL3t+ 左辺から右辺に書き換えるって分かってる? : デフォルトの名無しさん [sage] 2019/02/03(日) 22:49:36.42:5bolWXfM =3 * 2 * 1 * 1 =3 * 2 * 1 * 1 * 1 =3 * 2 * 1 * 1 * 1 * 1 ・・・ やっぱり変わんないよ? 何かやってる人には常識だからあえて書いていないとかのお約束ごととかある言語なんじゃないかなぁ・・ パッと見た感じそんなに難しい言語には見えないけど内容に納得できない : デフォルトの名無しさん [sage] 2019/02/03(日) 22:50:08.66:PKgH5/Eo どうでもよくないよ。正しい流れは、 fact 3 = 3 * fact 2 = 3 * 2 * fact 1 = 3 * 2 * 1 * fact 0 = 3 * 2 * 1 * 1 = 6 なのに、によるとあなたは、 fact 3 = 3 * fact 2 = 3 * 2 * fact 1 = 3 * 2 * 1 * fact 0 = 3 * 2 * 1 * 1 = 3 * 2 * 1 * 1 * fact(1-1) = 3 * 2 * 1 * 1 * 1 * fact(1-1) = 3 * 2 * 1 * 1 * 1 * 1 * fact(1-1) であるという。 正しい答え6にたどり着かない原因はあなたが 3 * 2 * 1 * 1 = 3 * 2 * 1 * 1 * fact(1-1) と変形(?)してしまっているところなのは明らか。 : ◆QZaw55cn4c [sage] 2019/02/03(日) 22:51:43.03:t4xt++Qj >またfact(1-1) どうしてそのように推測したのですか?その 1 - 1 ってどこから誘導したのですか? : デフォルトの名無しさん [sage] 2019/02/03(日) 22:51:48.54:5bolWXfM 普通にやったけど特に問題なかったよ : ◆QZaw55cn4c [sage] 2019/02/03(日) 22:53:55.48:t4xt++Qj >fact 0は1なんだからその次はfact(1)になるでしょ ちがいますよ。なんども言っていますが「fact 0 は 1 」、っていう言葉が不正確ですね、fact 0 の「何が」 1 なんでしょうか? : デフォルトの名無しさん [sage] 2019/02/03(日) 22:54:17.35:5bolWXfM fact 0 = 1とか定義されちゃってるから変形もなにもあの形にしかならんでしょう fact 0の結果が1だからそれはすぐ反映されるので : ◆QZaw55cn4c [sage] 2019/02/03(日) 22:54:49.82:t4xt++Qj >fact 0は1なんだから続くじゃない? fact 0 の「何が」 1 なんですか?そこが他の者と違っている点かと思います : ◆QZaw55cn4c [sage] 2019/02/03(日) 22:55:58.80:t4xt++Qj 3 * 2 * 1 * 1 * fact(1-1) その 1 - 1 はどういう理由で 1 - 1 と書いたのですか? : デフォルトの名無しさん [sage] 2019/02/03(日) 22:56:02.92:5bolWXfM 不正確と言われても他に言いようがないし : デフォルトの名無しさん [sage] 2019/02/03(日) 22:56:26.62:o+jOfHnE Cでこんな感じに書いてあげれば分かるのだろうか。 int fact(int n) { switch(n) { case 0: return 1; // fib 0 = 1 default: return n * fact(n-1); // fib n = n * fact (n-1) } } : デフォルトの名無しさん [sage] 2019/02/03(日) 22:57:55.66:o+jOfHnE あっとボケた。のfibはfactの間違い : デフォルトの名無しさん [sage] 2019/02/03(日) 22:58:05.17:5bolWXfM 直前の結果が1なのでfact(n-1)に与えられてfact(1-1) 特に問題ないはずだけどもこれだけなら : ◆QZaw55cn4c [sage] 2019/02/03(日) 22:58:55.27:t4xt++Qj あなたは 「fact 0 が 1 」といっていますが、我々は「fact 0 の値が 1」と「fact の引数が 1」とを別のものとして区別しているのです あなたは区別していますか?あるいは「fact 0 が 1」というけれども fact 0 の何が 1 なんですか? : デフォルトの名無しさん [sage] 2019/02/03(日) 22:59:39.94:RwDwNYzW >直前の結果が1なので ここはOK >fact(n-1)に与えられてfact(1-1) ここが間違い。与えられるfact(n-1)がもう存在しない : ◆QZaw55cn4c [sage] 2019/02/03(日) 22:59:45.17:t4xt++Qj 結果は結果、引数は引数です 結果を引数に入れたり、引数を結果にいれたりしていないのですよ : デフォルトの名無しさん [sage] 2019/02/03(日) 23:01:37.23:5bolWXfM なっ まさかそういう意味なの? fact 0 = 1 fact n = n * fact(n - 1) のどちらかしか評価されないとか見ただけじゃわからないって!! あーそういうことかー : デフォルトの名無しさん [sage] 2019/02/03(日) 23:01:49.80:PKgH5/Eo > fact 0 = 1とか定義されちゃってるから変形もなにもあの形にしかならんでしょう いいえその形には絶対になりません。 「fact 0 = 1とか定義されちゃってるから」 = 3 * 2 * 1 * fact 0 は = 3 * 2 * 1 * 1 になります。うん、これはいい。次。 「fact 0 = 1とか定義されちゃってるから」 = 3 * 2 * 1 * 1 は = 3 * 2 * 1 * 1 * fact(1-1) になります?いいえ、なりません。勝手に足した「 * fact(1-1)」どっから出てきたんだ。 3 * 2 * 1 * 1は6です。 : デフォルトの名無しさん [sage] 2019/02/03(日) 23:03:02.44:RwDwNYzW 理解できたようで良かったけど、結局は がわかってなかったということだなあ : デフォルトの名無しさん [sage] 2019/02/03(日) 23:03:24.76:5bolWXfM これは説明書きに書いておいて欲しかったなー これじゃわかりようがないわ : デフォルトの名無しさん [sage] 2019/02/03(日) 23:03:29.59:PKgH5/Eo よかったね。君へのレスで「パターンマッチ」を検索してごらん : ◆QZaw55cn4c [sage] 2019/02/03(日) 23:03:47.98:t4xt++Qj そこでしたか! うーん、それは見抜けなかったですね、いろいろしつこい質問をしてごめんなさい : デフォルトの名無しさん [sage] 2019/02/03(日) 23:04:21.15:RwDwNYzW 普通に数学の手法なので、数学を勉強しようか (ちなみに、君以外は全員ふつうにわかってるぞ) : デフォルトの名無しさん [sage] 2019/02/03(日) 23:04:27.74:5bolWXfM 完全解決してスッキリ みんな時間とらせてしまってごめん そしてありがとう : デフォルトの名無しさん [sage] 2019/02/03(日) 23:06:11.09:RwDwNYzW がんばれよー : デフォルトの名無しさん [] 2019/02/03(日) 23:06:13.09:9SI0qp6C fact 0 = 1 は、fact 0 = fact (fact 0)ではありません。 : デフォルトの名無しさん [sage] 2019/02/03(日) 23:06:37.09:PKgH5/Eo で > もちろんそのように考えてる って書いてるけどそのように考えてなかったよね… : デフォルトの名無しさん [sage] 2019/02/03(日) 23:11:25.99:RwDwNYzW が言っている「パターンマッチ」を彼が調べてくれるといいね : デフォルトの名無しさん [] 2019/02/04(月) 07:18:20.69:eX/1kX5o だから、fact 1-1になった後、fact 0になるだろ? そしたらfact 0 = 1になるんだよ。 数学の数学的帰納法ググれ。 fact 0 = 1 これはfactの引数が0なら強制的に1になると言ってる。 fact n = n * fact (n - 1) これはfact nを解くには引数のnに、nより1つ小さい数をfactに渡したものを掛けたものと等しいと言っている。 (そして最終的にfact 0で1が返って全体の値が求まる) fact 3 = 3 * fact (3 - 1) = 3 * fact 2 = 3 * 2 * fact (2 - 1) = 3 * 2 * fact 1 = 3 * 2 * 1 * fact (1 - 1) = 3 * 2 * 1 * fact 0 = 3 * 2 * 1 * 1 ― fact 0 = 1より = 6 : デフォルトの名無しさん [] 2019/02/04(月) 07:24:43.06:eX/1kX5o ただし、fact 0の様な特殊な条件を上に書く必要がある(Haskellに限らず、どの言語も) : デフォルトの名無しさん [] 2019/02/04(月) 07:30:26.48:eX/1kX5o スタック消費しない末尾再帰とか、まだ先があるのに先が思いやられる。。。 (末尾再帰も最近じゃCやJavaScriptでも効くらしい。実質ループだから使った事ないけど) : デフォルトの名無しさん [sage] 2019/02/04(月) 11:21:38.86:66n6O4Xc 遅延評価や並行並列がデフォルトの言語ならばスタック消費しないのは当たり前である : デフォルトの名無しさん [sage] 2019/02/04(月) 11:34:48.97:nZpfKraZ へっ? : デフォルトの名無しさん [sage] 2019/02/04(月) 11:56:25.98:66n6O4Xc 人間の読解力なんて順調に行っても1日1行程度でしかない : デフォルトの名無しさん [sage] 2019/02/04(月) 22:09:21.20:fVmYxPyX 代わりにスペースリークするけどな : デフォルトの名無しさん [sage] 2019/02/05(火) 00:47:55.71:YW+7XZmL リストや配列には複数の要素がある オブジェクトにも複数のメンバーがある その一部が不要になってもメモリは全部残る ここまでは言語に依存しない : デフォルトの名無しさん [sage] 2019/02/05(火) 02:19:00.11 数日ぶりに覗いたらすっごいスレ伸びてる : デフォルトの名無しさん [sage] 2019/02/05(火) 03:02:15.20:/sjztfrr ごいごいすー! : デフォルトの名無しさん [sage] 2019/02/05(火) 05:35:54.03:H17BJwTV ,112,118 だけ読めばおk : デフォルトの名無しさん [sage] 2019/02/11(月) 10:04:55.57:3SqS2rDH HaskelでWindowsアプリケーション作りたいですけどできるんですか? : デフォルトの名無しさん [sage] 2019/02/11(月) 22:30:07.24:njsDRqJy 問題は、何十年か前にそれができた人のコードを今コンパイルできるか 今できた人のコードを何十年後にコンパイルできるか それができるのがC/C++で 他の言語はそれを不可能にして新しい言語を普及させたい : デフォルトの名無しさん [sage] 2019/02/15(金) 14:13:18.51:ZHz1cA+u さようなら遅延評価 2019-02-15 ttp://https://kazu-yamamoto.hatenablog.jp/entry/2019/02/15/115630 Haskellがとっつきにくい原因の一つに遅延評価がある。入門書では、無限リストと遅延 評価がことさら強調される。しかし、Haskellを業務で使ってみると、遅延評価が煩わしく なってくる。遅延評価なしでもほとんどのことは実現できるし、メモリーの使用量は推測 できないし、あまりいいことはない。(中略) 、GHC 8.0 では、言語拡張 Strict と StrictData が提供された。この二つを使えば、 デフォルトの評価戦略が正格評価となる。 つまり、以下のコードの評価戦略は遅延評価だが、Strict と StrictData を用いると 正格評価となる。(中略) Strict と StrictData をもう少しく知りたい人はStrict Haskellを読んでほしい。 純粋関数型データ構造を読んだ諸君、Haskellではデフォルトが遅延評価だからイマイチ 例題をうまく実装できないと思ったことだろう。でも、今なら簡単にできるのだ!(後略) : デフォルトの名無しさん [sage] 2019/02/15(金) 14:59:49.72:h0RhILR4 ムグググググググ : デフォルトの名無しさん [sage] 2019/02/15(金) 16:33:48.53:iAmk1lDo xcodeで使えないのが致命的なんだよな・・ リンクはできるがUIがらみのコードは書けないわけで : デフォルトの名無しさん [sage] 2019/02/16(土) 07:21:27.63
:6iOnrs/B スレを読み直してて気づいたけど、ってこういう意味で言ってたのね もちろんそのように(の前半のように)考えてる fact 0 = 1の結果はすぐ(fact n = n * fact(n - 1)に)反映されるんじゃないの? : デフォルトの名無しさん [sage] 2019/02/16(土) 09:09:45.75:pHmZSgK3 もういいだろう ただ単に基本的文法すら知らない子じゃん : デフォルトの名無しさん [sage] 2019/02/16(土) 13:13:23.08:aQjbCKoN とっつきにくいも聞き飽きたな パワハラ上司に同じこと言えるのかと 本当にとっつきにくい相手はそういう輩だ : デフォルトの名無しさん [sage] 2019/02/16(土) 13:16:38.83:CJGMkJvN ややこしいことをややこしい方法で簡単にするのがhaskell : デフォルトの名無しさん [sage] 2019/02/16(土) 14:01:52.10:aQjbCKoN Pythonのように型を書かないやつはゴミクズ とかいうハラスメントが一番の問題だから遅延評価は誤差の範囲内 : デフォルトの名無しさん [] 2019/02/17(日) 00:52:21.04:jxnSJIL4 一回しか変数に代入しない場合は副作用になりますか? YES か NOでお答えください。 JavaScriptで言えばこういうコードです。 const a = foo(), b = bar(a), c = baz(b); (const変数は再代入ができません) : デフォルトの名無しさん [] 2019/02/17(日) 00:52:52.45:KFkN1Yft Haskellスレの皆さんこんにちは✨😃❗ 突然ですがこのたびWeb制作板JavaScript質問スレにて、スレ民の総意により、 [1,2,3].map(v => (v += 2, v * v)); のv += 2は副作用ではない。 と決定しました! ありがとう!ありがとう! : デフォルトの名無しさん [sage] 2019/02/17(日) 00:55:14.71:jxnSJIL4 は再代入と(再代入しない)代入の違いがわからず 代入は副作用であると言い張っているマヌケが 再代入の例を出し、代入は副作用であると 結論づけようとしているだけなので無視してください。 : デフォルトの名無しさん [] 2019/02/17(日) 01:04:11.22:KFkN1Yft ?別の方と勘違いされているのでは?? 話はシンプル。質問をして、その答えを得た。以下が全てです。この質問と答えに、前後の文脈など関係ありますか?? 904 Name_Not_Found sage 2019/02/17(日) 00:42:09.09 ID:??? 悪いけど以下の(ア)に入るのは1か2か答えてくれる?1か2の一文字書くだけだから出来るよね? [1,2,3].map(v => (v += 2, v * v)); のv += 2は(ア)である 1. 副作用である 2. 副作用ではない 907 Name_Not_Found sage 2019/02/17(日) 00:44:40.52 ID:??? Wikipediaの2つの成立条件を考えれば、2. は迷惑だろ 908 907 sage typo 2019/02/17(日) 00:45:33.97 ID:??? × 2. は迷惑だろ 〇 2. であることは明白だろ : デフォルトの名無しさん [sage] 2019/02/17(日) 01:06:42.19:jxnSJIL4 あの?Haskellスレを荒らさないでくれますか? 関係ない話はJavaScriptスレに戻ってください : デフォルトの名無しさん [] 2019/02/17(日) 01:13:02.79:KFkN1Yft おや? を書き込んだのはどなたですか?w 何か都合の悪いことでもあったのですか?w 大慌てでを張りに来たようですが?w : デフォルトの名無しさん [sage] 2019/02/17(日) 01:15:49.49:jxnSJIL4 は単なる質問です。 : デフォルトの名無しさん [] 2019/02/17(日) 01:25:17.93:KFkN1Yft フフッw : デフォルトの名無しさん [sage] 2019/02/17(日) 01:47:05.17:bP6HzLuJ うるせ〜〜〜〜一生代入してろ : デフォルトの名無しさん [] 2019/02/17(日) 03:04:30.74:lVDDSVXk Haskellスレ民の方々どうも! Web制作板JavaScript質問スレにて、 ttp://https://en.wikipedia.org/wiki/Side_effect_(computer_science) の以下の文章について… > One common demonstration of side effect behavior is that of the assignment operator in C++. 副作用の振る舞いの一般的なデモとしては、C++の代入演算子があります。 > For example, assignment returns the right operand and has the side effect of assigning that value to a variable. 例えば代入は右オペランドを返し、かつそれと同じ値を変数に代入するという副作用を持ちます。 スレ民の叡智を結集した結果、 ・C++の代入演算子は副作用があるが、JavaScriptの代入演算子は副作用がない ・[1,2,3].map(v => (v += 2, v * v)); のv += 2は主作用を使っているのであって、副作用など使っていない! と決定しました! パチパチパチ〜 ありがとー!! : デフォルトの名無しさん [sage] 2019/02/17(日) 13:09:25.08:C3KvaR2D 初期化と代入の違いはC++でさんざんやったやつだろ C++には遅延評価がないから余裕じゃないのか : デフォルトの名無しさん [] 2019/02/17(日) 17:34:05.11:HZyuZSmb runSTという魔法がある : デフォルトの名無しさん [sage] 2019/02/20(水) 10:51:29.01:FaK+gznk Cのマクロ #define fact(n) (((n)==0)?1:(n)*(fact((n)-1)) これだったら一見まともに見えて 実は無限ループする罠 fact(0)は ((0==0)?1:(0)*((((0)-1)==0)?1:((0)-1)*(.... となって無限ループ。 (ややこしいんで括弧の数とか間違って るかもしれないけど) C++でインライン関数で定義した場合は 論理式短絡評価で動くかもしれんが : デフォルトの名無しさん [sage] 2019/02/20(水) 11:35:48.52:FaK+gznk 再帰を含む関数がインライン展開されることを 期待するほうが間違いだったか... : デフォルトの名無しさん [sage] 2019/02/20(水) 11:43:51.95:KVaXFVJv スレチ : デフォルトの名無しさん [] 2019/02/20(水) 16:55:25.36:xw22aw45 テンプレートメタプログラミングでもしてろクソ : デフォルトの名無しさん [sage] 2019/02/22(金) 10:09:30.67:ioyynd1U 花粉の時期に入るとみんなこれやり始めるよね : デフォルトの名無しさん [sage] 2019/02/22(金) 19:18:12.74:ioyynd1U だめだわからん fold_left :: (a -> b -> a) -> a -> [b] -> a fold_left _ a [] = a fold_left f a (x:xs) = fold_left f (f a x) xs リストが a1 a2 a3のとき folder_left f (f a a1) [a2 a3] になることはわかる その先の展開が何時間考えてもわからん f(f(f(a,a1),a2),a3)になるってゆーんだが イメージに繋がらない お前らこんな難解なの本当に使いこなせてるの? ここまでわかりにくいと有用なのか疑わしく思えて来る : デフォルトの名無しさん [sage] 2019/02/22(金) 19:43:58.95:LKaW/yz7 foldlなんて単なるループみたいなもんだし 今どきJavaでもやるくらい 分かるまでは変に抽象化しないで、具体例で考えるといいよ folder_left f a [a1 a2 a3] じゃなくて folder_left (+) 0 [1, 2, 3] で考えるとか そしたら folder_left f (f a a1) [a2, a3]は folder_left (+) ((+) 0 1) [2, 3]になる 要は最初に int sum = 0 for(int a : xs) sum = sum + a と書くのと変わらない sumへの蓄積を、変数への再代入ではなく次の関数への引数として書いてるだけ どちらかというと、いわゆる関数型っぽいのはこういうのよりfoldrでリスト作ったりするときの方かな : デフォルトの名無しさん [sage] 2019/02/22(金) 19:47:35.11:ioyynd1U まったくわからない 例題載ってるとこにも似たようなことは書いてあるんだけども ループで書くならすぐ終わる話だけど ややこしすぎてイメージがつかめない イメージがつかめたらその時点で理解終了なんだけど : デフォルトの名無しさん [sage] 2019/02/22(金) 19:51:15.80:ioyynd1U a2とa3が分離されそうなことはわかるんだけども folder_left f (f a a1) [a2 a3] ^^^^ こいつがどこ行くのっていうのと どこをどうやったら()で括られることになるのかイメージできない : デフォルトの名無しさん [sage] 2019/02/22(金) 20:17:22.94:LKaW/yz7 folder_left f (f a a1) [a2, a3] になるところまではわかるんだよね? そしたらまず括弧の中から先に計算するのはどの言語も普通だよね だから先に(f a a1)の答えが出る fは引数を2つとる関数だから、答えを出すのに支障はないよね ここで(f a a1)の計算結果をz1としようか そしたら上の式は folder_left f z1 [a2, a3]になるよね? そうすると、f、z1、[a2, a3]の3つの引数を使って、folder_leftがまた呼び出されるのがわかる?ここが再帰ね folder_leftの定義は2つあるけど、[a2 a3]は空リスト([])じゃないから、下の folder_left f a (x:xs)の方が呼ばれるよね? ここでaはz1、xはa2、xsは [a3]だよね だからベタで書くと folder_left f (f z1 a2) [a3]になるよね? 同じように括弧の中が先に計算されるから、(f z1 a2)をz2としようか そしたら folder_left f z2 [a3]となる また全く同じようにfolder_leftを呼び出すと、次は folder_left f (f z2 a3) []となる そして同じように(f z2 a3)をz3とすると、 folder_left f z3 []と書ける ここでまたまたfolder_leftを呼び出してるわけだけど、最後のリストが空リストだよね だからfolder_leftの2つの定義の内、上の方のfolder_left _ a [] = aが呼ばれる 上から順に呼び出し条件を見てるからね ここでaはz3のことだから、最終的にz3が答えになる じゃあz3が何かっていうと、(f z2 a3)だよね。そしてz2が何かっていうと、(f z1 a2)だよね つまりz3は(f (f z1 a2) a3)のことだ そして最後にz1は(f a a1)だから、結局 z3 == f (f (f a a1) a2) a3となる これでどうだ : デフォルトの名無しさん [sage] 2019/02/22(金) 20:22:50.89:ioyynd1U ()の中って完全に展開されるまで実行されないものと思ってた 例題もそんな書き方だったし これならわかる! ありがとう : デフォルトの名無しさん [sage] 2019/02/22(金) 20:30:54.11:LKaW/yz7 そこらへんは評価戦略の話であって別件だね 再帰の本質ではないよ Haskellといえば遅延評価みたいなところがあるから混乱しやすいけどね 上で言うならz3こと(f (f (f a a1) a2) a3)を、最後までこの形で持って行って、最後にまとめて計算するのが遅延評価 上で書いたみたく適宜評価していくのが正格評価 Haskellだとfolder_leftは二種類あって、 遅延評価版がfoldl 正格評価版がfoldl' ぶっちゃけ左畳み込みに関してはfoldlを使うことはない 全部foldl'でいい : デフォルトの名無しさん [sage] 2019/02/23(土) 00:41:48.52:RiBir1w3 カリー化関数の意図がわからん sum_of :: (Integer -> Integer, Integer, Integer) -> Integer sum_of (f, n, m) | n > m = 0 | otherwise = f n + sum_of (f, n + 1, m) これはわかる sum_of' :: (Integer -> Integer) -> Integer -> Integer -> Integer sum_of' f n m | n > m = 0 | otherwise = f n + sum_of' f (n + 1) m どう見ても書き換えただけにしか見えないんだけどこれ意味あって書いてるのかな カリー化って引数可変で動作する関数を定義するためのものって理解したけど 後者にはそんな意図が含まれてるように見えない : デフォルトの名無しさん [sage] 2019/02/23(土) 02:34:37.24:hS0A7KKk やってるのは数式で書くと Σ[i=n..m] f(i) か 再帰をちょっと具体的に書き下さないと何のsumかわからんかった それで多分やりたいのは こういう風に個別の総和関数が手軽に作れますよみたいな話だと思う タプルで定義されてるとこういう風にはいかない (書けないことはないけどめんどくさい) sumOfTwice :: Integer -> Integer -> Integer sumOfTwice = sum_of (*2) ここで(*2)とかできるのも (*) :: Integer -> Integer -> Integer がカリー化されてるおかげ こういうのを部分適用と言って可変長引数とは異なる概念 : デフォルトの名無しさん [sage] 2019/02/23(土) 02:59:05.43:RiBir1w3 (*2)の意味わからなくて前後調べたら演算子をカリー化できるとかあって やっと意味わかったありがとう しかも例題の先の先の方に有効な利用法書いてあったけど なんかどうもサイトの進め方と合わないなー・・変えるかー こんなこと書いてもなんか意味あんのだから何なんみたいな悶々パターンが多すぎる とても簡単ですとか書いてあったら相当難しいフラグ確定 考え方が違うんだろうな : デフォルトの名無しさん [sage] 2019/02/23(土) 06:50:54.90:T/+XuHA6 考え方を変えるのが関数型を学ぶ一番の目的だと思うけど、 合わないなら関数型あきらめればいいじゃん。 うちは論理型言語に全く馴染めなくて、それに時間使うのやめた。 : デフォルトの名無しさん [sage] 2019/02/23(土) 10:50:43.56:7gjHPQsv そうじゃない 人を信じるのをあきらめて嘘を嘘と批判する とても簡単ですと言った奴は嘘つきのクズであると : デフォルトの名無しさん [sage] 2019/02/23(土) 13:04:48.43:RiBir1w3 しかしいいサイト全然ないなどうしたもんか お前らどうやって習得したのよこんな難解な言語 : デフォルトの名無しさん [sage] 2019/02/23(土) 13:35:58.14:7gjHPQsv 例えばC#とF#の考え方は変わらないし 考え方を変えるというのも嘘だな 嘘に気付くのに1日かかるやつと5年以上かかるやつの差は大きい : デフォルトの名無しさん [sage] 2019/02/23(土) 14:01:38.38:E9HQXzXo >嘘に気付くのに ひどい世の中だな : デフォルトの名無しさん [sage] 2019/02/23(土) 17:11:04.23:RiBir1w3 Prelude> let foo n = ¥x -> x * n Prelude> :t foo foo :: Num a => a -> a -> a Prelude> let foo10 = foo 10 Prelude> :t foo10 foo10 :: Integer -> Integer Prelude> foo10 10 100 Prelude> foo10 20 200 Prelude> let foo100 = foo 100 Prelude> foo100 10 1000 Prelude> foo100 20 2000 Prelude> let foo5 = foo 5 Prelude> foo5 10 50 Prelude> foo5 20 100 Prelude> :t foo (1.234 :: Double) foo (1.234 :: Double) :: Double -> Double : デフォルトの名無しさん [sage] 2019/02/23(土) 17:12:26.05:RiBir1w3 のクロージャの説明がさっぱりわからない 関数を生成する関数を簡単に作ることができるって言ってるんだけど やってることは定義を繰り返してるだけでちっとも生成してない どういう意味で関数を生成したって言ってるんだろ・・ Stringで関数生成してevalで評価しましただったらわかるんだけど、これ違うよね それともhaskellの場合は関数定義は関数生成としているのか・・わからん 一体これは何が言いたいのか・・ 実はどうでもいいことで気にしなくてもいいなら納得するんだけども : デフォルトの名無しさん [sage] 2019/02/23(土) 17:31:29.38:YUL1Jv8G 前スレに比べて明らかに初心者が多いのは何故だ : デフォルトの名無しさん [] 2019/02/23(土) 17:37:12.35:5fn4St+r またHaskellのせいにしてるの? 以下は同等のJavaScriptだけど。 let foo = n => x => x * n; let foo10 = foo(10); foo10(10); //=> 100 foo10(20); //=> 200 let foo100 = foo(100); foo100(10); //=> 1000 foo100(20); //=> 2000 let foo5 = foo(5); foo5(10); //=> 50 foo5(20); //=> 100 てか何の言語なら知ってるんだっけ? : デフォルトの名無しさん [sage] 2019/02/23(土) 17:46:51.51:RiBir1w3 そうじゃなくてこれ関数定義だけで生成なんかしてないよね?って話 ぱっと見パスしてもいいようなどうでもいいことにも見える そうであれば次に行く どうもHaskellは納得いかないことがあまりにも多いんだ 文化の違いなのか考え方の違いなのかわからんけど CかObj-CかSmalltalk-80/VisualWorksで : デフォルトの名無しさん [] 2019/02/23(土) 17:59:11.82:5fn4St+r Cは実行時関数生成能力ないから仕方ないけど… let foo10 = foo 10 は関数を返す関数fooに10を渡して、 関数(¥x -> x * 10)を得て(これが、ここが「生成」) それにfoo10って名前を付けてるって理解は無理? あなたこれまでに¥x -> x * 10って関数定義した覚えある?書いた覚えがあるのは¥x -> x * nでしょ? まあ次行け次。 : デフォルトの名無しさん [sage] 2019/02/23(土) 18:05:45.67:RiBir1w3 foo10は結局のところ ¥x->x*n を呼び出してるだけじゃないの? ¥x->x*10って関数を生成してないよね? そういうことではない? : デフォルトの名無しさん [sage] 2019/02/23(土) 18:08:48.44:7gjHPQsv C++だったらtemplate引数として渡したら定義で、コンストラクタに渡したら生成 静的と動的がわかるのが前提だからわからないならpythonかjavascriptから始めるべき : デフォルトの名無しさん [sage] 2019/02/23(土) 18:12:36.80:RiBir1w3 PythonならBlenderで頂点やマテリアル抽出するときに必須だったから使ったことあるけど インデント縛りで胃が溶けそうだった 正直もうやりたくない・・ : デフォルトの名無しさん [] 2019/02/23(土) 18:18:49.99:5fn4St+r > foo10は結局のところ ¥x->x*n を呼び出してるだけじゃないの? Prelude> foo10 10 100 とかのこと言ってるんなら let foo10 = foo 10 で生成した関数(¥x -> x * 10)を呼び出してるつまり (¥x -> x * 10) 10 100 > ¥x->x*10って関数を生成してないよね? してるよ let foo10 = foo 10 の foo 10の部分で。 (生成のタイミングは今回置いとくとして) : デフォルトの名無しさん [sage] 2019/02/23(土) 18:28:43.67:RiBir1w3 わかった! 無名関数で定義されてるからできるってことかー 納得できたありがとう 次行ってみる : デフォルトの名無しさん [sage] 2019/02/23(土) 18:29:48.03:7gjHPQsv templateとコンストラクタとメソッドの考え方 関数と関数と関数の考え方 変わったのは見た目だけ : デフォルトの名無しさん [sage] 2019/02/23(土) 18:33:42.53:RiBir1w3 C++は全く知らないのでそっちはなんとも : デフォルトの名無しさん [sage] 2019/02/23(土) 18:51:02.51:RiBir1w3 早速詰まった何を言ってるのかわからん 一般に、関数を呼び出す場合、関数を評価するための環境は空リストです。 最初に、引数がこの環境に追加されます。let で定義される局所変数もこの環境に追加されます。 もしも、環境に該当する変数が存在しない場合は大域変数を参照します。 たとえば、foo 5 と呼び出すと環境は次のようになります。 foo 5 ==> 環境 : [(n, 5)] ghciで実行 Prelude> let foo n = ¥x -> x * n Prelude> foo 5 <interactive>:2:1: error: • No instance for (Show (Integer -> Integer)) arising from a use of ‘print’ (maybe you haven't applied a function to enough arguments?) • In a stmt of an interactive GHCi command: print it Prelude> そりゃそうだよねぇ・・ なんなんだろう何が言いたいのかさっぱりわからない 本当にこんな説明でみんな理解してったの? : デフォルトの名無しさん [sage] 2019/02/23(土) 19:26:38.79:hS0A7KKk そこクロージャの説明のとこでしょ? 読み飛ばしていいと思うよ 手元にHaskellの入門書何冊かあるけど目次や索引にクロージャ無いし 純粋関数型言語でありデフォルトで関数がカリー化されているHaskellに クロージャとかいう概念は別に要らないと思う 部分適用便利だねってことがわかればおk : デフォルトの名無しさん [sage] 2019/02/23(土) 19:34:16.40:RiBir1w3 そっかわかったありがとう! 関数の合成もすぐわかったのでさらに次行ってみる : デフォルトの名無しさん [sage] 2019/02/23(土) 20:14:35.45:RiBir1w3 データ型の定義まで来た なんというかやっぱりこのサイトこれからhaskell入門の人にはどうでもいい余計なこと書きすぎなんじゃ・・ と思った : デフォルトの名無しさん [sage] 2019/02/23(土) 21:08:00.52:RiBir1w3 do構文がIO型だからこのように書ける・・というのがどうもしっくりこないけど 都合上こうするしかなかったってだけの話で特別な意味はないのかな calc :: IO () calc = do putStr "Input Integer1 > " x <- readLn :: IO Integer putStr "Input Integer2 > " y <- readLn :: IO Integer let a = x + y b = x - y c = x * y d = x `div` y n1 = show x n2 = show y putStrLn (n1 ++ "+" ++ n2 ++ "=" ++ show a) putStrLn (n1 ++ "-" ++ n2 ++ "=" ++ show b) putStrLn (n1 ++ "*" ++ n2 ++ "=" ++ show c) putStrLn (n1 ++ "/" ++ n2 ++ "=" ++ show d) : デフォルトの名無しさん [sage] 2019/02/23(土) 21:24:41.95:24PtBhaW いちいち躓いたところで立ち止まらない これは別に関数型がどうとかに限った話じゃなく、未知のジャンルの勉強の話 まず思考を殺して30回読み返す 学ぶは真似ぶから始まる : デフォルトの名無しさん [sage] 2019/02/23(土) 21:25:53.99:RiBir1w3 納得しないと進まないタイプなので : デフォルトの名無しさん [sage] 2019/02/23(土) 21:31:22.65:24PtBhaW じゃあモナドとflatMapを理解しきってからdo構文に進んでください それ以外にないです : デフォルトの名無しさん [sage] 2019/02/23(土) 21:37:05.47:wr+1lm8V 読んでいるサイトが悪いのではないかなあ すごいH本とか HaskellではなくてOcamlだけど浅井『プログラミングの基礎』とかを読んだ方が 良いレベルだと思う : デフォルトの名無しさん [sage] 2019/02/24(日) 01:39:36.53:qI0VELUi do は (>>=) の糖衣構文 (=分かりやすく見やすくするための別記法) なので最終的にはモナドと (>>=) を理解するまではしっくりこない。 ttp://https://qiita.com/saltheads/items/6025f69ba10267bbe3ee : デフォルトの名無しさん [sage] 2019/02/24(日) 01:52:29.83:BExwBIrb 最終的に>>=演算子オーバーロードを理解する頃には難易度がC++と同じ : デフォルトの名無しさん [sage] 2019/02/24(日) 11:45:28.69:mBeDvEXM そういうことなら先に進んでもよさそう リンク先の見たら変換可能なこともわかった ありがとう! : デフォルトの名無しさん [sage] 2019/02/25(月) 13:11:14.94:EIUHHo5S haskellのGUIは何が主流なの gtkじゃネイティブUIに見えないからqtahとか? もしくはhaskellではGUIを扱わないとか? : デフォルトの名無しさん [sage] 2019/02/25(月) 21:33:28.52:jyEH5AtM 趣味でやってるが Threepenny 使ってる 簡単に組み合わせられるようになるかなと Elm も学習中 : デフォルトの名無しさん [sage] 2019/02/26(火) 21:42:21.10:DUz4HSDe 書籍「Thinking with Types」の第1章をサンプルPDF版で読んでいるのですが、 19ページ目の Exercise 1.4-i でつまずいています。 数式 (a^b)^c と a^(b*c) が等しいことを Curry-Howard isomorphism を使って証明する問題ですが、 これは、 to :: (b -> c -> a) -> (b, c) -> a from :: ((b, c) -> a) -> b -> c -> a という型の Haskell の関数を見つけよ、と言うことですよね。 しかし、問題文に書かれている to . from = id from . to = id の意味が分かりません。 to . from の型も from . to の型も共に id の型とは等しくないと思うのですが・・・ : デフォルトの名無しさん [sage] 2019/02/26(火) 21:57:34.53:PosTOau2 to :: (b -> c -> a) -> ((b, c) -> a) from :: ((b, c) -> a) -> (b -> c -> a) : デフォルトの名無しさん [sage] 2019/02/27(水) 01:02:26.71:2D6fGXPQ Haskellにはファーストクラス多相関数がないから idの型は単相なんだろう 単相のidという名前の同音異義語がちょっと多すぎるだけ : デフォルトの名無しさん [sage] 2019/02/27(水) 02:05:02.68:kdg0sG7A 思い出して今日発売のelm本、買おうかなと思ったら尼で売り切れててワロた。 : デフォルトの名無しさん [sage] 2019/02/28(木) 17:06:29.75:W9NOQ7xg 下記の2つの関数の rank について 関数 f は rank 2、関数 g は rank 3 で合ってる? f :: a -> (forall b. b -> c) g :: a -> (forall b. b -> c) -> d : デフォルトの名無しさん [sage] 2019/03/03(日) 20:55:07.64:/obVPbHS やっと意味が分かりました。 ありがとうございした。 : デフォルトの名無しさん [sage] 2019/03/03(日) 22:40:24.54:iXSrdfon 条件を満たす限り畳み込むfoldWhileみたいな関数がないのはなぜ? scanとtakeWhileで出来なくもないけど無駄なリストが生成されちゃうよね : デフォルトの名無しさん [sage] 2019/03/04(月) 10:06:50.76:P5wfz8lO scanした後はlast.takeWhileとかだと思いますがfusionされるので作られません : デフォルトの名無しさん [sage] 2019/03/04(月) 11:18:43.16:yQsTNF7X ありがとうございます fusion調べてみます : デフォルトの名無しさん [sage] 2019/03/09(土) 09:51:28.74:KBqn1KqM haskell入門ほぼ読んだけどちょっと物足りなくてもうすこしhaskell勉強したい欲がある(目的は競プロとか月並みにaiとか) なんかええ本ある? 数学の高速なライブラリとか圏論、モナドの解説あるやつで(数学は拒絶反応しない) get programming with haskellとか並行並列とか多少気になってるけどどう? : デフォルトの名無しさん [sage] 2019/03/09(土) 10:30:48.34:Vn/el/At 初心者を抜けた後、実践へ進みたいのなら幾つか勧められる本はある。 しかし、更なる勉強がしたいのなら、勧められる本はない。 初心者用か、初心者を抜けたばかりの者にはまだ難しい本しかない。 特に君の目的(競プロやAI)に叶う本は今のところ皆無だ。 なので、ネットを漁れ。 あと質問がやや曖昧で、何を求めているのか分からん。 数学の高速なライブラリの何を求めてる? それを自作できる知識なのか? 活用する知識なのか? もしくは、仕組みが知りたい具体的なライブラリでもあるのか? 圏論やモナドにしても然り。 それらの何が知りたいのか具体的に言ってみ。 : デフォルトの名無しさん [sage] 2019/03/09(土) 11:02:47.64:KBqn1KqM 具体的には数学書のような理論本ですね 今のところ全然数学臭さがないので(コンピュータとは乖離してるかもしれないけど) 速度に関しては、命令型の書き方でないのでどうすれば速度が出る書き方が出来るかが一番興味あります ai,競プロはやるとしたときの足掛かりが気になりました このみっつのどれかが掘り下げられれば幸いです。 : デフォルトの名無しさん [sage] 2019/03/09(土) 11:19:03.37:SKFKP+LU THUNKとかWHNFとかだろうけど 俺もここら辺の本とかあるなら読んでみたい : デフォルトの名無しさん [sage] 2019/03/09(土) 11:28:44.92:Vn/el/At 「数学書のような理論本」 悪いが意味が分からん。 具体的に「何が知りたいのか」を言ってくれ。 理論と言うのが大雑派すぎる。 速度を上げる方法を学びたいのなら、 ・Haskell High Performance Programming ・関数プログラミング 珠玉のアルゴリズムデザイン この2つが正にうってつけだが、 「Haskell入門をほぼ読んだ」段階では挫折しそう。 AI や競プロは前レスでも言ったが本は無い。 AI は reinforcement leaning や deep leaning など技術範囲を絞ったワードと haskell を組み合わせたキーワードでネット検索。 競プロは実際の競技で提出されたソースをたくさん読んで真似しろ。 : デフォルトの名無しさん [sage] 2019/03/09(土) 11:50:40.66:KBqn1KqM どうもありがとうございます。図書館で覗いてみます 具体的には、数学との関わりを体系だって書いてる書籍を探してましたが、そりゃ個々のキーワードで探す方が手っ取り早くて色々漁れますわな : デフォルトの名無しさん [sage] 2019/03/09(土) 13:09:34.75:HqfcKPNw 競プロにHaskellはどうなんだ…? 良くわからんけどSTモナド使いまくる感じになるのかな あるいは珠玉のアルゴリズムを理解仕切った超人達の集まりなのか : デフォルトの名無しさん [sage] 2019/03/09(土) 13:43:47.24:w1EXpOnc ,223 珠玉のアルゴリズムデザインへの入門としては同じ著者の 『Haskellによる関数プログラミングの思考法』 (旧版名は『関数プログラミング入門 ―Haskellで学ぶ原理と技法―』) がいいと思う 他の入門書よりは数学色が強いし 等式変形によって効率を改善していく運算も割と丁寧に扱っていると思う あとは『純粋関数型データ構造』とかも参考になるかも? ただ競プロならSTRefとかSTUArrayとかに習熟するほうが 手っ取り早いし有力かも : デフォルトの名無しさん [sage] 2019/03/09(土) 13:49:45.09:Vn/el/At 例えば AtCoder の参加者のコードを見てみると分かるが、 STモナドなんて使ってるヤツはいない。 そもそも、haskell に慣れたら、STモナドなんて使いにくいだけだろ。 競プロみたいな短く速いコードを書く必要があるなら尚更。 珠玉本を理解しきった者かどうかは知らんが、 極端に短いコードで解いてくるヤツは、 どちらかといえば数学の知識が豊富なんじゃないかな。 問題文を数学の世界に落とし込む事に長けているように見える。 コンテストにもよるが、競技プログラミングは 個人的にはアルゴリズム力よりも数学力がより大事だと思ってる。 例えば Project Euler の高番号問題をシンプルに解けるヤツは競技も強そう。 : デフォルトの名無しさん [sage] 2019/03/09(土) 15:47:05.82:KBqn1KqM どうもありがとうございます。StateとかSTは内部処理はよくわからないけど便利なので使い方おぼえておきたいとこですね : デフォルトの名無しさん [sage] 2019/03/09(土) 20:50:02.63:2ErVpr0y 珠玉本難解すぎる 登場する学生達が天才過ぎる : デフォルトの名無しさん [sage] 2019/03/10(日) 04:06:11.50:0rKUQSsg それでも理解したいのなら質問すればいい : デフォルトの名無しさん [sage] 2019/03/14(木) 01:49:52.87:pUnQtnNt instance head ってよく聞くけど、 これは instance 宣言のどの部分のこと? 例えば次の宣言の場合 instance (Foo a) => Bar (Baz a b) | a -> b where ・(Foo a) ・Bar (Baz a b) ・Bar (Baz a b) | a -> b ・instance キーワードと where キーワードの間の全部 ・その他 どれ? : デフォルトの名無しさん [sage] 2019/03/14(木) 02:00:29.34:pUnQtnNt すまん、instance 宣言に関数従属は無いよな。 改めて、 instance (Foo a) => Bar (Baz a) where この例だとどこが instance head なんだ? : デフォルトの名無しさん [sage] 2019/03/14(木) 08:32:21.91:pUnQtnNt 自己解決した。 instance head は => より右側かつ where より左側の部分だった。 スレ汚してすまない。 : デフォルトの名無しさん [] 2019/03/20(水) 22:23:43.02:GM5azBbl HaskellのGUI(Gtk2hs)でカウンター作ってみた。 import Graphics.UI.Gtk main = do initGUI window <- windowNew set window [windowTitle := "counter", containerBorderWidth := 10] mainbox <- vBoxNew True 5 containerAdd window mainbox label <- labelNewWithMnemonic "0" boxPackStart mainbox label PackNatural 0 countbtn <- buttonNewWithLabel "Count" clrbtn <- buttonNewWithLabel "Clear" boxPackStart mainbox countbtn PackNatural 0 boxPackEnd mainbox clrbtn PackNatural 0 widgetShowAll window onClicked countbtn (labelGetLabel label >>= \n -> labelSetText label (show (1 + (read n)))) onClicked clrbtn (labelSetText label "0") onDestroy window mainQuit mainGUI : デフォルトの名無しさん [] 2019/03/20(水) 22:24:12.70:GM5azBbl label <- labelNewWithMnemonic "0" boxPackStart mainbox label PackNatural 0 countbtn <- buttonNewWithLabel "Count" clrbtn <- buttonNewWithLabel "Clear" boxPackStart mainbox countbtn PackNatural 0 boxPackEnd mainbox clrbtn PackNatural 0 widgetShowAll window onClicked countbtn (labelGetLabel label >>= \n -> labelSetText label (show (1 + (read n)))) onClicked clrbtn (labelSetText label "0") onDestroy window mainQuit mainGUI : デフォルトの名無しさん [] 2019/03/20(水) 22:24:33.45:GM5azBbl boxPackStart mainbox countbtn PackNatural 0 boxPackEnd mainbox clrbtn PackNatural 0 widgetShowAll window onClicked countbtn (labelGetLabel label >>= \n -> labelSetText label (show (1 + (read n)))) onClicked clrbtn (labelSetText label "0") onDestroy window mainQuit mainGUI : デフォルトの名無しさん [] 2019/03/21(木) 05:11:02.25:EnD5r7yP コマンドラインでエンターを押すごとに数字が増えていく(Ctrl+C押すまで止まらない) Haskellコード main = mapM_ (\n -> print n >> getLine) [0..] out: 0 1 2 3 4 : デフォルトの名無しさん [sage] 2019/03/21(木) 22:17:24.35:2nCrXVEC 急にどしたんww gtk2hsのドキュメントがHackageから消えてるのは気のせい? : デフォルトの名無しさん [sage] 2019/03/21(木) 22:23:19.66:NO+0ze73 なかなかGHC8.8出ないね : デフォルトの名無しさん [sage] 2019/03/21(木) 23:42:33.25:42YMN3yF 無限ポップアップ上げるやつ現れないとは高尚なスレ リストで遅延評価使うのがなかなかハスケルっぽい : デフォルトの名無しさん [] 2019/03/22(金) 06:11:43.80:t/nkQ3ne 一応、カウンターみたいなのは純粋関数型言語には作れない言われてたから、作ってみた。 確かにi++みたいな事は出来ないが、違う方法で参照透明性を確保しつつ実現出来ると実感。 (個人的にHaskellには副作用はあると考えているが、参照透明性は崩れないとも考えている) : デフォルトの名無しさん [sage] 2019/03/22(金) 07:23:09.19:hntcvuv1 そりゃ副作用はあるよ。 じゃなきゃIO処理できない。 haskell の特徴は純粋な関数から副作用のある関数を呼べないこと。 : デフォルトの名無しさん [] 2019/03/22(金) 07:32:41.43:t/nkQ3ne うい。 そう言う仕組みになってるくせに、IOな関数も扱いとしては純粋な関数と同じ扱いなのが気に入ってます。 (型に気をつけていれば自然とそうなるし、普通にprint関数と純粋関数を関数合成出来るのが好き) : デフォルトの名無しさん [sage] 2019/03/22(金) 07:54:45.66:chPt0Ign 純粋関数型言語でカウンタが作れないというのは、 同じ関数を呼び出した結果がカウントアップされるような関数のこと。 pythonで書くとこんな感じ。 >>> def create_counter(): n = 0 def counter(): nonlocal n n += 1 return n return counter >>> counter = create_counter() >>> counter() 1 >>> counter() 2 : デフォルトの名無しさん [] 2019/03/22(金) 08:09:16.10:t/nkQ3ne そうなんですが、純粋関数型言語の場合、その関数を何回呼び出したのかカウントする関数を作るみたいな視点の切り替えで対処するのではと。 つまり自身のファイルを読み込んで自身(counter関数)を a = counter b = counter a = 1 b = 2 に置き換える関数なら作れます。 欲しいのは結果であり、動作ではなく結果が同じなら良いと言う解釈です。 : デフォルトの名無しさん [] 2019/03/22(金) 10:06:06.24:t/nkQ3ne 終了やカウントクリアに対応してみた。 import System.Exit main = do putStrLn "quit code is 'q', count clear code 'c'" mapM_ (\n -> print n >> getLine >>= f) [0..] f "quit" = exitWith ExitSuccess f "clear" = main f _ = return () : デフォルトの名無しさん [sage] 2019/03/22(金) 11:13:34.22:RqYJx/o4 副作用もカウンタもGUIもHaskellでできる (Haskellで作れるとは言っていない) : デフォルトの名無しさん [] 2019/03/22(金) 14:11:11.50:t/nkQ3ne まあ要はcounter関数はswap関数と同じですよ。 手続き型言語ではソートや繰り返しに必須ですが、関数型言語で各種ソート作る時にswap関数は使った事がない。 木を見て森を見ずというか、counter関数を何に使うの?って話で、カウンターとしての用途なら再帰関数の引数でf (x + 1)とか渡せば良いだけですし。 loop10 n | n > 10 = return () loop10 n = print n >> getLine >> loop10 (n + 1) : デフォルトの名無しさん [sage] 2019/03/22(金) 14:35:43.76:tc5CuCjg つまりHaskell(というかElm?)で無限アラート書いとけば捕まらなかった? : デフォルトの名無しさん [sage] 2019/03/22(金) 15:17:19.58:JJ/MZDcL Haskellの再帰は場合によってはヒープを使うから 10^9回ぐらい閉じる奴がいたらサイバーテロとして扱われてたかもしれない : デフォルトの名無しさん [] 2019/03/22(金) 15:36:25.55:t/nkQ3ne そこは気を付けなきゃだけど(と言うか、スタックは兎も角ヒープ使うってreverseみたいにリスト溜め込むとかだけで、手続き型言語でもあり得る場面に限られそうだが)、 むしろモナドな再帰(IOはもちろん、リスト->リストな再帰も)がループになると言うのは、 手続き型言語よりも再帰でスタック使うケースが少ないと言う魅力もある。 (ここは手続き型言語が末尾再帰最適化に対応しても追いつけない所) の通り、mainを再帰的に呼び出してもループになると言うのは知る限り手続き型言語では見たことない。 main変数が他の言語で言うmain関数的な動きをしているのも、圏論的には変数は引数無しの関数と見做せるから。 main変数を評価しようとすると束縛されたプログラムが動き出す。 n = 1 ― 変数であり、常に1を返す引数無しの関数 : デフォルトの名無しさん [sage] 2019/03/22(金) 17:16:42.19:JJ/MZDcL いやGHCが与えるスタックはヒープなんだよ Cのコールスタックみたいな固定領域じゃなくてね それもデフォルトで最大メモリの8割というデカさだから うっかり非末尾再帰を放っておこうものならスワップ地獄に陥る : デフォルトの名無しさん [sage] 2019/03/22(金) 18:49:40.42:tc5CuCjg 非末尾再帰を末尾再帰に自動変換するのって技術的に不可能? 末尾再帰ってなんか無理やり感あるよね : デフォルトの名無しさん [] 2019/03/22(金) 19:00:24.32:E/4CSIEY フィボナッチを再帰で書くと定義がそのまま動く感動が味わえるのに末尾再帰に書き直すととたんに台無しになるよねw : デフォルトの名無しさん [] 2019/03/22(金) 22:26:05.94:t/nkQ3ne ヒープにあろうがスタックにあろうが末尾再帰に意識して書けばまず解決する問題だね。 ghciやrunghcみたいなスクリプト形式だと最適化(部分的な正格評価)が不十分で sum’ n [] = n sum’ n (x:xs) = sum’ (n + x) xs という末尾再帰があった場合、 sum’ 0 [1,2,3] = sum’ (0 + 1) [2,3] = sum’ ((0 + 1)+ 2) [3] = sum’ (((0 + 1)+ 2)+ 3) [] みたいに(遅延評価のせいで)結果を入れる変数の方でスタック消費するけども、コンパイラ(ghc)の方はこの問題は無い。 : デフォルトの名無しさん [] 2019/03/22(金) 22:43:20.21:t/nkQ3ne 別に数列(リスト)から取り出す形にすれば末尾再帰にする必要ないでしょ。 main = print $ fibs!!3 ― 0から数えて3番目 where fibs = 0:1:zipWith (+) fibs (tail fibs) foldlの正格評価版 foldl’みたいにzipWithの正格評価版作って差し替えると高速化する。 (このネタ書いてたブログの人はzipWith’を標準で入れてて欲しいって書いてた) zipWith’ f (x:xs) (y:ys) = seq a $ a:zipWith f xs ys where a = f x y zipWith’ _ _ _ = [] : デフォルトの名無しさん [sage] 2019/03/22(金) 23:37:15.19:cqN2FVLj 定義そのままで書きたいって話であって末尾再帰だからダメとは言ってないでござるよ : デフォルトの名無しさん [sage] 2019/03/23(土) 11:46:10.06:CUvnstPX 「感動」はダメとは言わないが意味がわからないと言いたい : デフォルトの名無しさん [sage] 2019/03/23(土) 11:57:03.27:XiFmcVOc 自然に書くなら数学の定義通り書くよね でも今のコンピュータの制約上仕方なく末尾再帰にしないといけないよね 自然に書ける日は来ないのかなあってある種当たり前の感覚だと思うけど : デフォルトの名無しさん [sage] 2019/03/23(土) 11:59:26.53:OxD1K8Qf コンピューターの制約で変えねばならないならば定義に問題がある 定義は可能な限り一般に適用可能でなければならない よって定義を変えればよい : デフォルトの名無しさん [sage] 2019/03/23(土) 12:03:29.66:CUvnstPX 感情をそのまま言語化できるなら犬や猫も言葉を話せることになる 実際には感情と言語は一致しないので感情をそのまま言語化することはない : デフォルトの名無しさん [sage] 2019/03/23(土) 12:16:16.80:XiFmcVOc 何か噛み合ってないな 自然な感覚に近い表現ができるほうが可読性高いよねくらいの話でしかないはずなのに 今何の話になってるんだ?? : デフォルトの名無しさん [sage] 2019/03/23(土) 12:18:39.39:CUvnstPX 言葉を話さない動物やAIには言語の制約がない ゆえに動物やAIは人間を超える可能性がある 壮大な詭弁だ : デフォルトの名無しさん [sage] 2019/03/23(土) 12:22:19.42:OxD1K8Qf 末尾再帰=ループ 分岐が発生するとこの関係が崩れる : デフォルトの名無しさん [sage] 2019/03/23(土) 12:26:33.46:XiFmcVOc 何か変なとこに手出しちゃったみたいですね もうやめときます スレ汚し失礼しました : デフォルトの名無しさん [sage] 2019/03/23(土) 13:28:21.51:CUvnstPX 可読性で思い出したが ソースを読まなくても使ってみればわかることは読まない方がいい 読んだときの自然な感覚なんかよりも、そもそも読まないのが最も自然 : デフォルトの名無しさん [sage] 2019/03/23(土) 16:34:59.79:3o0No0Hu 可読性をあげるためだけに型に別名つけるのってどうなの type Description = Text みたいなやつ : デフォルトの名無しさん [sage] 2019/03/23(土) 17:38:52.05:LmX3enfk まあ読みやすさっていうか書きやすさだよなそれ : デフォルトの名無しさん [sage] 2019/03/23(土) 18:36:54.54:CUvnstPX 読むコストを下げるためだけにギャンブル ○○のコストは安いというのが本当か嘘かを賭ける 賭けないのが最も安いと思わないか : デフォルトの名無しさん [] 2019/03/23(土) 19:48:40.97:abrpiqJH ttps://i.imgur.com/816HQOu.jpg ttps://i.imgur.com/wTI8fNg.jpg 一応、末尾再帰も式変形した定義通りなんだけどね。 fib3 0 a _ = a fib3 n a b = fib3 (n - 1) b (b + a) n = フィボナッチ数のn番目(fib n) a = fib nの時のフィボナッチ数 b = fib (n + 1) の時のフィボナッチ数 fib3 nはfib3 (n - 1)のbがaになり、b(fib3 (n + 1))はfib3 (n - 1)のb(fib3 n) と a(fib3 (n - 1))を足したものである。 : デフォルトの名無しさん [sage] 2019/03/23(土) 23:02:28.70:3o0No0Hu 賭けない、は具体的には何? 型シノニムを使わないということ? : デフォルトの名無しさん [sage] 2019/03/24(日) 00:23:58.92:d5Z4QiMu 使うのは自由だが可読性の勉強等はしないということ : デフォルトの名無しさん [sage] 2019/03/24(日) 00:47:12.07:xnhJaehN 悩んでないでスタイルを決め打ちして自分が自然だと思える書き方で行く、みたいな感じですか : デフォルトの名無しさん [sage] 2019/03/24(日) 09:54:41.46:d5Z4QiMu そんな言葉は使う必要がねーんだ 書き方は決まってないのにもうすでに書き終わってるからだ : デフォルトの名無しさん [sage] 2019/03/24(日) 11:22:25.74:aOFJUm+g やっぱりHaskellは常人向けではないんですね Ocamlやります : デフォルトの名無しさん [sage] 2019/03/24(日) 12:49:13.41:d5Z4QiMu そういえば言語も決まってなかったな 常人は言語を決めないとプログラムを書けないってマジ? : デフォルトの名無しさん [sage] 2019/03/24(日) 15:26:29.39:x/w14fyx Windowsでは、昔のrubyみたいな状況なので、 それ以外のプラットフォームでやるのがいいよー : 273 [sage] 2019/03/24(日) 16:35:05.61:xnhJaehN よく判らないアドバイスだったな… 勉強・研究しないで突っ込むのはそっちの方が賭けてる感あるし、 すぐに書き終えるなら確かにそういう難しさはないが、 ソフトウェアのプロジェクトって面白いものは大抵長くなると思う。 Windows環境はWSLではダメなん? : デフォルトの名無しさん [sage] 2019/03/25(月) 18:54:20.99:3963segm 感情表現と言うように感情はあくまでイメージ想起性のもので 文法を持ってないものだと思う。 感情をそのまま言語化なんて人間でもしてないだろ。 あくまで論理的内容の会話文章の表現に感情を想起させる表現を 選んで論理としては同じだけれど得られるイメージが異なる文を 作っているだけだと思う。 そこで文を構成するために選ぶ表現がやたら極端なときに、感情的と評されているだけで。 ていうかおじさんになったしもう無理 : デフォルトの名無しさん [sage] 2019/03/25(月) 20:49:31.29:PHYb4OS3 得られるイメージが変わってしまうのはコンピュータの制約のせいだよ fibのイメージをそのまま表現できたら感動するのになあ この状況ではコンピュータの制約は変えたいがイメージは変えたくない 「論理としては同じだけれど得られるイメージが異なる」という想定は大外れ : デフォルトの名無しさん [sage] 2019/03/25(月) 21:05:17.06:8+7iDICf イメージw お前らあほだろ : デフォルトの名無しさん [sage] 2019/03/25(月) 21:17:58.51:PHYb4OS3 コンピュータの制約が悪夢のようだから消去法でイメージ あほなことしてるだろ 俺達なんだぜこれ : デフォルトの名無しさん [sage] 2019/03/25(月) 21:19:23.78:3963segm イメージないと妥当性の判断もできんぞ。 これだって 書き込み内容を読んで 内容から推測される人物像をいままでの記憶から割り出して そういう人物に対してかつてもった心象(イメージ)を この場合の想定(先入観)として設定して 否定的判断をするという内容を伝達しているだろ 大体こういうプロセスじゃね? : デフォルトの名無しさん [] 2019/03/25(月) 21:58:18.36:25q5twYk 数学の世界で効率を全く重視してないわけじゃないからな。無限の速度のCPU上なら同じと見なせるってだけで。 末尾再帰のfibとか数学的だからアーキテクチャ関係なく元の定義より速い。 行列苦手だから書けないが、もっと速い行列バージョンも存在する。 : デフォルトの名無しさん [sage] 2019/03/25(月) 22:00:17.95:q0PAKLo0 これなんか深かった。結局愚直なコードのままで良かったみたいな ttp://https://haskell-jp.slack.com/archives/C5666B6BB/p1551956556140300 : デフォルトの名無しさん [sage] 2019/03/25(月) 22:05:21.04:q0PAKLo0 あとこれ。今はコンパイラが賢くなったのでfoldlが遅くなくなったよって話 ttp://https://qiita.com/autotaker1984/items/09c5ceaa13e9077f5359 : デフォルトの名無しさん [] 2019/03/25(月) 22:10:40.54:25q5twYk これはPrologについて書かれているが、ここで話題にしてるのはこの記事と同じ議論だろう? 宣言型プログラミングの可能性と限界 ttp://https://thinkit.co.jp/article/157/3 : デフォルトの名無しさん [sage] 2019/03/25(月) 22:23:26.20:PHYb4OS3 全く読んでないがパラダイムと論理は同じではない パラダイムの限界と論理の限界は同じではない : ◆QZaw55cn4c [sage] 2019/03/25(月) 22:53:06.90:/j2VHiDc >末尾再帰のfib fib が末尾再帰でかけますか? : デフォルトの名無しさん [] 2019/03/25(月) 23:23:28.81:25q5twYk つ : デフォルトの名無しさん [sage] 2019/03/25(月) 23:29:06.55:4CvSxgZ7 sum x:xs = x + sum(xs) は数学っぽく見えるけどアキュムレータ噛ますと途端にループに見える不思議 : デフォルトの名無しさん [sage] 2019/03/26(火) 02:32:22.40:IahGxu4l アキュムレータは余再帰っぽく見える 数学っぽいの反対は余再帰っぽい説 : デフォルトの名無しさん [] 2019/03/26(火) 19:05:26.53:8dCBuWSX Haskell知らんでも無意識に みたいな式を思い描いて for文とかに落とし込んでる感じじゃね? n回繰り返すのが昇順か降順かの違いだけで。 Python def fib(n): temp = 0 a = 0 b = 1 for i in range(n): temp = a a = b b = b + temp return a for i in range(10 + 1): print(fib(i)) Haskell main = mapM_ (print.fib) [0..10] fib n = fib' n 0 1 where fib' 0 a _ = a fib' n a b = fib' (n - 1) b (b + a) : デフォルトの名無しさん [sage] 2019/03/26(火) 19:25:31.93:NbUyZWCM 誰でも頭が良くなる、プログラムが書けるようになる方法が発見される 42162 ttp://https://you-can-program.hatenablog.jp : デフォルトの名無しさん [] 2019/03/31(日) 07:28:40.29:S4Tb/ZFO プログラマーのための圏論と言うPDFで公開されてるのが分かりやすい。(上・中・下の三冊) ttp://http://bitterharvest.hatenablog.com/entry/2016/11/24/203021 : デフォルトの名無しさん [] 2019/04/04(木) 13:40:08.49:l5IgkZnr 自然数が射(関数)になっていると言う感覚が分かった気がする。 Haskellで書けないけど、書けるとするなら 1 = 1 1という名前の1を返す引数無しの関数。 : デフォルトの名無しさん [] 2019/04/04(木) 13:43:46.44:l5IgkZnr 記号的な1を1と書き、概念的な1をチャーチ数で表現するなら 1 = succ zero : デフォルトの名無しさん [sage] 2019/04/04(木) 21:34:52.78:1azb3qjG トートロジーではないのかね? : デフォルトの名無しさん [] 2019/04/05(金) 00:53:58.06:OJKC59P7 トートロジーとかチンプンカンプンな高卒なんで。。。 補足説明や訂正があったら勉強になります( ̄^ ̄)ゞ : デフォルトの名無しさん [sage] 2019/04/05(金) 04:10:43.04:sAmwqHSu ラムダ的な自然数は高階関数を使うけど、圏論は冪を使わないことが多い : デフォルトの名無しさん [] 2019/04/05(金) 08:37:08.96:OJKC59P7 Haskell でもsuccって関数ありましたね。。。 私が 1 = succ zeroで表現したかったのは、どんな数体系でも1と表現される何かという意味での1です。 例えば16進数の10はAと表現されますのですが、 A = 10 とすると10が16進数では10進数の16になるので10進数でも16進数でも10として扱われる概念としてチャーチ数にしたかったのですが、 チャーチ数も含めた全ての数体系で10として扱われる何かを表現したいみたいな。 うーん。。。表現力が乏しくてすみません。 : デフォルトの名無しさん [sage] 2019/04/05(金) 18:59:26.73:6LVMJo12 本当の所は Int $ succ Zero というような頭部正規形で表される関数のシンタックスシュガーだと思う : デフォルトの名無しさん [sage] 2019/04/05(金) 21:40:52.25:o6EhB3bR HNFは射ではない そもそも圏論にHNFはない : デフォルトの名無しさん [sage] 2019/04/06(土) 02:09:18.76:T7Hr9MEJ ・チャーチ数はペアノシステムの1つの実装である ・任意のペアノシステムは(適当な公理のもとで)互いに同型である みたいな話? : デフォルトの名無しさん [sage] 2019/04/06(土) 03:06:25.41:0mL0rlV1 > HNFは射ではない > そもそも圏論にHNFはない こういう表現は間違い 何が射かであり何が圏でないかは、どんな圏を考えているかに依存する 例えばだが、単純な型付λ計算(型の集まりが直積型の構成と関数型の構成について閉じている)に対応する圏、つまり単純な型とそれで型付けされるλ項の成す圏を考えることができる そこでは、対象は個々の型で、射はλ項だ そして個々のλ項は、そのλ項の中に現れる自由変数の各々の型の積対象からλ項全体への型という対象への射と考えるというものだ この場合、λ抽象があるので冪対象が必要になり、従って、この単純な型付λ計算に対応する圏は必然的に積閉包圏というタイプの圏になる これはいわゆる“categorical type theory”(圏論的型理論)の最も簡単な具体例だ この圏の場合は単純な型付けに関してwell-typedなλ項は全て射として認められるのでもちろんhead normal formになっているλ項もwell-typedである限りは射だ : デフォルトの名無しさん [sage] 2019/04/07(日) 09:14:23.15:KosuYA7L Haskellの開発環境で、ブレークポイント張って評価中の変数の値を見る、みたいなのって出来ますかね? Visual Studioのローカルウィンドウ的なの。 普段はSpacemacs使っててREPLで評価しては進め、評価しては進め、みたいな感じでやってます。 : デフォルトの名無しさん [sage] 2019/04/18(木) 13:41:44.67:iN8m+OWc 並行並列言語Haskellの基本と特徴 ttp://https://logmi.jp/tech/articles/321095 2018年11月10日、Haskell-jpが主催するイベント「Haskell Day 2018」が開催されました。 純粋関数型プログラミング言語Haskellをテーマに、Haskellに興味のある人から入門者、 ちょっとできる人まで、様々な層に向けたプレゼンテーションを行った本イベント。実務 から研究まで、幅広いHaskellの事例を共有します。プレゼンテーション「並列並行言語 Haskell 」に登壇したのは、syocy氏。講演資料はこちら (↓)(後略) ttp://https://speakerdeck.com/syocy/bing-lie-bing-xing-yan-yu-haskell ttp://https://speakerd.s3.amazonaws.com/presentations/07d92af9d7aa40bca6cc3959d3f56b28/parallel-and-concurrent.pdf : デフォルトの名無しさん [sage] 2019/04/18(木) 23:50:53.53:uUujkJat オライリー本の要約だけ?みたいな : デフォルトの名無しさん [sage] 2019/04/25(木) 08:46:13.49:xhj9dxYD cabalのnew-から始まるnixスタイルコマンドが出来たからtackつかう意味あまりないですよね : デフォルトの名無しさん [sage] 2019/04/25(木) 09:33:12.75:s2usWHpE v2-build だっけ? よく知らないが stack いらなくなるやつなんだ? : デフォルトの名無しさん [sage] 2019/04/25(木) 23:59:42.81:EXuFo8FY stackageが変わるんですねぇ。stack2も間もなくとか。 ttp://https://www.fpcomplete.com/blog/2019/04/stackage-changes-and-stack-2 : デフォルトの名無しさん [sage] 2019/04/29(月) 10:21:15.20:La7Zhpj6 stack or cabal どっちを使えばいいんだ : デフォルトの名無しさん [sage] 2019/04/30(火) 07:55:22.06:tedPJGU+ stack! : デフォルトの名無しさん [sage] 2019/04/30(火) 15:29:26.12:Dc6+0j7S 迷う理由がわからない 現時点で好きな方を使えばいいのでは? どっちを使っても、後で後悔することなんてないと思うが : デフォルトの名無しさん [sage] 2019/04/30(火) 18:00:12.30:hygavAeS もはや同等とみていいの? 一長一短がイマイチ見えないので比較できない。 : デフォルトの名無しさん [sage] 2019/04/30(火) 18:03:11.15:hygavAeS 入門者に紹介するときはどうすれば? : デフォルトの名無しさん [sage] 2019/05/01(水) 13:06:07.04:ALj9hUB7 自分で情報を得られず、比較できなくて選べないくらいなら、 一長一短なんか考えずに、今好きな方や気になる方を使えば良いんだよ。 stackを長い間使ってきたから今後も使い続ける、でもいいし、 新しいcabalに興味が沸いたからcabal使ってみる、でもいい。 例えばパーサーライブラリ、Webライブラリ、FRPライブラリなどは色々あるけど、 いちいち「一長一短を比較した上で」選ぶ人はそんなに多くないでしょう。 みんな取りあえず何か一つ使ってみて、他に興味が湧いたら浮気してみて、 それからでしょ、比較するのは。 : デフォルトの名無しさん [sage] 2019/05/01(水) 13:20:11.30:ALj9hUB7 両方の一長一短をちゃんと比較して紹介するのは、 記事や本を書くプロや、意欲のある人に任せればいいと思う。 紹介のプロじゃないのなら、自分が好きな方を精一杯アピールすればいい。 それもできずに、初心者にどちらを紹介しようか悩むのなら、順番が違う。 どちらか一方でもアピールできるくらい使い込むのが何よりも先でしょ。 : デフォルトの名無しさん [] 2019/05/01(水) 13:42:48.29:gsz88y7w まぁこの手の選択にある程度以上責任持って助言するのは難しいんだよな。 少なくとも両方使ってないとどっちがいいとか言えないし。 ほとんどの人が最初に使った方をそのまま使い続けるもんじゃね。 私もcabalしかつかったことないし。 : デフォルトの名無しさん [sage] 2019/05/01(水) 14:03:02.54:01/czEVZ 「みんなの見解を聞く」も自分で情報を得る過程のひとつだと思ってるんだが 記名ネットではしにくい無責任方言もここなら言えるでしょ : デフォルトの名無しさん [sage] 2019/05/01(水) 14:23:04.11:01/czEVZ まだキチンと検討していないが、自作したツールをbrewとかで公開するとき、ビルドツールを依存に含める必要が出てくると思う。予めどっちかを使うかは決めておきたい。 バージョンを重ねるなかでフラフラ変えるのは避けたい。 あとcabalだとコンパイラを替えるときはghcupなる別ツールを使うの? これだとクロスコンパイラはどうなる。 複数のアーキテクチャのための成果物をビルドするとき、ghcup set ... && cabal build && ghcup set ... && cabal build ... みたいにいちいち指定しないといけないのかしら。 コレを解決するにはghcupにパッチを当てるかcabalを改造するか、スクリプトを書くかするわけだ。その点 stack build はコマンド一発なのに。 俺は年間50時間くらいstackのパッチや関連ツールを書いてきた。このままで行けるならいいが、stack がいずれオワコンになるなら早めに見切りつけて時間節約したい。 新元号が30年続くなら令和中に1500時間も浪費することになるんだぜ。 : デフォルトの名無しさん [sage] 2019/05/01(水) 14:53:10.97:ALj9hUB7 > 記名ネットではしにくい無責任方言もここなら言えるでしょ そんなレスは情報ではないのでは? ただのノイズでしょ(ノイズの全てがゴミとは言わないが)。 本当に情報を得たいのなら、時間の無駄だよ。 もし、そんなのを参考にどっちか決められるのなら、 初めからルーレットで決めるのと大して変わらないのでは? 「自分で情報を得る」の第一歩は、ビルドツールで一番何がしたいかを決めて、 それが出来るか、やりやすいかを「公式ドキュメント」を見て調べる事だよ。 stackとcabalの公式ドキュメントを見て比較して、 それでも分からない部分をピンポイントでSNSや掲示板などで質問する、 それが二歩目だと思う。 : デフォルトの名無しさん [] 2019/05/01(水) 16:46:41.64:fQT4rWd7 伸びてると思ったら。。。 今の所stackかな。 cabalは依存関係で過去に評判悪かったから、新しいのの評判が固まったらかな。 : デフォルトの名無しさん [sage] 2019/05/02(木) 10:15:34.23:PPz8MGJz 調査を並行してやっちゃいけない理由はないでしょ。聞くだけならタダやし。 スレ民の意見をノイズだなんて思ったことないよ。自分にない視点や個人的使用感、気づきにくい落とし穴を教えてもらえるかも。 俺の雑感はstackは不備だけでなくバグも多かった気がする。.stack-workを消したらビルドが直ったみたいなことが何回かあったと思う。 stackのメリットは、 (ghcupの方針が変わらないなら)コンパイラの導入まで自動でやってくれるので、例えばHaskellスクリプトを書いてシェバンにstack、 以降に依存ライブラリを書いておけばいつでもどこでも動く(HackageとStackageが活きてるかぎり)、必要なものを都度自動で用意してくれる。 stackのデメリットは、 設定ファイルが多すぎる。プロジェクトレベルでは stack.yaml, package.yaml, Hoobar.cabal と、どれに何を書くかが判りづらい、いちいち引っかかる。 : デフォルトの名無しさん [sage] 2019/05/02(木) 12:34:35.03:WAiWu/DB 無責任放言がノイズなんだよ。 で、その全てがゴミとは言わないとも言ってる。 : デフォルトの名無しさん [sage] 2019/05/02(木) 13:13:18.93:PPz8MGJz 前半は反論したし、後半は批判してないですよ。 : デフォルトの名無しさん [sage] 2019/05/03(金) 01:40:50.69:nJ30PKpf 凄いH本の中国語版見る機会があって、 漢字の用法がカタカナ語より しっくりすると思ったんですけどどうでしょうか。 模式: パターン 門衛: ガード 類型類: 型クラス さすがにモナドは漢字翻訳難しいみたいですが。 : デフォルトの名無しさん [sage] 2019/05/03(金) 06:21:38.43:hYhvNKlL その程度のカタカナがしっくり来なかった人生を反省するんだ : デフォルトの名無しさん [sage] 2019/05/03(金) 09:01:46.98:gvxbExu1 慣れとしっくりくるのは別物だけどな 無意味刺激と有意味刺激、表音文字と表意文字に対する認知は先天性の個人差があるんだからあまり他人の人生なんて分かりもしないものに言及するべきではない どちらにせよ今の中国は学術用語を積極的に訳する文化ではあるよね Haskellに限らずclassや他の用語もそれに類した漢字が用いられてそう ただこれも漢字の意味が時代によって変化してくると正しい用語認識を阻害しうるのは現代日本でいくらか見られているし、一長一短と個人差だね : デフォルトの名無しさん [sage] 2019/05/03(金) 10:47:01.08:4xTnxfhe かつてアルゴリズムを算法とかコンパイルを翻訳とか 一部で言っていましたね。 モナドアクションを算法と訳すならモナドは法かぁ などと連想してみました。 : デフォルトの名無しさん [sage] 2019/05/03(金) 11:01:45.26:aPBgVjEU 漢字に訳する場合どっか権威のあるところが決める必要があるよね そういうところがめんどくさい : デフォルトの名無しさん [sage] 2019/05/03(金) 12:09:36.96:4xTnxfhe 大陸だと結構あちこちで勝手に翻訳されたり 輸入されていずれ収斂されていくっていう 感じだった。 日本でも官公庁の訳語が定着しないことも 多いよね。 : デフォルトの名無しさん [] 2019/05/03(金) 12:40:40.57:eVcW5sZJ 流れも読まずminからmaxまでのランダムな数のリスト(要素数n)を得る関数作って見た。 takerand _ _ xs 0 = return xs takerand mn mx xs n = do x <- randomRIO (mn, mx) takerand mn mx (x:xs) (n - 1) 使い方は rs <- takerand 1 6 [] 10 これで1ー6までのランダムな数が10個入ったリストが手に入る。 : デフォルトの名無しさん [] 2019/05/03(金) 12:41:50.16:eVcW5sZJ 流れも読まずminからmaxまでのランダムな数のリスト(要素数n)を得る関数作って見た。 takerand _ _ xs 0 = return xs takerand mn mx xs n = do x <- randomRIO (mn, mx) takerand mn mx (x:xs) (n - 1) 使い方は rs <- takerand 1 6 [] 10 これで1ー6までのランダムな数が10個入ったリストが手に入る。 : デフォルトの名無しさん [sage] 2019/05/03(金) 14:37:49.43:af96C5Xg それなら、getStdGen と randomRs と take でいいのでは? takerand mn mx n = getStdGen >>= return . take n . randomRs (mn, mx) あるいは takerand mn mx n = take n . randomRs (mn, mx) <$> getStdGen : デフォルトの名無しさん [sage] 2019/05/03(金) 14:52:14.89:af96C5Xg いいのでは、と言うのは失礼な言い方だった。 こういう方法もあるよ、と言うことで。 : デフォルトの名無しさん [] 2019/05/04(土) 06:36:55.99:S+NYX3By そう言うのがあったのね。。。 thanks. : デフォルトの名無しさん [sage] 2019/05/04(土) 09:34:13.31:6lRHaHYp Arrowised FRP を 矢矧のFRP とかいうのは好き : デフォルトの名無しさん [sage] 2019/05/04(土) 09:36:30.32:6lRHaHYp 型クラスの訳語 類型類 は、kindの 類 とごっちゃになるな、と思ったけど、 kindは 種 が主流なのか : デフォルトの名無しさん [sage] 2019/05/04(土) 17:11:10.97:MNo33vgu 主流というか、それ以外に聞いたことがない : デフォルトの名無しさん [sage] 2019/05/04(土) 18:12:27.03:6lRHaHYp 初期の訳語では類だったかも? ttp://https://www.sampou.org/haskell/tutorial-j/classes.html : デフォルトの名無しさん [sage] 2019/05/06(月) 16:30:54.25:gerN8CWz すみませんHaskellでアート芸術方面のプログラミングをしたい場合 既存の表示用ライブラリは導入からして難しそうな印象があるので 表示はProcessingに任せるという方法を考えていますが、 ttp://http://hackage.haskell.org/package/processing-for-haskell もしそういう方面に詳しい人がいましたら それについての助言を頂きたいです。 : デフォルトの名無しさん [sage] 2019/05/06(月) 16:46:03.96:jvaKyQ4h なにを助言してほしいのか具体的に明確に言ってくれ。 : デフォルトの名無しさん [] 2019/05/06(月) 21:07:46.31:gerN8CWz 説明が不十分ですみません。 アート芸術のプログラミングを行う場合 表示は既存ライブラリは使わずに Haskell-Processing連携ライブラリを使って データ処理と表示を切り分けた方が 簡単なのではないだろうかという質問でした。 ttp://https://github.com/anton-k/processing-for-haskell/blob/master/tutorial/QuickStartForProcessingers.md 表示はProcessingで行います。 : デフォルトの名無しさん [sage] 2019/05/06(月) 23:14:35.12:jvaKyQ4h データ処理と表示処理を切り分けた方が開発が楽になるのはその通り。 でも、グラフィックス ライブラリに何を使うかと、 楽に切り分けできるかどうかは、一般には関係ない。 特に haskell のグラフィックス ライブラリはたいてい EDSL 形式になっているから、 どれを使おうが、切り分けの楽さは大して変わらない。 後はもうライブラリの表現力が求めるレベルにあるかどうかと、 個人の経験や慣れ、趣味の問題だ。 Processing に慣れているなら processing-for-haskell でいいだろう。 個人的には gross が好き。 ところで、既存のライブラリって何だ? processing-for-haskell は 2016 年でアップデートが止まってるが、 これは既存ではないの? : sage [] 2019/05/06(月) 23:44:49.55:gerN8CWz ありがとうございます。理解しました。 参考にしたのが School of Expression だったので 情報が古くprocessing-for-haskellが 最新の物と思えて勘違いしてました。 : デフォルトの名無しさん [sage] 2019/05/07(火) 14:46:19.40:A4BDuZrS diagrams を使ってた。 : デフォルトの名無しさん [sage] 2019/05/08(水) 18:25:39.72:Sfv9Blmq そういうことをしたいならProcessingだけでやった方が手間かからない Haskellで書けば楽になるとかそんなことは一切ないので : デフォルトの名無しさん [sage] 2019/05/08(水) 22:03:23.22:Et3ZqY/0 「haskellで」アート芸術方面のプログラミングをするには、という質問だと思う。 ジェネラティブアートなんか haskell にもってこいじゃないかな。 もちろん、Processing の得意分野でもあるんだが、 宣言的に書ける haskell もけっこうマッチするのでは? 全て型プログラミングで生成とかもできそう。 : デフォルトの名無しさん [sage] 2019/05/12(日) 15:06:12.68:11og9P/f f xs = let g = \x -> 2 * x in map g xs この場合、ラムダは最初に一回メモリにアロケートされて g に束縛されるよね。 でも、もしかして、 f xs = map (\x -> 2 * x) xs これって、f が呼ばれる度に map の第一引数のコード(ラムダ)がメモリにアロケートされるの? : デフォルトの名無しさん [sage] 2019/05/12(日) 21:06:22.80:yBh745ei クロージャにしなくてもいいラムダはただの関数として扱われるんじゃない? というか上のコードならセーフっていうのはgを使いまわしてくれるから? そんな気の利いた処理系なら下のラムダも使いまわしてくれそうだけど : デフォルトの名無しさん [] 2019/05/12(日) 21:12:09.17:x0KgamNa その辺り、実際にどんな実行コードが生成されるかに関しては、 コンパイラ(GHC)に聞いてくれ、としか言いようがない インライン展開とかクロージャ変換といったコンパイラ技法を学ぶことを勧める 関数型言語だからTiger本とか : デフォルトの名無しさん [sage] 2019/05/13(月) 01:00:48.68:Jw01/DTu ラムダは何も簡約しなくても最初からWHNFじゃないのか 最初からWHNFならサンクとか不要だから普通の言語と同じでいい : デフォルトの名無しさん [sage] 2019/05/13(月) 23:41:36.79:kVO0yWqO ラムダ式が動的に生成されるものと思っているのなら間違い この場合は単なる関数として展開されている : デフォルトの名無しさん [sage] 2019/05/14(火) 19:41:06.85:B2OD/x5C なるほど、納得できた。 これからは安心して引数にラムダを直接書ける。 ありがとう。 : デフォルトの名無しさん [sage] 2019/05/23(木) 06:24:49.40:Jx74KNT2 mtl によるモナド合成はモナド則を保存しない マジかよ失望しました。mtl は窓から投げ捨てます : デフォルトの名無しさん [] 2019/05/23(木) 17:37:28.82:4B/apNfB 動的型付けに比べて静的型付けの方が優れている、は常に真? 実はHaskellで動的プログラミングをやる話を読んで、 あれっコレ意外といいじゃんと思ってしまったんだ。 : デフォルトの名無しさん [sage] 2019/05/23(木) 18:42:06.90:ATxGBnNk 次にお前らは『優れているを定義してくれ』と言うッ! : デフォルトの名無しさん [sage] 2019/05/24(金) 01:05:05.82:jCONIFNW 任意の言語に丸投げするシェルスクリプトはズル 文字列をevalするやつもズル ズルをする必要がない言語は優れている どうせこんな感じだろうと思ってる : デフォルトの名無しさん [sage] 2019/05/24(金) 04:51:31.33:3xUJmLCM いくつかの基準が思いつく。 速い・短い・アシストが手厚い・理解しやすい・バグが混入しにくい… 「ズル」には悪い、の意味が予め含まれていると思うので納得できない。 evalを用いた場合に比べて静的型の解決の方が優れているのを示す必要があるでしょう。 : デフォルトの名無しさん [sage] 2019/05/24(金) 08:28:17.80:jCONIFNW 格闘技ですら、反則には反則負けという意味が含まれている : デフォルトの名無しさん [sage] 2019/05/24(金) 09:32:47.08:3xUJmLCM 含まれてないと思うし、Haskellに関係ない。 : デフォルトの名無しさん [] 2019/05/24(金) 11:18:44.54:YDCPM0sO sequence_の使い所が分からん。。。 mapM_使った方が短くなるし。 うーむ。。。 渡すリストにIOな関数含められる=IOな関数を使う リスト内包表記も使えるのは良いけど、mapM_のが簡潔。 import Data.List import System main = mapM_ put $ zip hellos marks -- sequence_ [put (x,y) | (x,y) <- zip hellos marks] hellos = (cycle.tails) "Hello World!!" marks = cycle ["/","|","\\","--"] put (x,y) = do putStrLn (x ++ "\n" ++ y) mapM_ (\_ -> putStr "") [1..50000] system "clear" : デフォルトの名無しさん [] 2019/05/24(金) 11:19:15.22:YDCPM0sO hellos = (cycle.tails) "Hello World!!" marks = cycle ["/","|","\\","--"] put (x,y) = do putStrLn (x ++ "\n" ++ y) mapM_ (\_ -> putStr "") [1..50000] system "clear" : デフォルトの名無しさん [sage] 2019/05/24(金) 14:25:55.92:3xUJmLCM モナディックアクションを構造に入れて使うとき重宝するよ。 main = sequence_ . (map (putStr "log:" >>)) $ [print "hoo",putStr "bar"] 個々のアクションを好きに調整できる(例ではそれぞれに前処理を足した)。 : デフォルトの名無しさん [] 2019/05/24(金) 18:49:41.11:aewo4dFz ありがとう。 いつか役立てたいものです。 : デフォルトの名無しさん [] 2019/05/24(金) 18:55:43.73:aewo4dFz 別件なのですが、俺俺Eq型クラス(MyEq)を作って見ているのですが、 HugsだとNum a型のインスタンスを作れるのに、GHCだとエラーが出ます。 経験ある方、いらっしゃいますでしょうか? main = do print $ 1 === 1 print $ 1 /== 1 print $ 1 === 2 print $ 1 /== 2 class MyEq a where (===),(/==) :: a -> a -> Bool x === y = not (x /== y) x /== y = not (x === y) instance (Num a) => MyEq a where x === x' = isZero (x - x') x /== x' = not (x === x') isZero 0 = True isZero _ = False GHCだと全ての型をインスタンスにしろ的なエラーメッセージが出ます。。。 スマートな方法があれば。。。 : デフォルトの名無しさん [sage] 2019/05/24(金) 20:57:13.04:SgRJwbG9 mapじゃなくunfoldrで[IO a]を作ってもいい エラーは「インスタンスにする型はこれこれこういう形にしろ」って意味 instance (Num a) => MyEq a みたいな形を許すと instance (MyEq a) => Num a とかもできて意味わからなくなるから {-# LANGUAGE FlexibleInstances, UndecidableInstances #-} というおまじないを使って制約を取っ払う : デフォルトの名無しさん [sage] 2019/05/25(土) 02:52:58.92:qv11a0DJ オブジェクトファースト動的解決脳だとHaskellはただめんどくさいだけの言語にしか見えない 利点とされていることが欠点にしか見えないもある : デフォルトの名無しさん [sage] 2019/05/25(土) 04:10:17.12:/RQqfD4m 具体的にはどのあたりが? : デフォルトの名無しさん [sage] 2019/05/25(土) 06:07:15.41:/RQqfD4m "--port=" <> ( 8000 <> 80 ) これが "--port=8080" になって欲しい、みたいな? : デフォルトの名無しさん [sage] 2019/05/25(土) 12:55:48.15:1pSM7n1N それは暗黙の型キャストとかの話な気もするが String と Num a との積を勝手に解決するなよって思う : デフォルトの名無しさん [sage] 2019/05/25(土) 14:00:56.82:/RQqfD4m ttp://https://github.com/chrisdone/dynamic ではどちらのリテラルも直ちにDynamic型に落ちます。 : デフォルトの名無しさん [sage] 2019/05/25(土) 14:25:22.48:/RQqfD4m ...でも演算子を上述のように定義すると半群の結合則を満たさない。 dynamicパッケージでもそうされてなくて、結果は"--port=800080"になります。 動的プログラミングを求める人は柔軟に使える演算が欲しくて、 Haskellのデフォルトの定義は型変換がただ面倒くさい。 369が言いたかったのは例えばそういう事かなと解釈しました。 : デフォルトの名無しさん [] 2019/05/25(土) 17:32:54.76:nXhWU27U おまじない!! ありがとうございます。 これで行けそうですm(_ _)m : デフォルトの名無しさん [sage] 2019/05/25(土) 20:46:23.64:orcduCKk 何やってるのかよく分からんけど、おまじないで解決 haskellの初心者時代って、こういうの他言語に比べて多いよね どうにか分かりやすく説明できないものか、いつも悩む : デフォルトの名無しさん [sage] 2019/05/25(土) 21:58:16.52:1pSM7n1N まあ確かに数値計算するときにfromIntegralだのrealToFracだのをゴテゴテ書くのは (それを要求される理屈はわかっていても)面倒くさい そこを「柔軟」にしていくと人が書き間違えたときに教えてくれなくなるから 結局は書きやすさと安全性とのトレードオフだよなあ : デフォルトの名無しさん [sage] 2019/05/31(金) 20:49:17.15:SYuh0ZxQ 結局、マクロ、関数、型チェック以外にプログラムにできることなんてない。 バカがバカな夢を見る。 : デフォルトの名無しさん [sage] 2019/05/31(金) 20:53:47.48:4BnNLuhc それを証明してから言えよバカ : デフォルトの名無しさん [sage] 2019/06/02(日) 11:37:55.39:mVf2k3qD Cは関数の定義はゴテゴテ書くが演算子の定義は何も書かなかった C++が演算子を定義するようになったからHaskellも影響を受けたんじゃないか 数学的証明だけでなく、歴史を巻き添えにして議論しないと現実は見えない : デフォルトの名無しさん [sage] 2019/06/07(金) 00:15:16.82:pdU7zkZH すみません、 凄いH書籍で学習していて疑問に思ったのですが 型クラス中級で、真理値の様な物を持ちうる型、 JavaScriptのfalsyな値を持つ型を作る実習で Intや[ ]を独自のYesNo型のインスタンスにする 例があったのですが 標準で存在する型に後から 独自の型のインスタンスにする事に違和感を感じ バグの温床になるのではという懸念の印象がありました。 オブジェクト嗜好のサブクラスみたいに 「Int」型から「IntYesNo」型を 生成できるのなら違和感ないのですが。 これについての合理性と安全性を明示している 書籍やサイトを知っていたら教えて下さい。 : デフォルトの名無しさん [sage] 2019/06/07(金) 00:45:34.97:UZbkEtL+ 温床とまで言うか・・・ そのせいで例えばどんなバグがありそうか、 ひとつでも例を示すことはできる? ごく簡単な例でいいんだが。 : デフォルトの名無しさん [sage] 2019/06/07(金) 01:35:51.00:UZbkEtL+ あと、なんど読み返してもタイポっぽく見えないんでツッコミ入れる。 「AをBのインスタンスにする」と言うとき、 Aは型、Bは『型クラス』だからな。 失礼なことを言うが、もしかして違和感の根源は、 型と型クラスがそれぞれ何なのか理解できていないところにあるのでは? : デフォルトの名無しさん [sage] 2019/06/07(金) 06:58:43.76:m7qCH6wP 『凄いH書籍』 (;・`д・́)...ゴクリ...(`・д́・;) : デフォルトの名無しさん [] 2019/06/07(金) 19:56:02.21:SUVJWRIg 同モジュール(Haskellでいう)内なら拡張に対しては責任を持つべきなので 拡張がモジュールをまたがないなら大した問題はない 他の言語でもモジュール内操作に対してはあんまりフールプルーフじゃないしね がHaskellの場合は拡張が子モジュールに伝播してしまう : デフォルトの名無しさん [sage] 2019/06/07(金) 22:06:13.49:wtNNzOUb Ruby の偽は、false, nil の2つだけ! JavaScript, Python, PHP などは、偽が10個ぐらいある! 空文字列・空配列・空辞書とか、0, 0.0 とか、 これらの言語は、しょーもないバグが多い! だから、Rubyよりも生産性が低い! : デフォルトの名無しさん [sage] 2019/06/07(金) 23:58:36.77:KFSm+TLI 『入門HASKELLプログラミング』2019年07月31日発売予定 ttp://https://www.shoeisha.co.jp/book/detail/9784798158662 「コンピュータのプログラミング」から脱却し、“学術”ではない、実用度重視のHaskell 入門書 Haskellは、関数型プログラミングを研究する対象としての側面が強すぎ、一般的なアプリ ケーション構築を目的とした開発言語の側面が、ともすればおざなりになりがちでした。 そのため、他の言語(JavaとかC/C++とかC#など)がこなす、ありふれたアプリケーション をHaskellで構築しようとすると、キーボードを叩く指が止まってしまうことがありました。 本書は関数型プログラミングの基本を押さえつつ、いわゆる「開発言語」として実用的な プログラムを書けるようなレベルに誘う一冊です。(後略) : デフォルトの名無しさん [] 2019/06/08(土) 01:49:15.40:WG0iLGtf rupy死んだのになんで生きてるの?ww とっとと後を追いなよwwww : デフォルトの名無しさん [sage] 2019/06/08(土) 03:07:04.34:PPvh7BCd Pythonのfalsyな値には、そんなに違和感はないけどなぁ……。 : デフォルトの名無しさん [] 2019/06/08(土) 03:44:53.76:epil0e3i l : デフォルトの名無しさん [] 2019/06/08(土) 03:45:50.56:C8CdREmC 【実体験】ブログを1,000記事ほど書いたら、月300万くらい稼げた話 ttp://https://www.youtube.com/watch?v=GmVulh282ps&t=604s 【報告】ブログで「月収1,000万」を達成できました【方法を解説する】 ttp://https://www.youtube.com/watch?v=pgjcuLp8wt0 年間ほど努力したら「年収3,000万」になったので、経験談を語る ttp://https://www.youtube.com/watch?v=oV_SY-a1lMs 期間工ブログの収入は1500万円でした。【フリーランスの現実&底辺からの復活編】 ttp://https://www.youtube.com/watch?v=aijLjFLOuC4 年商1300万のプロブロガーの初心者時代から今までの軌跡 ttp://https://www.youtube.com/watch?v=UMiF4T2EO9o 【収益報告】実働月10hでも大金稼ぐ方法を解説【年収6,000万】 ttp://https://www.youtube.com/watch?v=o2ISWP-VZsw&t=288s 無料ブログは稼げない。稼ぐならオススメはWordPress一択の理由 ttp://https://www.youtube.com/watch?v=o8oUe3JS-lg : デフォルトの名無しさん [sage] 2019/06/08(土) 06:33:44.76:YhBKasle get programming with haskellは、stackがでてくるの終盤だったり、 あまり実用度重視じゃないんだけどなー : デフォルトの名無しさん [] 2019/06/08(土) 10:04:10.25:ryWt2Gls Ture + True みたいなのはエラーにしてくれたら良いのにとは思う : デフォルトの名無しさん [sage] 2019/06/08(土) 13:03:38.36:JxaHk6L1 そんなコードが生じるシチュエーションがわからん。 : 381 [sage] 2019/06/08(土) 17:21:52.39:mlZK/xCe ありがとうございます。 既存の型を独自の型クラスの インスタンスにする事は 同モジュール内の拡張として プログラムする人が責任を持つべきなので 問題はないとの事で了解しました。 急いで質問を書いたので 型クラスを型と間違って書いてしまいすみませんでした。 : デフォルトの名無しさん [] 2019/06/18(火) 06:17:55.21:3nOE2mBA プログラム板にキチガイ降臨中!botに一晩も反応する異常さ 一般人(学校恩師)に殺害予告をしているのでスレ建て通報してください。 ttps://mevius.5ch.net/test/read.cgi/tech/1559872586/ "> ttps://mevius.5ch.net/test/read.cgi/tech/1559872586/ 142 名前:a4 ◆700L1Efzuv 投稿日:2019/06/18(火) 05:29:55 ID://qVkzO : デフォルトの名無しさん [sage] 2019/06/20(木) 01:44:21.27:R55GIdRS functoriality とはどのような性質のことでしょうか? : デフォルトの名無しさん [sage] 2019/06/20(木) 04:43:35.94:R55GIdRS 補足しますと、functorial は分かります。 ですが、functoriality がいったい何に対してどのような意味で使う言葉なのか分かりません。 Hask圏を例にしてくれると助かります。 : デフォルトの名無しさん [] 2019/06/27(木) 19:51:11.76:xcUkqEUS Functorであること Haskellで言えば、Type -> Type なカインドを持つ型コンストラクタがFunctorのインスタンスであって、Functor則を満たすこと : デフォルトの名無しさん [sage] 2019/07/01(月) 09:45:16.04:PP1UmLnE ラズパイでStackの環境構築をしていざコンパイルをしてみたら ・llvmは6.0のみサポートだよ ・一応コンパイルしてみるよ というメッセージが出た後, ・サポートされていない機械語を使ってるよ ということでコンパイルが通らなかった。 llvmを6.0のソースからmakeすればいいのかな? Stackやllvmはすべてapt-getで最新版にしてあります。 : デフォルトの名無しさん [] 2019/07/01(月) 21:38:59.85:/x+NnqQg officialのrepositoryと最新版(binary)は違うよ : デフォルトの名無しさん [] 2019/07/02(火) 12:46:31.20:+JGifkmy hackageのcabal-installのbootstrap.shをクリックしても Page not found: Sorry, it's just not here. とでてダウンロードできないのだが? : デフォルトの名無しさん [] 2019/07/02(火) 16:08:25.14:+JGifkmy まあいいやtar.gzに入ってるからな : デフォルトの名無しさん [sage] 2019/07/02(火) 20:25:51.99:2+AqqNZH レスありがとうございます。 公式の最新版とaptリポジトリでの最新版は違うということは認識してます。 やっぱり llvm 6 のソースを公式サイトからおとして make install ですかね? : デフォルトの名無しさん [] 2019/07/11(木) 15:19:40.91:EO8VLz8P hackageのホームページのダウンロード数が出るところにはcabalとかからダウンロードしたものは 数にふくまれてる? : 400,402 [sage] 2019/07/20(土) 23:02:04.74:flSCEm3M 一応ラズパイ上(raspberian 9.4) でもコンパイルできました。 ただしstack を使わずghcで直接コンパイルですが。 オプションが渡されていないバグがあったような情報を 見かけましたがこのあたりが原因? ttp://https://gitlab.haskell.org/ghc/ghc/issues/11058 : デフォルトの名無しさん [sage] 2019/07/24(水) 23:54:43.53:/HKiGEdd 3件もこのスレで本の省略系がアレでワロタ 協調させて省略するとこうなる 凄いH楽しく学ぼう : デフォルトの名無しさん [] 2019/08/11(日) 16:09:11.67:L0OuEHk+ λの数だけ強くなれるよ〜♫ : デフォルトの名無しさん [sage] 2019/08/12(月) 07:07:43.10:8tVc9hN7 最近発売された書籍はどうでしたか : デフォルトの名無しさん [sage] 2019/08/12(月) 18:35:53.32:EuURpOPT はい : デフォルトの名無しさん [sage] 2019/08/14(水) 23:43:24.45:ITFywCVm この??の部分てどう書いたらいいですか? f :: a -> IO (Maybe b) g :: b -> IO (Maybe c) h :: a -> IO (Maybe c) h x = do (y :: Maybe b) <- f a (z :: Maybe c) <- ?? return z : デフォルトの名無しさん [sage] 2019/08/15(木) 00:56:45.05:2FISIxPr もっといいやり方ありそうですが、自己解決しました。 IO (Maybe)から、いったん MaybeT IO に迂回してからMaybe(Maybe c)を潰すんですね、、 import Control.Monad.Trans.Maybe f :: a -> IO (Maybe b) f = undefined g :: b -> IO (Maybe c) g = undefined h :: a -> IO (Maybe c) h x = do y <- runMaybeT $ (MaybeT $ f x) >>= (\x -> MaybeT $ g x) let contractMaybe :: Maybe (Maybe a) -> Maybe a contractMaybe aa = case aa of Just (Just x) -> Just x _ -> Nothing return $ contractMaybe y : デフォルトの名無しさん [sage] 2019/08/15(木) 02:33:07.91:9FXQJNeU Maybeを潰すのは型的に合っていないと思う data A data B data C f :: A -> IO (Maybe B) f = undefined g :: B -> IO (Maybe C) g = undefined h :: A -> IO (Maybe C) h x = runMaybeT $ MaybeT (f x) >>= (\y -> MaybeT (g y)) h' :: A -> IO (Maybe C) h' = runMaybeT . (MaybeT . f >=> MaybeT . g) : デフォルトの名無しさん [sage] 2019/08/15(木) 09:54:21.85:2FISIxPr ありがとうございます。 data宣言してるA B Cだと確かに型チェック通らないですね。 他にもa b cを具体的にStringにしたらダメでした。 a b cバージョンだと通ってるんですが、何か違いがあるのでしょうか? また、実際とりかかっていたのは、 fが下のwebViewGetDomDocumentで、 gが下のgetBodyでした。 こちらもMaybeつぶしで型チェックは通っています(挙動はまだ確認していませんが)。 webViewGetDomDocument :: WebView -> IO (Maybe Document) getBody :: (DocumentClass self, Control.Monad.IO.Class.MonadIO m) => self -> m (Maybe Graphics.UI.Gtk.WebKit.Types.HTMLElement) : デフォルトの名無しさん [sage] 2019/08/15(木) 17:40:56.74:3wJ+zeP0 h x = do { y <- f x; z <- case y of { Nothing -> return Nothing; Just y' -> g y' }; return z } なにがMaybe潰しだ ただの分岐にデザインパターンみたいな名前つけやがって : デフォルトの名無しさん [sage] 2019/08/16(金) 13:02:37.84:wUgksw8i わざわざzを経由する必要ある? : デフォルトの名無しさん [sage] 2019/08/16(金) 18:54:52.75:pXb2X6++ モナド則その2 m >>= return = m を満たさない半モナド?を想定してる可能性 : デフォルトの名無しさん [sage] 2019/08/17(土) 01:26:41.61:ES53moma 圏論の知識って役に立つの? : ◆QZaw55cn4c [sage] 2019/08/17(土) 01:42:35.34:ToRIVhzM 私は逆をお聞きしたいです haskell の知識って圏論を理解する助けになりますか? : デフォルトの名無しさん [sage] 2019/08/17(土) 03:49:03.33:CK+x7f61 全くならないよ : デフォルトの名無しさん [sage] 2019/08/17(土) 10:59:33.48:2mj8+539 Haskellと圏論を比較することでHaskellの過激な部分が見える 型を省略する タプルでできることをカリー化でやる 「任意のfに対しgが存在する」ですむことを高階関数でやる : デフォルトの名無しさん [sage] 2019/08/17(土) 18:25:28.56:ljAxaRgk 簡単なことを難しく書くのがHaskell : デフォルトの名無しさん [sage] 2019/08/17(土) 18:36:58.79:He41kTu9 ? : デフォルトの名無しさん [sage] 2019/08/18(日) 03:03:18.77:AO5DQImr タグつき共用体は簡単だ C言語にもあった共用体をやめてコールバック地獄になったのはHaskellのせいではない : デフォルトの名無しさん [sage] 2019/08/18(日) 20:44:58.36:zn243Obk 別スレでこんなの見つけた。 ttp://https://insights.dice.com/2019/07/29/5-programming-languages-probably-doomed/ 人気なさすぎという事なのかな? Haskell好きなんだけどなぁ。 : デフォルトの名無しさん [sage] 2019/08/18(日) 21:34:03.15:Ne5INCCb 開発関係者の間で口コミが増えないから使われていないんじゃないか 消えるかもってことらしいがそもそも学術研究目的だからそれでも 構わないってことじゃないかと思うが… : デフォルトの名無しさん [sage] 2019/08/18(日) 22:46:17.93:PVG4KZY2 何があれば Haskell に人気が出るだろうか : デフォルトの名無しさん [sage] 2019/08/18(日) 23:04:15.06:Onid3Fuw C にせまる速度がでたら? : デフォルトの名無しさん [sage] 2019/08/18(日) 23:54:21.76:gc7JPYBd キラーアプリ(フレームワーク的な)でしょ pandocでは不足 : デフォルトの名無しさん [sage] 2019/08/19(月) 03:52:58.25:zjob4//4 Pandoc 初版2006年8月10日 現在スター数 16,396 shellcheck 初版2013年7月24日 現在スター数 16,023 こういう感じのがもっとほしい : デフォルトの名無しさん [sage] 2019/08/19(月) 07:23:04.62:2IiE7zyK そもそも数学の人気のなさをキラーアプリ説で説明できない 宗教では惑星の動きを説明できないみたいに : デフォルトの名無しさん [sage] 2019/08/19(月) 07:34:27.76:WV8MsfnG オライリーの本にはパーサーは最強と書いてあるが何に使う? まだパーサー必要じゃないので恩恵味わっていない : デフォルトの名無しさん [sage] 2019/08/19(月) 07:41:22.99:TcQTkvSK pandocに... : デフォルトの名無しさん [sage] 2019/08/19(月) 11:51:15.13:XOuYcf/m パーサはオンラインサービスのやりとりの解析に便利そう。 あるいは溜め込んだビッグデータの解析前処理とか。 : デフォルトの名無しさん [sage] 2019/08/19(月) 15:54:57.04:Kn9dUhI/ 束縛という考えをやめたら人気は確実に出るかと あれのせいで使いにくいわけだし : デフォルトの名無しさん [sage] 2019/08/19(月) 16:56:00.26:zjob4//4 設定言語の Dhall にもパーサの強さが効いてきてるだろうね。Slackあたりで新しいキラーアプリみたいに言われていたやつ。 ただの設定より強いけどフルセットのプログラミング言語ほどでないために無限ループなどを作れず安全で便利らしい。 現在スター数二千弱 : デフォルトの名無しさん [sage] 2019/08/19(月) 17:27:44.29:2IiE7zyK 束縛あり (m >>= \ x -> return x) = m 束縛なし (>>= return) = id : デフォルトの名無しさん [sage] 2019/08/21(水) 02:19:03.88:DF21aIsc 関数抽象とかλ抽象とか内容にたいして意味がない説明が長々と続いてると思ったら 単なる無名関数のことだった 最初からそう書けばいいのにわざと理解が遠くなる書き方するのは何だろうね : デフォルトの名無しさん [sage] 2019/08/21(水) 03:03:56.38:zk1xpAiv それはラムダ抽象などに興味がある読者を対象にしているからかもしれない。 単に説明が下手なだけかもしれないが。 ちなみに私は前者に当たるので、そういう単語が出てくるとワクワクし、理解がはかどる。 : デフォルトの名無しさん [sage] 2019/08/21(水) 08:26:50.91:vWB9dk8w 循環論法避けるため 数学だからね : デフォルトの名無しさん [sage] 2019/08/21(水) 08:59:06.15:MCeqK6x4 会話成り立ってるのか? : デフォルトの名無しさん [sage] 2019/08/21(水) 09:50:43.38:NrNhEvfu 具体例を書けないやつは説明が下手なだけだし 具体例が長々と書かれていたら読み飛ばすようなやつは誤読するだけ 少なくとも動的スコープと静的スコープを間違えた例を書くべきだ これに関しては数学よりも歴史が役に立つ : デフォルトの名無しさん [] 2019/08/21(水) 14:58:21.32:ur92HW83 今日の流行りはこれ ttp://https://withnews.jp/article/f0190820002qq000000000000000W00o10101qq000019512A : デフォルトの名無しさん [sage] 2019/08/21(水) 20:13:20.77:a8Z/37wn > 具体例を書けないやつは説明が下手なだけだし 具体例を書けない人間は説明下手以前にそもそも十分に正しく理解していないからこそ具体例を書けないんだよ 中途半端な理解しかしていない人間が上手に説明できるはずがないだろうが > 具体例が長々と書かれていたら読み飛ばすようなやつは誤読するだけ 具体例として長々としか書けないのも困り者だけれどね 説明する側が本当に良く理解できているならば、よほど高度にテクニカルで微妙な概念や定義でない限り 具体例としては簡潔で短い例や反例を挙げられるはずだ > 少なくとも動的スコープと静的スコープを間違えた例を書くべきだ > これに関しては数学よりも歴史が役に立つ Lispの歴史が正にそれを物語っている 当時MITのAI Lab.のJohn McCarthyらによってLispがλ計算に基づいて初めて産み出された時、λ計算の変数のスコープを間違って (というよりはLispが実装された1960年代前半のコンピュータのメモリ量と処理能力の極めて厳しい制限から) 動的スコープを採用して久しくその間違いを改めなかったのから、Guy Steele, Jr.らによるScheme言語の提案と同処理系の開発および Lisp諸方言の統一化としてCommon Lispの言語仕様を策定する際に、変数のスコープとしてはSchemeの静的スコープを標準として採用することで 漸くLispプログラミング界で動的スコープでなく静的スコープが当たり前になったという歴史がね ついでに言っておくと、かつてのLisp界隈での混乱として、言語仕様上の問題としての動的スコープ-vs-静的スコープの問題と 類似の(だが異なる)問題であるshallow_binding-vs-deep_bindingの問題(こちらは言語仕様でなく実装上の問題)とが混同されていて 混乱を招いていた(かなりしっかりしたLispの教科書でも後者を前者と混同して説明していたり、そもそもこれらの問題があることを理解せずに 書かれていたりした shallow-vs-deepの問題が言語仕様でなく実装上の問題だと正しく且つ明快に言い切った(私の知る限り)最初のLispのテキストは Lisp実装者だけでなく(当時の)Lispの上級プログラマにとってもバイブルとでも呼ぶべきJohn Allenの“Anatomy of Lisp” と、まあ長々とした例を批判しながら、長々と書いてしまって申し訳ない : デフォルトの名無しさん [] 2019/08/22(木) 09:46:16.96:xQsiKIbM 説得力皆無の文章になったな : デフォルトの名無しさん [sage] 2019/08/22(木) 18:48:22.95:s6ROoMqI 力が無いなら金で買えばいい 問題は、相手を説得したい者に課金するか自分を説得してほしい者に課金するか : デフォルトの名無しさん [sage] 2019/08/26(月) 15:26:16.91:7r1lWQhX モナドから得た値ででかいレコード初期化したいときってなんかいい書き方ない? do記法で左矢印で一々変数に束縛してからフィールドに代入とかするのめんどい レコードワイルドカード使うのもアプリカティブスタイルで書くのもなんかいまいちだし : デフォルトの名無しさん [sage] 2019/08/26(月) 16:58:37.95:1YvWSZsw 理想はどういう書き方をしたい? : デフォルトの名無しさん [sage] 2019/08/26(月) 17:56:50.34:H+o0BUvr Hoge { fuga =<< piyo } こんな感じがいいなあ レコードワイルドカードだと何してんのかぱっと見よくわからなくなるし アプリカティブスタイルで書くとフィールドの順番変わったりしたときそれに合わせなきゃいけないのがちょっとだけ嫌 : デフォルトの名無しさん [sage] 2019/08/26(月) 17:57:34.01:H+o0BUvr まちがえた=<<じゃなくて<- : デフォルトの名無しさん [sage] 2019/08/26(月) 18:35:14.67:FuRqq0AU そもそも b <- m if b then ~ と書かなきゃいけない言語に贅沢言っちゃいかん : デフォルトの名無しさん [sage] 2019/08/26(月) 20:58:49.90:JCuV3Nd8 ifはアプリカティブを使ってはいけない例か 意図的に書いてるなら頭いいな : デフォルトの名無しさん [sage] 2019/08/27(火) 11:02:46.95:LbNJg1Kq C++のnewも一個ずつだ 多変数関数の存在自体がバグみたいなもの : デフォルトの名無しさん [sage] 2019/08/27(火) 13:49:23.94:aYd+hskG たしかにむずかしいね。 : デフォルトの名無しさん [sage] 2019/08/27(火) 14:01:37.09:aYd+hskG レコードでなくMap型ならモノイドで足して上書きしていけるのに。 : デフォルトの名無しさん [sage] 2019/08/29(木) 12:53:50.13:eXCPAcGY Haskellは数学者のおもちゃの域を超えてないな 実用を考えたらライブラリの豊富なPythonに勝るものはない : デフォルトの名無しさん [sage] 2019/08/29(木) 13:19:40.08:VY7wxkJm python にまけるなんていわれるとは : デフォルトの名無しさん [sage] 2019/08/29(木) 17:00:49.94:ssy8xOLs > Haskellは数学者のおもちゃの域を超えてないな 本当の数学者はHaskellなんて相手にしないよ Haskellという玩具で喜んで遊ぶのは数学者じゃなくて数学者にあこがれてるだけの単なるプログラマ : デフォルトの名無しさん [sage] 2019/08/29(木) 19:08:34.02:qkTKPz6x じゃあ本当の数学者が相手にしてるプログラミング言語はなんなの? : デフォルトの名無しさん [] 2019/08/29(木) 19:11:37.53:CAV+1+Xc 本物の数学者はパソコン苦手な人も結構いる : デフォルトの名無しさん [sage] 2019/08/29(木) 19:43:16.59:mkieRkek そこは計算機科学者と読み替えてさしあげろ : デフォルトの名無しさん [sage] 2019/08/29(木) 21:23:41.46:LSvsCn45 数学基礎論とか論理でしょ 記号遊びに興じてる人々 : デフォルトの名無しさん [sage] 2019/08/30(金) 00:01:54.88:+2ynYkfN うちの大学の数学科の計算機系(論理とか統計とか確率とか)の教授はhaskellやってるらしい あと数学科でやるプログラミングの授業はhaskellらしい : デフォルトの名無しさん [sage] 2019/08/30(金) 00:34:37.35:CazA1DNP おもちゃとは記号だったのか 記号などなくても実物だけがあればいいという いわば実物指向 : デフォルトの名無しさん [] 2019/08/31(土) 23:29:39.55:DBlAufLH GHC8.8.1リリースされたね。ナガカッタ stackで使えるようになるのはいつ頃か : デフォルトの名無しさん [] 2019/09/01(日) 00:15:49.52:3Spoi/4/ 副作用の有る関数を、副作用の無い関数と同一視する仕組み(IOモナド)の論理的背景とかは理解出来るけど、理解出来なくても使えるしなぁ。。。 プログラマーが圏論理解するには手助けになるけど、それ以外の人には返って邪魔かも。 : デフォルトの名無しさん [sage] 2019/09/11(水) 19:32:14.82 ああ!型システム入門─プログラミング言語と型の理論─が埃被ってる! 何年眠っていたんだ! : デフォルトの名無しさん [sage] 2019/09/15(日) 12:27:59.45:vZVyiJhM 日系メーカで残業続きの日々です。C++を使っています。 Haskell覚えたらスマートな職場に転職するチャンスありますか? : デフォルトの名無しさん [sage] 2019/09/15(日) 13:02:40.03 Javaでないだけマシでしょう 欲張っては全てを失います 胸を張ってC++コードを書き続けましょう : デフォルトの名無しさん [sage] 2019/09/15(日) 13:26:30.70:vZVyiJhM でも所詮日系メーカでプログラミングの向上心持ってるやつなんて上司含めてほとんどおらん そういう中で品質いいコード書く努力が虚しいんや : デフォルトの名無しさん [] 2019/09/15(日) 14:38:10.94:CYqvBFjr 転職を強く推奨します : デフォルトの名無しさん [sage] 2019/09/15(日) 14:45:40.26:x41usVyI まあたとえ誰も評価してくれなくとも 品質のいいコード書いておけばあとでデバッグやリファクタするときに自分が楽よ Haskell覚えても転職に良いかはわかりませんが C++の品質は多分上がる : デフォルトの名無しさん [sage] 2019/09/15(日) 19:41:31.15 Haskellは一体いつになったら速くなるんだ 現状Javaにすら勝ててないじゃないか 関数型お得意の『最適化の余地』を永遠に残したままフィニッシュか!? : デフォルトの名無しさん [sage] 2019/09/15(日) 20:15:28.04:q43bIxju こんな非効率な言語がPythonよりは速いって思われてる時点で最適化の賜物だろ : デフォルトの名無しさん [sage] 2019/09/16(月) 08:42:30.15:N3Stq9G0 関数型言語の最適化の話はOcamlにまかせてある : デフォルトの名無しさん [sage] 2019/09/16(月) 20:50:11.40:QCellAQp そういうことならclaspでいいわ : デフォルトの名無しさん [sage] 2019/09/16(月) 21:37:02.25:7YJTuf9D call-by-valueのOCamlとcall-by-needのHaskellとでは実装法は大きく異なるから最適化技術も両者で大きく異なる 関数的プログラミング言語でもML系諸言語(OCamlやStandard MLなど)やSchemeなどのcall-by-valueセマンティックスに基づく言語の実装は 手続き的(あるいは命令的)プログラミング言語の実装にかなり近いし、例えば命令的言語では最も重要な操作である変数への破壊的代入や 例外処理を言語仕様に追加し組み込むことも特に困難ではない(実際、ML系諸言語やSchemeなどLisp系諸言語は変数への破壊的代入の プリミティブを有しているし、Standard MLなどは例外処理も言語仕様に最初から組み込まれている) だが変数への破壊的代入や例外処理といった言語機能をHaskellのようなcall-by-needセマンティックスの関数的プログラミング言語に 追加しようとすると途端にセマンティックスを整合的にすることが困難になる : デフォルトの名無しさん [sage] 2019/09/18(水) 22:01:35.11:lvPVUcx3 既出ですかね プログラミングHaskell第2版、いかがですか? : デフォルトの名無しさん [sage] 2019/09/18(水) 22:33:30.71:EDnCRaxi 買ったばかりでまだほとんど読めてないけど、教科書としてよさげ。 GHC前提になったし、古い記法は一掃されたし、分量も増えてる。 第I部はかなり平易な基礎と型クラスあたりまで。 第II部に対話系からモノイドまで持ってきて充実させてる。 ただ如何せん、出版社が弱すぎて、普通の書店になかなか並ばない。 ネット直販ならいいんだけどね。 : デフォルトの名無しさん [sage] 2019/09/18(水) 22:46:56.61:sk3yb4Af 東京だと ジュンク堂や紀伊国屋でさくっと手に入ったけど まあ普通じゃないな : デフォルトの名無しさん [sage] 2019/09/18(水) 23:07:44.70:lvPVUcx3 ありがとうございます 第1版は持っているのですが、なかなか良いものなので、増補されたのなら是非と思いまして 当該のサイトにも、池袋のジュンク堂にはあるとあったので、寄り道して購入しようかと… : デフォルトの名無しさん [sage] 2019/09/19(木) 11:55:27.58 第一版持ってて尚第二版買うとかハスケルガチ勢かよ : デフォルトの名無しさん [sage] 2019/09/19(木) 21:57:13.69:Vqj74yRo ページ数は1.5倍位になってるみたいだし、かなり増補されてたからさ : デフォルトの名無しさん [sage] 2019/09/20(金) 00:33:53.77 入門はすっとばしてLensとかConduitとか流行ったライブラリの実践例集みたいな本が欲しい クックブックっていうのかね なぜ出版社は入門書ばかり刷りたがるのか : デフォルトの名無しさん [sage] 2019/09/20(金) 00:45:38.23 入門はいいから初心者を鍛えてくれよ 将棋ウォーズでいうと3〜1級を初段〜三段に上げてくれる本がないよなぁ : デフォルトの名無しさん [sage] 2019/09/20(金) 06:27:12.22:fTWLEX/y 並列並行haskellは面白かったな 英語苦手なのに無料公開されてた英語版全部読んじゃった : デフォルトの名無しさん [sage] 2019/09/26(木) 05:11:57.59:dzbET3Zy 結局のところ、rigid type variable ってどんな type variable のことなの? : デフォルトの名無しさん [sage] 2019/09/26(木) 14:20:58.03:iXd9J4xZ skolem type variable のことだよ^^ : デフォルトの名無しさん [sage] 2019/09/26(木) 15:49:58.48:fwWuWasU 取り敢えず使ってみよう勉強してみようという人間は多いので入門書にはそれなりの部数の需要があるが 実際に入門レベルをクリアしてその先に進む人数は一気に減少するから、その先の技術レベルの内容を扱う書籍は よほどメジャーな言語でない限り商業ベースには乗らない それも世界中がマーケットになる英語ならまだしも日本国内しかマーケットのない日本語の書籍となれば尚更ね : デフォルトの名無しさん [sage] 2019/09/26(木) 18:11:59.76:6j3rqQh6 入門書はどうでもいいことばかり書いてるから買わないことが多い : デフォルトの名無しさん [sage] 2019/09/26(木) 19:57:03.06:dzbET3Zy じゃあ、rigid = skolem なのか? ghc のコンパイルエラーメッセージに rigid で skolem な型変数がどうとか言う文言があるから、 両者は別物のような気がするのだが。 で、skolem とは何なのだ? : デフォルトの名無しさん [sage] 2019/09/26(木) 20:24:22.90:iXd9J4xZ rigid=skolemだよ 昔skolemとだけ表示されてたんだが、それじゃ分かりにくいというissueが立ってrigidが併記されるようになったらしい 俺もあれがなんなのか知りたい 俺としてはexists a. aみたいな型のことじゃないかと思ってるんだけどよくわからん わかったら教えて : デフォルトの名無しさん [sage] 2019/09/27(金) 03:35:50.99:cVD6n+mn なるほど、そういう歴史があったのか。 こういうのこそ、入門書に書いておいて欲しいな。 : デフォルトの名無しさん [sage] 2019/09/27(金) 22:06:15.87 資本主義のバグじゃん パッチ配布はよ : デフォルトの名無しさん [sage] 2019/10/05(土) 11:54:01.11:7g/R2uPo 型aがMonadならApplicativeでもあるわけですが、 実用的にreturnとpureが異なるというのは有り得るのでしょうか? : デフォルトの名無しさん [sage] 2019/10/05(土) 14:04:06.04:bu+J3s1i Monad版とApplicative版とで効率化のため内部実装が異なるということは もしかしたらあるかもしれない(実例は知らないけど) Monadが自然に誘導するApplicativeなら振る舞いが異なるということはないはず (標準的なリストモナドに対するZipListみたいな話を気にしている) : デフォルトの名無しさん [sage] 2019/10/07(月) 22:45:01.48:E8UVlk39 > Monadが自然に誘導するApplicativeなら振る舞いが異なるということはないはず ありがとうございます。 安心しました。 : デフォルトの名無しさん [] 2019/10/08(火) 09:34:32.63:pe44plco モナドでアクションを繋げるってのは何がうれしいの? 参照透過のために仕方なくやってるだけ? : デフォルトの名無しさん [sage] 2019/10/08(火) 10:35:16.66:pF665SWr みんなが使う言語の約束事が変更されるまで何年も待つか 一個人が関数を2つ定義するだけで解決するかの違い : デフォルトの名無しさん [sage] 2019/10/08(火) 16:25:57.34:ELFSZFvj 同じことの繰り返しを書かなくて済むのが大きいかな。 例えばEitherとIOの組み合わせのモナドでハードとの通信を 書いた時,割り込みプロセスを考えなくてもLeftで返せば 後続コードを飛ばしてエラーを返せるし,コード量が減った だけ,ミスの発生率も低くなる。 これがモナドなしだとハードとの通信をするたびにエラー 確認コードをいれて例外処理やなんやかやをしないといけ なくなる。 : デフォルトの名無しさん [sage] 2019/10/08(火) 17:47:38.95:pF665SWr EitherにもIOにもなるような万能のinstanceにロックイン?してよければclass不要 その気になれば任意の言語で応用可能ということ : デフォルトの名無しさん [] 2019/10/08(火) 18:00:48.37:pe44plco 結果的にHaskellの生産性は高いの? ライブラリや学習情報の充実度を無視するとして : デフォルトの名無しさん [sage] 2019/10/08(火) 18:17:24.58:ELFSZFvj 少なくともタイプする文字数はめっちゃ減る : デフォルトの名無しさん [sage] 2019/10/08(火) 18:27:09.94:gcgHRAAu もう生産性高いとは誰も言わなくなったね : デフォルトの名無しさん [] 2019/10/08(火) 19:31:45.70:pe44plco 文字数が減るのは高階関数のおかげ? 参照透過性によるバグの低減やコーディングのしやすさはどの程度あるんだろうか? : デフォルトの名無しさん [sage] 2019/10/08(火) 19:37:25.99:4CpPhkv4 巨大になっても線型に複雑度が増加するから他より有利とは言われるが そこまで大きいの触ったことない : デフォルトの名無しさん [sage] 2019/10/08(火) 20:09:52.92:pF665SWr PythonでもHaskellでも、タプルを使うなとか誰も言わなくなれば文字数は減る : デフォルトの名無しさん [sage] 2019/10/08(火) 20:44:34.15:kGAGzuS0 文字数減ればいいってんならシェルスクリプトかperlが最適だな。 : デフォルトの名無しさん [sage] 2019/10/08(火) 21:24:42.66:ELFSZFvj >> 505 モナドや高階関数のおかげもあるけど文字数が減るのは つきつめると言語全体に貫かれた表現の簡潔さ志向の仕様によるかな 参照透過性のおかげで副作用を気にせず共通部分を 気軽に関数としてまとめられるとか ブロック前後の括弧がいらないとか 再利用や多様な型に適合するように引数や関数の名前を短めにするとか 局所変数がないとか 簡単に二引数の演算子を記号を使って定義できるので 関数名を何度も書かなくて済むとか いろいろ 書く部分が少なくなるとそれだけケアレスミスの入り込む余地は少なくなるね。 それとS/N比がよくなってロジックを追いやすい。 : デフォルトの名無しさん [sage] 2019/10/08(火) 21:32:14.39:nLwShu/0 何冊か本を読んだけど、Haskell の気持ちがなかなか分からん… : デフォルトの名無しさん [sage] 2019/10/08(火) 21:39:47.76:ELFSZFvj 何か書いてみた? 自分はRWHとかPCHとか読みながらオレオレプロジェクトを仕立てて 書き進めていったらある日を堺に急にこういうことかと理解が進んだ。 : デフォルトの名無しさん [sage] 2019/10/08(火) 22:21:53.53:nLwShu/0 やはりどんどん書かないとダメですよね… おかげさまで、本業とする言語でのコーディングには有意義なフィードバックができてはいるのですが そもそも GHC が吐き出すエラーメッセージがなぁ〜 : デフォルトの名無しさん [sage] 2019/10/08(火) 23:04:55.55:ELFSZFvj 自分もエラーが何を意味しているのか最初はわからなかった。 ただほとんどのエラーは型の不一致由来。 だから何行目のどこでエラーが出ているかだけわかればあとは 型を順番に調べていって解決できるようになった。 スペルを間違えたり似たような目的で使う別の型と勘違いしていたり とかそれなりの理由でエラーが出ているはず。後者は代数データ型を 適当にその場で作ったりしてた頃によくやってた。 : デフォルトの名無しさん [sage] 2019/10/08(火) 23:09:06.98:DA/zVK7z LispとHaskellの間には謎の暗黒時代があるから 結果がすべての人にはそれがわからんのです : デフォルトの名無しさん [sage] 2019/10/08(火) 23:13:57.88:ELFSZFvj その暗黒時代にSMLの本を店頭で見かけて気になった記憶がある。 結局買わなくていきなり普通のHaskellまでとんだ。 ソースから実行コードにどんなふうにおとしていってるのか最近 気になってきたのでそのうち古本でMLの本でも手に入れるか GHCのが吐くコードを追っかけてみたい。 : デフォルトの名無しさん [sage] 2019/10/08(火) 23:33:07.01:nLwShu/0 ありがとうございます です 皆さん同じような苦労をされているのかなと、少し楽な気持ちになりました もう少し粘り強く取り組んでみます! : デフォルトの名無しさん [sage] 2019/10/08(火) 23:42:31.20:ELFSZFvj どういたしまして! 基本文法は簡単だから文法エラーはすぐにほとんど出なくなります。 そこまでいったら初級編終了。 : デフォルトの名無しさん [sage] 2019/10/09(水) 00:44:23.02:UKqTo/lR 圏論の本を読もうと思ったら数学地獄にはまる : デフォルトの名無しさん [sage] 2019/10/09(水) 22:12:42.71:wrHKsVK1 VIMで関数名にカーソル合わせると自動で型シグネチャ動的推論して表示してくれる機能ありませんか? : デフォルトの名無しさん [sage] 2019/10/10(木) 00:08:02.64:TcPJYaG5 ダイクストラのアルゴリズム 優先度付きキューの手作りから始めて一週間かかってやっと完成した あたまわーるわるわーるーわる〜♪ sm32181836 脳裏に流れてる : デフォルトの名無しさん [] 2019/10/10(木) 09:37:00.35:yMym0WfO 善意的に解釈してアルゴリズムの方の動画だと思ったが 案の定あたまわるい方の動画だった : デフォルトの名無しさん [sage] 2019/10/10(木) 19:26:23.87:yuHTWGdR practical haskell second edition読み終わった : デフォルトの名無しさん [sage] 2019/10/11(金) 18:25:28.60:NJkU4MQ7 Haskell Wiki !haskellwiki Hayoo !hayoo Hoogle !h Hackage !hkg Hoogle at Stackage !stackage ttp://https://duckduckgo.com/bang?c=Tech&sc=Languages+(Haskell) : デフォルトの名無しさん [sage] 2019/10/11(金) 20:15:13.77:NJkU4MQ7 アマゾン.co.jp !ajp ttp://https://learning.oreilly.com/home/ !orly O'Reilly !oreilly : デフォルトの名無しさん [] 2019/10/12(土) 00:29:02.70:mt88ZJv+ mylist 3 = [[1,2,3],[4,5,6],[7,8,9]] みたいなリストを作る関数をHaskellで作ってみれば関数脳に目覚める。 割とマジで。 Haskell入門以前って電子書籍で書いたが、自力で目覚めるなら買わなくても良い。 (Haskell入門書読んでも宣言的とは?関数脳とは?がピンと来なかった経験から書いた) : デフォルトの名無しさん [sage] 2019/10/12(土) 00:42:17.63:67yl+yJ3 パッと思いついたのはこんな感じ? 添削してくれたら嬉しい HaskellでなくPureScriptだが mylist :: Int -> Array (Array Int) mylist n = do i <- 1..n pure [i*3 + 1, i*3 + 2, i*3 + 3] : デフォルトの名無しさん [sage] 2019/10/12(土) 01:48:37.28:gzpbrH7N コメントありがとうございます! です ひねりなしですが… mylist :: Int -> [[Int]] mylist n = chop n [1..n^2] chop :: Int -> [a] -> [[a]] chop _ [] = [] chop n xs = take n xs : chop n (drop n xs) chop は、直近に読んだ書籍からそのままアイデアを拝借しましたが、カンニングなしで書きました [1..] のように、無限リストで書けたらと思いましたが、酒気帯びなためダメでした IO の純粋って、のようなことがサッパリです… : デフォルトの名無しさん [] 2019/10/12(土) 02:00:10.51:iYZ0+U57 うーん・・・。 貴方はまだ手続き脳ですね。 (その手順でも関数脳を実感する人は実感するのでしょうが) 罰としてHaskell入門以前をご購入下さい。 IOの純粋は、「プログラマーのための圏論」と言うPDFがネットにあるのでググって読んでみると良いです。 : デフォルトの名無しさん [sage] 2019/10/12(土) 02:20:05.14:CTFV4tiX (n: number) => Array.from(Array(n).keys()).map( i => Array.from(Array(n).keys()).map( j => n * i + j + 1 ) ) : デフォルトの名無しさん [sage] 2019/10/12(土) 02:25:29.50:gzpbrH7N です では、 mylist :: Int -> [[Int]] mylist n = take n (chop n [1..]) : デフォルトの名無しさん [sage] 2019/10/12(土) 02:33:17.76:gzpbrH7N です コメントをつけ忘れましたが、ご紹介いだいた圏論のレポートは、以前にちょっと目を通したことがあったと思いますが、サッパリだった記憶が… あらためて拝見します ありがとうございます! : デフォルトの名無しさん [] 2019/10/12(土) 08:28:10.44:oBt8QHPo ちょっとchopと[1..]から離れましょう。 そして、[1..n]に何をすれば次のリストを得られるか考えましょう。 プレリュードの(入門以前と書かれた通り)基本関数の組み合わせだけで書けます。 IOと言うより入力ですが、関数の引数か、外部からの入力かだけで中身の処理は普通の関数と同じと捉えましょう。 そうするとreadLine関数が部分適用で見た目の引数の減った普通の関数に見えて来ませんか? 圏論で謳っているのは、どこから来たかが違っていても同じ事をするなら、同じ関数と見なそう。 そう言う、ある着目点以外の差異を無いものとするという事です。 : デフォルトの名無しさん [sage] 2019/10/12(土) 11:27:51.29:/Y14moqf です mylist n = take n $ f [[1..n]] where f [ns] = ns : f [g ns] g ns = map (+3) ns としたところで、要素に f を繰り返し適用して無限リストを作る関数があることを思い出し、思い出せずにカンニングして iterate を発見 mylist n = take n $ iterate f [1..n] where f ns = map (+n) ns map (+n) 辺りがどうも… : デフォルトの名無しさん [sage] 2019/10/12(土) 11:28:38.29:/Y14moqf インデントの空白が消えるのか : デフォルトの名無しさん [sage] 2019/10/12(土) 11:30:28.30:/Y14moqf 間違えた、先の関数の (+3) は (+n) でした : デフォルトの名無しさん [sage] 2019/10/12(土) 14:40:27.19:IkOZzxfL 文字数が減る主義を粛清した結果がこの関数脳内革命なのか? 文字数が減るでよかったのに : デフォルトの名無しさん [sage] 2019/10/12(土) 19:37:37.13:Qwy8j330 あの本出版した人? いくら稼げた? : デフォルトの名無しさん [sage] 2019/10/13(日) 08:24:39.79:joWtBDzr 競プロでもあるまいしアルゴリズムを非直観的なものに変形させる必要がどこにある? そんなに漸化式が好きなら iterate (\xs -> [last xs+1,last xs+2..last xs+n]) でもやってろ : デフォルトの名無しさん [sage] 2019/10/13(日) 12:28:55.45:vnXjj3sR プログラミング運算やると計算量がオーダーレベルで変わるよみたいな話もあるから 非直感的な宣言をすることがいつも無駄とは限らないだろう 今スレで話題になってる例が教育的によいかどうかはわからんが : デフォルトの名無しさん [sage] 2019/10/13(日) 12:35:18.14:rWBm0O/W 効率的な計算量になるようにコンピュータが計算して最適化してくれたらいいのに : デフォルトの名無しさん [sage] 2019/10/13(日) 14:20:50.34:8ABqNncq なにしてんの mylist n = [ [(m - 1) * n + 1 .. m * n] | m <- [1 .. n] ] とかじゃだめなの : デフォルトの名無しさん [sage] 2019/10/13(日) 14:25:29.07:8ABqNncq ただでさえO(n^2)なのにiterateとかやったらO(n^3)じゃん : デフォルトの名無しさん [sage] 2019/10/13(日) 15:19:23.66:joWtBDzr mylist n = take n $ chunksOf n [1..] がダメらしいからそれもダメなんじゃない?知らないけど : デフォルトの名無しさん [] 2019/10/14(月) 07:17:52.00:Foao1gEl 7000円 手続き型言語をやっていると非直感的ですが、そうで無い人(プログラミング未経験含む)だと割とこっちもメジャーなので、こっちが浮かぶのが関数脳を作れた基準?にしてます。 : デフォルトの名無しさん [sage] 2019/10/14(月) 13:10:48.92:dTytwEqk n個の品物が入るナップサックがn個あって 1,2,3...と番号の書かれた品物を順番にいれていく 等々いくらでも行動的比喩が可能な問題に対して数式的に考えることが自然ねぇ・・・ まあ人間の思考傾向を議論するつもりはないけど 少し考えればシンプルに解ける問題は少し考えろと主張をしたいんだとしても 我々手続き的ゾンビにとってmylistの例が「直観性」を犠牲にするほどシンプルだとは思えないけどね : デフォルトの名無しさん [sage] 2019/10/15(火) 00:51:42.29:ojqSK/Hb チューリング完全なもの同士は等価である Haskellと他の言語が等価であることを直感的に表現しているのがモナドだ この文脈ではモナドが直感的だと思わない奴の直感はあてにならない プログラミング未経験者ってのは文脈無視するのを正当化するための道具にされてるだけだろう : デフォルトの名無しさん [sage] 2019/10/15(火) 08:43:19.81:NwqFzBSd 隠そうとして隠し切れなかったのがモナド : デフォルトの名無しさん [] 2019/10/16(水) 01:24:19.49:N7kCHTAD モナドっていうネーミングも謎 : デフォルトの名無しさん [sage] 2019/10/16(水) 01:58:12.16:1kZaANyW ニョモレとかムニャンプの方が良かった? : デフォルトの名無しさん [sage] 2019/10/16(水) 02:26:39.80:lWzU93N+ モノ モノイド : デフォルトの名無しさん [] 2019/10/16(水) 22:21:13.29:N7kCHTAD モナド=単一子=世界の究極の根本要素 でもHaskellのモナドは外部とのやり取りを隠蔽してる脇役みたいなものでしょ : デフォルトの名無しさん [sage] 2019/10/16(水) 22:25:37.91:S+gc310a 無理やり型合わせするためだけの言い訳だな。 くっだらねーとしか思わんかったわ。 : デフォルトの名無しさん [sage] 2019/10/16(水) 23:44:14.52:5hxXU1b8 そう思ってでもまだこちらをのぞいているってことは かなり気に入る・気になる部分もあったんだよね。 どんなところがよかったの?あるいは気になったの? : デフォルトの名無しさん [] 2019/10/17(木) 03:04:05.52:Xwvn1Enx CSで使われる用語って何かのめたふぁか知らんけど 無理に数学に合わせて造語っててかえって判り難さが増すというね : デフォルトの名無しさん [] 2019/10/17(木) 03:47:00.30:qaCXzdDd モナドが分からんという人が多いのは 哲学のモナドと混同してるからだろうな 全く無関係の別物だと理解する必要がある : デフォルトの名無しさん [sage] 2019/10/17(木) 04:08:11.17:UnH0fUML いやそれはない : デフォルトの名無しさん [] 2019/10/17(木) 06:05:35.66:gq3I2ckq モナドはわかっても何が凄いのか全然わからん教えてくれ : デフォルトの名無しさん [sage] 2019/10/17(木) 07:39:25.89:fFU5Cjed 哲学と数学の違いは「嘘を言ってはいけない」という点にどこまで集中するかの違い すごいものを作るより有害なものを作らないことをどのぐらい重視するか : デフォルトの名無しさん [sage] 2019/10/17(木) 08:37:09.64:n/9LzeKG たしかにモナドすごいすごいって言う人っていざ説明させると説明できないよねw せいぜい受け売り止まり : デフォルトの名無しさん [sage] 2019/10/17(木) 09:27:30.90:PVi4YySF では説明お願いします : デフォルトの名無しさん [sage] 2019/10/17(木) 09:56:17.77:Gwz4u+oG 受け売り止まりじゃない説明はよ : デフォルトの名無しさん [sage] 2019/10/17(木) 10:16:38.68:kLoaz8mV モナドはただのデザインパターンの一つだろ : デフォルトの名無しさん [sage] 2019/10/17(木) 10:44:35.23:n/9LzeKG 俺は話聞いてるだけ 強引なHaskell推しに困ってる : デフォルトの名無しさん [sage] 2019/10/17(木) 10:44:48.97:UnH0fUML モナドほどの抽象化しただけで画期的じゃん イテレータとか用意してデータ構造によらないコンテナへの共通インタフェースとさらにそれへの特別なシンタックスシュガー用意した言語ぐらいならあった モナドなんか用意してdo記法なんてシンタックスシュガー用意してプログラミング言語における手続き的処理やその他諸々を抽象化した : デフォルトの名無しさん [sage] 2019/10/17(木) 10:57:50.46:8XbgiZIP 抽象化できてるか? 手続き型と同じっぽく見えるけど、いざ活用しようとすると同じようには使えなくて意味不明な型エラーで詰まる 結局のところモナドの仕組み理解できてないと使いこなせない これは抽象化できてないってことでしょ : デフォルトの名無しさん [sage] 2019/10/17(木) 11:46:58.33:UnH0fUML そりゃ任意の手続き型言語を再現できるわけではないから完全な抽象化ではないけど 手続き型的な処理とか、失敗する可能性のある処理とか、非決定的処理だとか、そう言った諸々をまとめてモナドとして一般化してる そのおかげでそれら全てで共通にdo記法やモナド向けの関数といったものが使えて、各種毎に個別に関数を用意したり覚えたりする必要が減る 自作のDSLなどを構築するときにも モナドインタフェースを実装するだけでdo記法やモナド向け関数群を使えるようになる 他言語でDSL構築は結構大変だし、オレオレDSLなんてどういう仕様かわかりにくいけど、haskellなら型から検索したり型を見たりすることでどういうアクションがあってどうやって使うのかがわかる : デフォルトの名無しさん [sage] 2019/10/17(木) 11:49:22.03:fFU5Cjed これがC++だったらJavaScript環境を作ってC++の仕組みを隠蔽するかもな Haskellでも同じことをする自由はある : デフォルトの名無しさん [sage] 2019/10/17(木) 21:34:43.47:AvAuJv6u 関数脳になるとどんな利点があるのかな? 手続記述は使い回ししにくい? 参照透過性が確保されていて型の情報があれば 算法の記法が手続き的か定義的かを問わず どちらでもいいような気もするが : デフォルトの名無しさん [sage] 2019/10/18(金) 00:47:49.97:Jux/affY Haskellのモナドって関数型で命令的な処理の書き方をしたいってことだろ 要するにLispにPROGフィーチャー入れたのと同じような動機だろ : デフォルトの名無しさん [sage] 2019/10/18(金) 06:44:38.21:lM5JoyFV 絶対違う : デフォルトの名無しさん [] 2019/10/18(金) 09:49:47.43:F+Okgjq/ 全然違うんだよなぁ… : デフォルトの名無しさん [] 2019/10/18(金) 12:21:22.11:cHgwfEPK コンストラクターがオーバーロードできないから別の列挙型に同じタグ名がつけれないんだけど どうしたらいい? : デフォルトの名無しさん [sage] 2019/10/18(金) 12:40:18.58:B/ouUg1P 学び始めはそう理解したが bind 演算子とか融合とか進んで 現時点では切り分けや共通化の便利な道具と思ってる : デフォルトの名無しさん [sage] 2019/10/18(金) 12:41:41.68:B/ouUg1P 自分だったら根本的な構造を見直すかな : デフォルトの名無しさん [sage] 2019/10/18(金) 17:04:05.16:lM5JoyFV kwsk : デフォルトの名無しさん [sage] 2019/10/18(金) 20:30:34.81:O9SciFl2 DuplicateRecordFields 拡張を使うとできるようになるっぽいよ。 ttp://http://lotz84.github.io/haskell/extensible-record.html : デフォルトの名無しさん [sage] 2019/10/18(金) 20:44:14.39:lM5JoyFV 俺も一瞬それ思ったけど同名データコンストラクタもできたっけ? : デフォルトの名無しさん [sage] 2019/10/18(金) 21:22:19.66:O9SciFl2 コンストラクタの方か。見間違えてた : デフォルトの名無しさん [sage] 2019/10/18(金) 22:18:25.57:O9SciFl2 data 宣言を別モジュールに分けて 両方が必要なら import ... as ... で別名をつけるって方法はどう? : デフォルトの名無しさん [sage] 2019/10/18(金) 22:56:52.03:liCy40EB モナドを導入することで副作用のない 「副作用のチェーンをつくって渡す。」 ちなみに実行は副作用させるというバカみたいなレトリックを実行してるだけ。 バカはそういうものをありがたがるんだよ。 そしてそういうものをありがたがるというのはバカみたいに本質なんだな。 : デフォルトの名無しさん [sage] 2019/10/18(金) 23:39:51.57:CSj9zhCF モナドのごとく回りくどく分かりにくい文だな : デフォルトの名無しさん [sage] 2019/10/19(土) 00:07:09.37:0X24TT// Haskellは個人の趣味・自己啓発の道具の範疇なので 参考にならないでしょうが… 名前がかぶるのはどこか機能がかぶってたりするかなと 型の使い方を見直したり組み合わせる関数を見直したり 所属するモジュールを移動したりとか。 どうしても名前がかぶるってときは英語名や日本語名 ときには中国語とかも借用する(ただし英字を使う ローマ字やピンイン表記)か密接に関係する事柄の 接頭辞をつけてる。 : デフォルトの名無しさん [sage] 2019/10/19(土) 00:15:25.34:0X24TT// モナドで副作用・副作用もどきを扱えるけど モナドの全てが副作用・副作用もどきを伴う わけではないでしょ。 リストもMaybeもEitherもモナドとして扱う 定義はされているが別にそれをつなげても 副作用があるわけでなし。 : デフォルトの名無しさん [] 2019/10/20(日) 21:44:47.02:5Lp8lBZ6 非決定計算やIOが同じモナドというククリで実現できるのが大変興味深いです : デフォルトの名無しさん [sage] 2019/10/20(日) 23:54:14.30:Wg020iKs なぜそんなにお前らがモナドについてあーでもないこーでもないと話し合ってるのかがわからない モナドなんていたってシンプルな考え方なのに モナドなんて単純にどうやって関数を合成するかというルールにすぎない より正確には、「モナディックな関数」を合成するルール では、モナディックな関数とは?それは"装飾された値"を返す関数のこと。 どんな装飾が施されたかについては、文脈によって様々だが、たとえば… ・エラー -> 失敗を表すデータもとりうる値 MaybeとかEither Error ・非決定性 -> いくつもの値を同時に表す値 List, Array ・副作用 -> 副作用自体を表すデータ Effect, Aff ・状態を扱う -> 状態を表すデータとセットになった値 Reader , Writer, State : デフォルトの名無しさん [sage] 2019/10/21(月) 00:25:00.67:4Py1bsIM シンプルな考え方合成ルールといいつつ 肝心のルールの中身を説明しないで 利点や応用分野のみ紹介する 典型的な日本人話法 モナドは単なる自己関手の圏におけるモノイド対象だよ。何か問題でも? : デフォルトの名無しさん [sage] 2019/10/21(月) 00:50:05.83:tyOGJJBt いやだから装飾のされ方は物によって様々だって言ってるじゃん ルールの中身も当然装飾のされ方によって様々なんだから画一的に述べられないってわからないか? 一つ言えるのはbindとpureの定義を与えるってことくらいだが あるいは同値な定義だが、関手であることを要請した上でjoinとreturnを与えるのでも構わない 数学者のモナドの定義を述べているお前ならこっちのほうが好みかもな : デフォルトの名無しさん [sage] 2019/10/21(月) 11:02:55.47:Spzp+9MC 「自己関手の圏」の中身を説明しないからわけがわからない 関手の合成は積? 恒等関手は単位対象だが終対象ではない? うっかり始対象になったりしたらそれ積じゃなくて和じゃないか : デフォルトの名無しさん [sage] 2019/10/21(月) 12:39:15.34:4Py1bsIM 中身は数学で明示されてるのでは : デフォルトの名無しさん [] 2019/10/21(月) 14:07:32.87:Fq1X48Cm 自己関手の圏におけるモノイド対象としてモナドを理解することは、必ずしもプログラミングのためになるものではないから必須ではない。 それでもそれを理解したいのであれば、プログラミングの文脈で理解するのではなくて、ちゃんと圏論の文脈で理解した方がいい。 Bartosz MilewskiのCategory theory for programmerがわかりやすくておすすめ。 : デフォルトの名無しさん [sage] 2019/10/21(月) 14:17:03.91:2JzHnDoh 【僕用メモ】 ・bind と pure の定義を与える ・関手であることを要請した上で join と return の定義を与える 両者は同値である。 : デフォルトの名無しさん [sage] 2019/10/21(月) 14:44:27.76:VTam/Iyy だめな理系人間の特徴 初学者に対してひたすらwhatを説明 だいたいコミュ障を併発してる : デフォルトの名無しさん [] 2019/10/21(月) 14:53:31.64:c9dhXgWB この人のことか ttp://http://masa-lab.hateblo.jp/entry/2019/02/01/110041 : デフォルトの名無しさん [sage] 2019/10/21(月) 15:19:59.07:ZzgPuxVR そうでもなくね? っていうか内容がHaskellに関係なかったw : デフォルトの名無しさん [sage] 2019/10/21(月) 15:38:45.76:E4DE6I01 お前らって圏論なにで勉強したの 英語の本読んだの?大学の授業とかで習ったの? : デフォルトの名無しさん [sage] 2019/10/21(月) 15:49:09.35:niRnsl0k 数学の本買って独学 : デフォルトの名無しさん [] 2019/10/21(月) 16:22:57.20:5+ah6i6T 知らん用語が出て来るから初学者で戸惑う人が多いだろうが 内容は小学生でも理解出来るレベル : デフォルトの名無しさん [sage] 2019/10/21(月) 16:52:11.20:D03iscrb Basic Category Theory, Tom Leinster 英語で読んだ : ◆QZaw55cn4c [sage] 2019/10/21(月) 22:01:25.88:lW7UmcA6 翻訳でもない和書ってありませんかね… : デフォルトの名無しさん [] 2019/10/22(火) 02:26:17.25:Y6ckqEQv 数学教室 πの焼き方と、プログラマーのための圏論。 ただ、読んだ後に意味を吟味して閃きが必要だった。 まず普通の関数とモナドな関数を同じと見做す考え。 IOモナドの入力は基本、文字列を受け取るので数文字列を受け取って、整数に変換後2倍する関数を作るとする。 getLine >>= \s -> return $ 2 * read s これと同じ効果の普通の関数を作ってみる。 getLine’ s = 2 * read s このgetLineとgetLine’をそれぞれ部分適用で見かけの変数を減らす形に変形。 getLine >>= return.(2*).read getLine’ = (2*).read この場合、2つの関数は型と引数からの入力か入力装置からの入力かしか違いがない。 関数の中身から見れば、いつ、どんな文字列が来るか分からない。同じ数文字列が来たら同じ結果を返すと言う意味では同じと見なせる。 : デフォルトの名無しさん [] 2019/10/22(火) 02:26:29.61:Y6ckqEQv そして、圏論の主張は変数は引数無しの関数でも有ると言う事。 以下は関数である。 f x = 2 * x しかし、部分適用されたカリー化関数は関数でもあり、変数でもある。 f = (2*) (関数でもあり、関数という値を返す変数でもある) すなわち、x = 1のようなただの変数も、つねに1を返すxと言う引数の無い関数と見なせる。 x = 1 (1と言う値の入った変数であり、常に1を返す引数無しの関数でもある) Haskellでは表現できないものの、さらに言えば数そのものも圏論では値であり、変数であり、関数である。 単純に書くと以下の通りだが、 1 = 1 ペアノの公理(ペアノ数)を使った方が概念的に分かりやすいかも知れない。 data Nat = Zero | Succ Nat 1 = Succ Zero : デフォルトの名無しさん [sage] 2019/10/22(火) 03:15:18.03:Id5sXRgE ちぃOrdの使い方覚えた ttp://https://ideone.com/LForVF : デフォルトの名無しさん [sage] 2019/10/22(火) 07:00:59.60:bWQbmCi2 youtubeにある彼のビデオレクチャーも良いよ : デフォルトの名無しさん [sage] 2019/10/22(火) 11:37:49.35:QfoZv31s モノイドのところがよくわからんかったけど読み物として面白かった ttp://https://chrispenner.ca/posts/wc : デフォルトの名無しさん [sage] 2019/10/22(火) 13:56:22.87:bWQbmCi2 ちょっと待て モノイドのところが一番の肝で面白い部分だろ : デフォルトの名無しさん [sage] 2019/10/22(火) 21:21:34.69:r5HMg/cf >数そのものも圏論では値であり、変数であり、関数である。 もしその様な表現が可能な拡張がされた場合何が起きる出来るんですか? 数値に新規の型を設定して値で変数で関数みたいな扱い出来ないかな : デフォルトの名無しさん [sage] 2019/10/22(火) 21:31:09.36:mzkWHCb9 圏論うろおぼえだけどそれって圏論の範疇だっけ? 圏論ってマッピングする理論であってその対象が値か関数か変数か関知しないのでは? 値が関数ってのはラムダ計算から来るものでしょ 確かにそれらを組み合わせて計算理論になるわけだけど : デフォルトの名無しさん [sage] 2019/10/23(水) 02:22:17.73:yKBkbeD2 お前が圏論を全く理解していないことは良くわかった 圏論には「関数」とか「値」とか「変数」といった概念はない 「対象」と「射」との2つの概念があるだけだ だからお前の次の >数そのものも圏論では値であり、変数であり、関数である これは単なる間違いさえ通り越して全くのナンセンス 圏論には値も変数も関数も存在しないのだから 何を対象として何を射とするかは個々の具体的な圏によって異なる : デフォルトの名無しさん [sage] 2019/10/23(水) 02:25:20.92:yKBkbeD2 ああ、ちょっと簡単に書きすぎたね 確かに関手 : デフォルトの名無しさん [sage] 2019/10/23(水) 02:29:17.74:yKBkbeD2 は書いてる途中で間違って送信してしまった ああ、ちょっと筆(じゃなくてキーボード)が滑って簡単に書きすぎたね 確かに関手とか自然変換といった概念も圏論にはあるが、これらもある圏から見れば射や対象に過ぎない いずれにしても圏論には値や関数や変数といった概念はない : デフォルトの名無しさん [sage] 2019/10/23(水) 03:34:04.69:yprcaBdP では何らかの制限がないと取り扱いが難しいよね 例えば英語と日本語の翻訳で使われる意味を咀嚼変換するロジックを圏論だと言われたら なんか凄く難しそうだなとか : デフォルトの名無しさん [sage] 2019/10/23(水) 07:48:02.01:w9X9/NZW 別に集合論だって写像の集合を考えればいいわけでそんなのは圏論を持ち出さなくても十分 重要なのは圏論は写像の合成(関数合成)を抽象化して扱う理論だということで だからこそa -> IO bを射とする圏を作れればそこでの射の合成方法は普通の関数合成と同じように扱える で実際にIOはクライスリトリプル(Monadのインスタンス)を定義できるからa -> IO bを射とするクライスリ圏が定義できる : デフォルトの名無しさん [sage] 2019/10/23(水) 15:46:04.24:QE7mhz5K 質問です。 当方数学科卒で学生時代圏論は死ぬほど使ってました。 しかしアーベル圏という純数学的なお話知ってるだけで、計算論に応用する話は全く勉強した事ない状態です。 そういう人間が圏論の計算論への応用を勉強したいときオススメの教科書、参考書は何かご存知ですか? 抽象圏論や数学基礎論も少しかじった事があるのでその手の話が出てきてもあまり困る事はないと思ってます。 : デフォルトの名無しさん [sage] 2019/10/23(水) 18:37:44.76:EHUlBTzl そこまで圏論に詳しいなら逆に世の中の有象無象の情報処理の実態を 見て新しい提案ができるんじゃないかと思うけどどう? : デフォルトの名無しさん [sage] 2019/10/23(水) 18:48:53.05:FecPQc4e 型推論とモナドがわかったら解散でいいじゃん だらだら続けるとサンクコストが増える : デフォルトの名無しさん [sage] 2019/10/23(水) 20:01:33.78:r6mLYpNF 浮動小数演算みたいなある種のモナド則が成り立たんものを考えると、 逆にモナド則のありがたさがわかる。 そんな程度で十分だよ。 : デフォルトの名無しさん [sage] 2019/10/23(水) 22:29:52.97:0mQ7NQWB どちらかと言えば、モノイドの方が役に立つ : デフォルトの名無しさん [sage] 2019/10/23(水) 22:51:28.42:MhItXVwr 浮動小数点のモナド? モナド則の結合律っぽい奴は普通の関数で言うなら f (g x) == (f . g y) x を要請してるのであって f,gの計算には依存しないから浮動小数点が破壊することはないよ : デフォルトの名無しさん [sage] 2019/10/23(水) 22:55:47.94:MhItXVwr ミス f (g x) == (f . g) x だった : デフォルトの名無しさん [sage] 2019/10/24(木) 01:14:02.96:iVnwkALy f x = x / 0.3 g x = x * 0.3 : デフォルトの名無しさん [sage] 2019/10/24(木) 01:19:57.43:iVnwkALy ghci でやってみたら循環小数にならなかった。macOSの電卓でも。 へぇ〜。 : デフォルトの名無しさん [sage] 2019/10/24(木) 01:57:21.20:/X6zPP1d > そういう人間が圏論の計算論への応用を勉強したいときオススメの教科書、参考書は何かご存知ですか? > 抽象圏論や数学基礎論も少しかじった事があるのでその手の話が出てきてもあまり困る事はないと思ってます。 理論計算機科学(以下、TCSと略)への圏論の応用を勉強したいのならば、最もベーシックなテキストとしては 1. Andrea Asperti & Giuseppe Longo: Categories, Types, and Structures, 306+xii pp., MIT Press (1991) 型理論として単純型付きλ計算と2階の型付きλ計算それぞれに対する圏論的意味論を議論している他、 型無しλ計算の意味論を展開する上で不可欠な再帰的領域方程式とその解に対する圏論的な見方も解説している。 更にHaskellなどで喧しいモナドやKreisel圏についても解説している。(関数プログラミング言語へのモナドの応用は 本書の著者の1人であるLongoの論文から全てが始まった) この本の最大の欠点は誤植がとても多いことと昔のMacで書かれていてテキスト中の数式も図も美しくないことだ。 なお、現在は書籍としては品切れになっていたと思うが、著者のHPから電子的に無料で入手可能になっていたはずなのでネットで探して下さい。 2. Roy L. Crole: Categories for Types, 335+xvii pp., Cambridge University Press (1993) 様々な型理論(型理論は(関数)プログラミング言語とその型システムを形式的体系としたものと考えて良い)に対する圏論的意味論を議論している。 3. 横内寛文:プログラム意味論,261+vi pp.,共立出版 (1994) 久しく品切れになっていたが少し前に増刷されたので現在はジュンク堂などの大型書店などの店頭で買えるはず。 表示的意味論、型無し・型付きλ計算、領域理論、関数型言語の意味論について1つずつ章を設けて解説した後、この本で必要とする圏論の解説がされ、 プログラミング言語の表示的意味論で必須の再帰的領域方程式とその解法に対する圏論からのアプローチと λ計算の意味論としてλモデル・λ代数・圏論的モデルとしてのCCC(デカルト閉圏あるいは積閉包圏)について解説している。 この他にもTCSへの圏論の応用としてはオートマトン理論への応用や代数的仕様記述言語の意味論への圏論の応用 (こちらの意味論ではデカルト閉圏は使われない)などがある。 : デフォルトの名無しさん [sage] 2019/10/24(木) 02:41:27.79:/X6zPP1d 訂正と補足 まず1に関する説明中の次の箇所を訂正します。つい筆が滑ってKleisliをKreiselと書いてしまった。 誤> 更にHaskellなどで喧しいモナドやKreisel圏についても解説している。(関数プログラミング言語へのモナドの応用は 正> 更にHaskellなどで喧しいモナドやKleisli圏についても解説している。(関数プログラミング言語へのモナドの応用は それから、 > なお、現在は書籍としては品切れになっていたと思うが、著者のHPから電子的に無料で入手可能になっていたはずなのでネットで探して下さい。 と書いたが、無料の電子版は著者の一人であるLongoの次のURLよりPDFファイルの形で配布されている。 ttp://https://www.di.ens.fr/users/longo/files/CategTypesStructures/book.pdf : デフォルトの名無しさん [sage] 2019/10/24(木) 09:09:56.34:M5uvwdA8 浮動小数においては (a+b)+c != a+(b+c) なんだよ。 : デフォルトの名無しさん [] 2019/10/24(木) 19:35:38.99:iMDLzbYl だからこそ「モナド則の結合律のこと言ってるの?あれは関数合成的な話だから関係ないよ」 って言ってるんだけど ああもしかしては結合律一般について言ってるのか? それならアスペみたいなこと言って悪かった いやまさか四則演算の結合律の便利さから printFile file = readFile file >>= putStrLn printFile == readFile file >>= putStrLn になることの利点を理解しろという主張だとは思わなかったからさ・・・ : デフォルトの名無しさん [sage] 2019/10/24(木) 19:42:56.62:M5uvwdA8 いやモナド則で語ることなんて結合律以外ないだろ。。 結合律を無条件で仮定できる状況がどれほど負担を減らすかって話なんだが ここまでバカな絡まれ方するとは思わなかった。 : デフォルトの名無しさん [] 2019/10/24(木) 19:50:34.49:iMDLzbYl ああ、printFile file == readFile file >>= putStrLn だった しかもそれも誤解しか生まない表現で 要はreadFile file >>= putStrLnをprintFileで置き換えても問題ないってことを言いたかったんだけど いやほんと5ch向いてないね : デフォルトの名無しさん [sage] 2019/10/24(木) 20:08:28.59:3BngmFUW なんか、あんたは気持ち悪いね : デフォルトの名無しさん [sage] 2019/10/24(木) 20:16:05.76:iMDLzbYl いやほんと頭が悪くて申し訳ない 「足し算の結合律って便利でしょ?モナド則も結合律だから便利なんだよ」 こんな糞みたいな主張をする人間が世の中にいることぐらいは分かっておくべきだった : デフォルトの名無しさん [sage] 2019/10/24(木) 20:22:28.52:y9mzZKfZ 単位元を語ってもええんやで : デフォルトの名無しさん [sage] 2019/10/25(金) 04:29:07.52:2bZjXkn1 前提として「足し算の結合律って便利だね」 じゃ足りないの 何が不足なのかな 副作用をモナドの結合連鎖外に及ぼさない事による恩恵が主目的じゃないの? とくにマルチスレッドコア環境だと色々有難いよね モナド連鎖の組み合わせとか組み替えとかがスカッとできてイイ!とか 連鎖の中で起きたエラーのリカバリーとかはよくわからん : デフォルトの名無しさん [] 2019/10/25(金) 08:07:43.53:39WP6mHi モナドが実際の所どれぐらい便利なのかは分からないけど (m >>= f) >>= g == m >>= (\x -> f x >>= g) が言ってることは単純なんだよ >>=が普通の関数呼び出しのように使えるというだけ $(普通の関数呼び出しを演算子化したもの)の場合を考えれば分かりやすいかな g $ (f $ x) == (\y -> g $ (f $ y)) $ x 関数と値の引数が$と>>=では逆だから両辺が逆向きになってるけど 要するに二つの関数を一つの関数まとめても構わないという 誰もが当たり前にやってることの理論的基盤を>>=にも要請してるというだけなんだよ だから getLine >>= printFile と getLine >>= readFile >>= putStrLn が同じだと言うためにはこの結合律を満たさなきゃならない ちなみに二個以上の関数をまとめ上げる場合や多引数の場合もこれで証明できる : デフォルトの名無しさん [sage] 2019/10/25(金) 08:33:13.53:2bZjXkn1 モナドの条件が成立すると色々便利な事は認識している 端緒の認識はそれで問題ないと思ったけど 便利だよねって見解が >こんな糞みたいな主張をする人間が世の中にいることぐらいは分かっておくべきだった って言われて、え?え?何かマズイ理解なり認識があるのか?? 何がマズいのかワカラン??って感想 単純に罵倒してマウント取りたかっただけなら問題ない : デフォルトの名無しさん [sage] 2019/10/25(金) 09:19:09.32:dpM8h0bh 見たとき何言ってんだコイツと思ったが案の定ボコされてて安心した 論理的な思考ができない人間って怖いわ : デフォルトの名無しさん [sage] 2019/10/25(金) 11:27:36.73:2bZjXkn1 >浮動小数においては >(a+b)+c != a+(b+c) >なんだよ。 まるめ誤差を考慮すればだけど 浮動小数点を引き合いにだして!=だってやった事か : デフォルトの名無しさん [sage] 2019/10/25(金) 18:07:06.47:mPFGj3TJ そこは売り言葉に買い言葉だったんじゃねーの。 俺は雑な主張はアリだと思うし、それに対する善意の解説もいいと思うぞ : デフォルトの名無しさん [sage] 2019/10/25(金) 18:15:13.95:lPbrkHzC 三段論法的なのが糞だって言ってるだけでその部分は別に間違ってないよ まあマウンティングするつもりはないんだが 曖昧なこと言っといてそれについて意見したら「バカに絡まれた」なんて そりゃ感情的にもなるよ確かに大人げないけどさ : デフォルトの名無しさん [sage] 2019/10/25(金) 18:32:47.40:lPbrkHzC そう言ってくれるなら嬉しい限りだけど 最初のレスから反省する点が多すぎるのでもう消えます スレのみなさんご迷惑をおかけしました😿 : デフォルトの名無しさん [sage] 2019/10/25(金) 19:57:54.15:jaw68O5t まあかなり意地の悪い例を出したつもりではあったけどね。 「論理的思考」とか言い出す輩が引っかかりそうな例を。 : デフォルトの名無しさん [sage] 2019/10/25(金) 20:50:12.32:8KDPUxpr どうでもいいけど「論理的アルゴリズム」だったら簡単にコピーできそう アルゴリズムとパラダイムの違いの一つは、コピーする自由 : デフォルトの名無しさん [sage] 2019/10/26(土) 00:21:14.14:ud4Mu1os モナドの話してる中で一人結合則全般についての話始めて浮動小数点数に関する当たり前の説明せっせとしてんのは草 小学校で習う掛け算も足し算もモナドみたいに便利だけど浮動小数点数はモナドと違って不便だねえ : デフォルトの名無しさん [] 2019/10/26(土) 10:10:55.84:e6NVGnmw 最近近隣スレで浮動小数点数で恥ずかしい書き込みを繰り返してる香具師を観かけたが きっとCS知らない浮動小数点数覚えたての厨房が暴れてるんだろう : デフォルトの名無しさん [sage] 2019/10/26(土) 10:22:10.08:az5oKcRh 素人なので確認したい 浮動小数点演算は計算式の組み替えによって生じる 計算ごとの丸め誤差とその蓄積が一意ではない そこが問題。でいいですか? : デフォルトの名無しさん [sage] 2019/10/26(土) 12:52:46.96:751XFDvk 例えば、3桁の有限桁数で、 123,000 + 987 は、どうなると思う?w : デフォルトの名無しさん [sage] 2019/10/26(土) 13:03:31.77:az5oKcRh 浮動小数点は実装の有効桁数とか精度誤差の複合なんですね やっと理解できたとかも : デフォルトの名無しさん [sage] 2019/10/27(日) 09:39:17.43:E41dDRFH >123,000 + 987 は、どうなると思う? 合成や結合則との関係は? : デフォルトの名無しさん [sage] 2019/10/27(日) 12:11:44.86:5vE1lFai ヒント (123000 + 987) + 456 123000 + (987 + 456) : デフォルトの名無しさん [sage] 2019/10/27(日) 12:20:50.14:+UrB7+Fx >647 有効桁数3の条件下では 443 443 で結合則?を満たしている : デフォルトの名無しさん [sage] 2019/10/27(日) 14:13:05.51:E41dDRFH ヒントなどと気取らず最初からその例を出せばいいのに… 整数計算で有効桁数という考え方はあまりしないとおもうし 計算途中の有効桁数範囲外の取り扱いを決めておかないと なんとでも言えるような。JISにあったかな? : デフォルトの名無しさん [sage] 2019/10/27(日) 20:56:25.06:5vE1lFai 最初からも何も最初言ったの俺じゃないし誰でも気づくだろ : デフォルトの名無しさん [] 2019/10/28(月) 15:11:56.47:CizzAz3Z 恥の上塗り : デフォルトの名無しさん [sage] 2019/10/31(木) 16:11:16.19:Q9035W3u 最近のHaskellは末尾再帰形は当たり前として、余再帰形まで最適化するってマジ? : デフォルトの名無しさん [sage] 2019/10/31(木) 19:47:56.88:+pnqrJiF モナドの話すると怒る人が一定数いるのに 最適化の話は難解でもすんなり受け入れられるのなんでだろう : デフォルトの名無しさん [sage] 2019/10/31(木) 19:53:32.58:PeiHf3lU モナドとか関係なくあまりに馬鹿っぽいレスが怒られるだけ 例えばもそう : デフォルトの名無しさん [sage] 2019/10/31(木) 20:01:53.96:0babd/Ur 年寄りが自分の理解できないことをしゃべるなって いっているだけでしょ。最適化はなんだかんだいっ て実践もしくはなんとか理解できる範疇とかでは。 : デフォルトの名無しさん [sage] 2019/10/31(木) 20:08:46.83:+pnqrJiF 例えば「馬鹿っぽい」の定義はモナドの定義よりもずっと複雑なんだよ そのわりに「馬鹿っぽい」は難解すぎるという認識はほとんどない : デフォルトの名無しさん [sage] 2019/10/31(木) 21:33:19.89:0babd/Ur Haskellや圏論のモナドってライプニッツ由来?ギリシャ哲学由来? : デフォルトの名無しさん [sage] 2019/10/31(木) 22:15:10.01:ZttcTVl1 モナドの場合、「俺の理解は正しくて、お前の理解は間違ってる」てな話になりがちだから。 : デフォルトの名無しさん [sage] 2019/11/02(土) 11:54:49.10:8EQu8ULJ お返事おくれて申し訳ありません。 時間作って是非挑戦みたいと思います。 ありがとうございました。 : デフォルトの名無しさん [sage] 2019/11/02(土) 21:23:26.95:3BGLXMdU 【ぼくようメモ】 Haskellはマルチディスパッチをネイティブサポートしているので、 デザインパターンの一つ、Visitorパターンを気づかない内に使っている。 : デフォルトの名無しさん [sage] 2019/11/02(土) 22:57:22.40:r3wI6psG Haskellを勉強するとどんなメリットが有りますか? @ Haskellを使って仕事する開発プロジェクトなんてものは世の中に有るのですか? A @が無いなら開発プロジェクトが無くても仕事の効率化などで、役立てる方法は有るのですか? B Aも無いなら、勉強して得た知識を日々のJava等の開発プロジェクトで役立てる方法は有るのですか? : デフォルトの名無しさん [sage] 2019/11/02(土) 23:45:55.62:lY37zOLC 3かな。 コード書く際に 入出力部分と、ディターミニスティックな部分を選り分けるような書き方するようになった。 : デフォルトの名無しさん [sage] 2019/11/03(日) 00:23:07.97:lUqXCL2k 世界に目を向ければ、Reddit でよく求人されてる : デフォルトの名無しさん [sage] 2019/11/03(日) 07:05:59.77:SWWLrIVQ >ディターミニスティック ?? 基本遅延評価なので即時評価とのより分? : デフォルトの名無しさん [sage] 2019/11/03(日) 07:44:37.10:lUqXCL2k ディターミニスティック 決定論的な IOが絡む非決定論的なコードと、引数と戻り値の関係が決まっている決定論的なコードとを、 しっかり分けて書けるようになったと言いたいのだろう。 要するに、副作用のあるコードと純粋なコードを分けるということだ。 : デフォルトの名無しさん [sage] 2019/11/03(日) 10:14:27.60:9HD8E/jN 女心と秋の空はデバッグするのが難しいってことだ : 661 [sage] 2019/11/03(日) 12:44:26.49:phxg68Jk 皆さんありがとうございます。 どうやら、あまり勉強する意味がなさそうに感じました。 なぜみなさんはこの言語をおやりになっているのでしょうか? 趣味でしょうか? : デフォルトの名無しさん [sage] 2019/11/03(日) 12:48:35.08:r9lfrX/A まあ勉強する意味はないといえばないかな。 その当時盛り上がったってのが理由だったりするから趣味といえば趣味。 でもまあその言語がどういうところを気にして作られたかってのを 触って実感するってのはプログラム全般で役に立つと俺は思うけどね。 : デフォルトの名無しさん [sage] 2019/11/03(日) 13:13:12.24:phxg68Jk Javaから初めて、Javaしか書いたことが無い人というのは再帰メソッドとして実装した方が良いものも、慣れていないし面倒くさいからという理由で再帰にしたがらない傾向が有ります。 Hakellを勉強した人間なら、そういうことが起こらないという利点が有るといいうことでしょうか? : デフォルトの名無しさん [sage] 2019/11/03(日) 14:27:23.33:9HD8E/jN 将棋の居飛車党と振り飛車党みたいなもん : デフォルトの名無しさん [sage] 2019/11/03(日) 14:42:14.64:A+q4He3F ループより再帰がいつも正しいわけではないでしょ Javaなんだし おれが仕事でやってるプロジェクトでは再帰は基本NGだよ : デフォルトの名無しさん [] 2019/11/03(日) 15:00:10.66:smmSGOst ループと末尾再帰は等価(キリっω : デフォルトの名無しさん [sage] 2019/11/03(日) 15:01:32.59:b8FiTQTP haskell学んでも、stack safeな再帰を書けるようになるわけでもないから、 haskellを学ぶ利点だとは思わない 理由を探さなきゃ学ぶ気になれないものには手を出さなければいいんだよ CSの世界に限っても死ぬまでに学びきれないだけのネタがあるんだし : デフォルトの名無しさん [sage] 2019/11/03(日) 16:32:47.09:nhaRMy12 『達人プログラマー』でも「毎年1つ新しい言語を学べ」と言っている まあ凡人にそこまでは厳しくとも たまに新しいプログラミング・パラダイムに触れることは プログラマーにとって有益であると思うよ それは知識として即効性のあるものというよりは(そういうのもあるかもしれないが) 1年2年経って効いてくるタイプのものかなと : デフォルトの名無しさん [sage] 2019/11/03(日) 18:49:00.94:AdH9k/oI Aかな 宣言的プログラミングの作法が身につく 普段Javaを使っているのなら、 最近のJavaは関数型プログラミングのシンタックスがかなり増えてきているので Haskellで高階関数の使い方を理解しておくと、Javaプログラミングに直接的に役立つ : デフォルトの名無しさん [sage] 2019/11/03(日) 19:10:14.85:UDaenYuS 宣言的プログラミングとは何ですか : デフォルトの名無しさん [] 2019/11/03(日) 20:02:00.41:JubniDAi 横レスだけど、そんなに役に立たないものなのか... 入門本買おうか悩んでたのに : デフォルトの名無しさん [sage] 2019/11/03(日) 20:22:26.22:SWWLrIVQ 副作用ですか Cのポインター辺りは副作用上等でトリッキーな事をしつつ記述してあるわけで 副作用と脆弱性に苦しんだ結果、RUST Haskellの恐ろしい所はプログラムが何らかの高度な数学的アルゴリズムな場合があって 別途資料がないと全く理解できない あっても以下略 : デフォルトの名無しさん [sage] 2019/11/03(日) 20:59:17.59:phxg68Jk プロの世界では振り飛車は居飛車より勝ちにくいと言われますが、久保九段や菅井七段のようにそれを使って実践で勝つプロもいます。 アマの世界では振り飛車か居飛車かが直接勝敗に結びつくような高度な戦いができないので好きな方を選べばいいです。 ところが、ビジネスプログラミングの世界ではどうでしょうか? 残念ながら、手続き型プログラミング言語の開発プロジェクトしか存在しません。 関数型は使おうにも使う場所が無いのです。 : デフォルトの名無しさん [sage] 2019/11/03(日) 21:02:48.17:A+q4He3F ないことはない たとえIT土方業界であっても : デフォルトの名無しさん [sage] 2019/11/03(日) 21:12:52.97:j4VhEtAF Javaだって宣言型にシフトしつつあるし、 最近のJavaScript(ECMAScript)は基本的に宣言型プログラミングだよ 宣言型プログラミング=関数型プログラミングではない : デフォルトの名無しさん [sage] 2019/11/03(日) 21:23:44.54:r9lfrX/A 宣言型を変にもてはやす記事とかあるけどさ、 あれバグがあるときに凄まじくデバッグしにくいってことはちゃんと知っておいた方がいいぞ。 : デフォルトの名無しさん [sage] 2019/11/03(日) 21:26:11.59:j4VhEtAF それはいくらなんでもド素人すぎるだろう : デフォルトの名無しさん [sage] 2019/11/03(日) 21:44:19.05:r9lfrX/A 多分、君は論理プログラミングとか制約プログラミングについて理解してないんだろう。 : デフォルトの名無しさん [sage] 2019/11/03(日) 21:49:28.47:j4VhEtAF むしろそちらの方が専門に近いのですが、 どういうことか教えていただけますか? : ◆QZaw55cn4c [sage] 2019/11/03(日) 21:49:45.89:A1whpPq+ >『達人プログラマー』でも「毎年1つ新しい言語を学べ」と言っている 新しい言語を一年に一つ、とは、これは厳しい縛りですね… : ◆QZaw55cn4c [sage] 2019/11/03(日) 21:51:15.76:A1whpPq+ >久保九段 地元の棋士なので光速谷川氏とともに密かに応援してたりします : デフォルトの名無しさん [sage] 2019/11/03(日) 21:59:29.92:A+q4He3F 横からだけど 凡人にとっては数学的な静的な関係を見つけ出すのはしんどいことが多い 副作用あろうが、ソースコードをステップ実行でトレースできる手続き型の方が 問題解析が楽ってことは往々にしてある : デフォルトの名無しさん [sage] 2019/11/03(日) 22:04:59.57:nJ4Xpsy6 ジャンプ漫画みたいな台詞すこ 「三つか四つはないと、暇を持て余してしまいます……」的な : デフォルトの名無しさん [sage] 2019/11/03(日) 22:44:06.12:ksAXIGkW モナドって結局、計算効果Tをもたらすプログラム(T-プログラム)は クライスリ圏をなすからクライスリトリプル(モナド)がT-プログラムの 合成規則として必要だから出てくる : デフォルトの名無しさん [sage] 2019/11/03(日) 22:45:11.48:A+q4He3F 駄目な理系君の典型 : デフォルトの名無しさん [] 2019/11/03(日) 22:56:40.83:l1Ex5n/D 否定しないが結論としてはそうだぞ モナドを利用したテクニックと登場する理由は違って当然じゃね? : デフォルトの名無しさん [sage] 2019/11/03(日) 23:34:12.73:/tZ0XI+t >Javaだって宣言型にシフトしつつあるし どのような店を持ってシフトしているとおっしゃっているのか、例を教えていただけると嬉しいです。 : デフォルトの名無しさん [sage] 2019/11/04(月) 05:48:03.18:PrFaR+H+ モナドの副作用云々は Scala Monix の並列プログラミングも面白い : デフォルトの名無しさん [sage] 2019/11/04(月) 06:29:33.14:u0qouhFJ 恐ろしさというよりも Haskellの仕様その他聞くと全く関係ない数学の話をしだす奴ばかりでカンファレンス途中で抜けてきたことがある 数学には全く興味ないんだがね 言っても聞きやしないこいつらとは合わないわと思った : デフォルトの名無しさん [sage] 2019/11/04(月) 07:07:21.47:PrFaR+H+ マジでHaskellは数学者が数学者の為にデザインしたみたいなものなので ネット上のコードも数学的専門性に全振りしたものが普通にある そんなのは数学の専門課程と無関係な人間には理解できない だけど、英文の赤黒木を扱うHaskellのコードは恐ろしくスッキリ短くて 余分なノイズが少ない 全体の把握が楽だった、恐ろしく高密度かも コメントで書く詳細説明≒Haskellのコード : デフォルトの名無しさん [sage] 2019/11/04(月) 12:15:05.55:GOdOYVw0 型の宣言だけならコードの中に埋め込むことはできた だが数学の知識をすべて宣言するのは無理 だからコードを読みながら数学勉強しようと思ったら、わかることは静的型ばっかりだぞ そもそも数学は広大過ぎてどこから手をつけるか迷うから静的型から始めるのは合理的 : デフォルトの名無しさん [sage] 2019/11/04(月) 20:52:45.92:t2f72QmD 数学の後ろ盾があるとよくわからない安心・万能感を錯覚し これがよくわからない人を呼び寄せてしまう この魅力はオカルトめいている 謎多き異性に惹かれてしまうのと似ている : デフォルトの名無しさん [sage] 2019/11/04(月) 21:01:45.20:0O6JYxLK キモすぎてわろた : ◆QZaw55cn4c [sage] 2019/11/04(月) 21:05:02.30:fwURXfb5 >赤黒木を扱うHaskellのコードは恐ろしくスッキリ短くて >余分なノイズが少ない 赤黒木がそんなに短くなるのですか?! やっぱり haskell をがんがらなくては : デフォルトの名無しさん [sage] 2019/11/04(月) 21:24:51.70:GOdOYVw0 オカルトめいているのは数学でも言語でもない 人間の感情がオカルトめいているのだ : デフォルトの名無しさん [sage] 2019/11/04(月) 21:59:28.69:PrFaR+H+ 英語の参考資料(ブラウザで翻訳しつつ Red-Black Trees in a Functional Setting ttps://pdfs.semanticscholar.org/7756/16cf29e9c4e6d06e5999116f777e431cafa3.pdf : ◆QZaw55cn4c [sage] 2019/11/04(月) 22:04:39.09:fwURXfb5 thx a lot ! 英語は読めないのですが、想像していなかったくらいに簡潔ですね… : デフォルトの名無しさん [sage] 2019/11/05(火) 17:15:35.86:GEIgbGGA PostgREST は Haskell のキラーコンテンツになれるか : デフォルトの名無しさん [sage] 2019/11/05(火) 20:00:05.59:PndodFqR Haskellの代数的データ構造は、速度が低い方に引かれるけど、恐ろしく合理的な手法かも知れない 中身は基本Lispの構文糖衣相当だからLIST処理のコストがそのまま処理速度に反映される ただ、数学者が数学者の為にデザインした分だけ優れた表現力をもっている C++で class TEST {int a, b, c}; が Haskellでは Test Int Int Int になって 関数の定義時に add (Test x y z) = z + y + z 関数定義で型指定と値を変数名に拘束して計算する test = Test 1 2 3 add test なんか凄い気がする : デフォルトの名無しさん [sage] 2019/11/05(火) 20:14:52.01:2pF9vl9I Simon Peyton Jonesもなんかよくわからんけど関数型言語カッケーと思ったからやった って言ってるくらいだからそういうのでいいんかもなとは思う。 : デフォルトの名無しさん [sage] 2019/11/05(火) 20:40:52.74:9FWI0Jsd C++17なら、そこそこそれっぽく書けないか? struct Test { int a, b, c; }; auto add(Test t) { auto [x, y, z] = t; return x + y + z; } auto test = Test{ 1, 2, 3 }; add(test); : デフォルトの名無しさん [sage] 2019/11/05(火) 20:47:05.49:9FWI0Jsd おっと、型定義はこっちのほうがそれっぽいか #include <tuple> using Test = std::tuple<int, int, int>; : デフォルトの名無しさん [sage] 2019/11/05(火) 20:58:36.52:CZEUqG6i ええやん : デフォルトの名無しさん [sage] 2019/11/05(火) 21:21:54.18:qlchjqLq C言語のswitchとenumが貧弱だったせいでコールバック地獄が始まったわけだが コールバックの一部を、代数的データ型の場合分けで代替できる 数学者のためのデザインとの指摘はあたらない : デフォルトの名無しさん [sage] 2019/11/06(水) 01:26:55.45:rSRNMbA2 同意します C++の出力コードが速い事も ただ、アルゴリズムとデータ構造を表現する時Haskellのコードがスッキリしてる Haskellで組んだOSの例も : デフォルトの名無しさん [sage] 2019/11/06(水) 11:05:04.05:eV2NmORn haskellで組んだos詳細きぼん : デフォルトの名無しさん [sage] 2019/11/06(水) 18:02:57.62:rSRNMbA2 HaskellでOSを作るプロジェクトがある Haskellそのものがガベージコレクションが必要なLispの構文糖衣的性格があるので 通常のOSはGCを利用するではなく、必要であればGC的メモリー管理もしますな立場 Haskellのそこら辺の拡張を無理やり行ってとりあえず動いてますと言う体裁だそうです LispでOSを作ればシステムの軽さ速度に制限が起きることと同じです 一応これ Haskell OS ttp://programatica.cs.pdx.edu/House/ 見解の元ネタに近いもの Can a operating system be made completely in Haskell? ttps://www.quora.com/Can-a-operating-system-be-made-completely-in-Haskell : デフォルトの名無しさん [sage] 2019/11/06(水) 18:52:46.75:KNNfVqhy そういえば随分以前にLISP専用プロセッサを開発したっていう 大学があったなぁ。 : デフォルトの名無しさん [] 2019/11/06(水) 19:42:19.17:o3tEvZiY 30年くらい前 京大だかなんだか : デフォルトの名無しさん [sage] 2019/11/06(水) 19:49:43.93:hVaPqBLT その成果は同じく遅延評価があるTCLに結実したんですか。 三十年たっていると若者の人生相談にのってあげたりしないといけないですね : デフォルトの名無しさん [] 2019/11/06(水) 22:09:20.32:nryCaCA5 Haskellは世界を救うってセミナーで言ってたけど。 : デフォルトの名無しさん [sage] 2019/11/06(水) 22:15:29.42:8uVcy+F0 救われちゃったら、ハスケルハックしときゃいいのか : デフォルトの名無しさん [] 2019/11/06(水) 22:17:29.04:nryCaCA5 みずほのシステム移行にHaskellが採用されていたなら半年で完了できていたって言ってたよ。 : デフォルトの名無しさん [] 2019/11/06(水) 22:17:52.37:nryCaCA5 コンパイルを通ればバグがないことを保障されるし。 : デフォルトの名無しさん [sage] 2019/11/06(水) 22:36:34.34:E2YfCG0n その手の話よく聞くけど なんで、こうも関数型は人気ないん? F#も人気上は微妙だし : デフォルトの名無しさん [] 2019/11/06(水) 22:41:32.49:nryCaCA5 セミナーでは数学の素養が足りないからだって言ってたけど、僕はもう手遅れなので、次世代に期待してます。 : デフォルトの名無しさん [sage] 2019/11/06(水) 23:00:13.47:E2YfCG0n 数学自体は結構勉強したけど 圏論のよさはよくわかんね ある意味数学の分野で一番かもしれない、圏論のよさが分からんのは 次はホモロジー代数かな 代数幾何は一番時間食ったけど、理解できていないので除外するけど : デフォルトの名無しさん [sage] 2019/11/06(水) 23:27:03.30:Ly3pzzPK さすがにそれは言い過ぎ 単にコンパイラを通せただけだ : デフォルトの名無しさん [sage] 2019/11/07(木) 00:27:07.92:/6vjWhrz パタンマッチの要素不足やらリストの範囲外参照やら STMの糞詰まりやらいろいろ実行時エラーの要素は あるよね : デフォルトの名無しさん [sage] 2019/11/07(木) 00:49:38.56:T7e/rKHL まあ少なくとも、意図した型じゃないのに実行できる上、そのまま実行時に死ぬことすらしない言語よりはよっぽどマシ (ちょうど今、某動的型付言語でハマってキレてた) : デフォルトの名無しさん [sage] 2019/11/07(木) 00:57:14.10:/6vjWhrz w 遅くまでお疲れ様w : デフォルトの名無しさん [sage] 2019/11/07(木) 04:03:06.11:8Vzx7lLq COBOLのソースをHaskellで組んだプログラムで解析して 全体の処理、依存関係資料を作成 それを参考にしつつ java他へ移行じゃなかったけ? 詳細はググってください COBOLのコードはトリッキーな記述はしない素直系だから解析はかどるんちゃう? : デフォルトの名無しさん [sage] 2019/11/07(木) 06:10:19.59:RqdAjhZM 英語読めない人が、英語のよさがわからんというのと同じじゃね あなたが読めるものに誰かが翻訳してくれるのを待つか、 あなたが読めるようになるか 代数幾何なんて圏論で再構築されているから圏論の言葉がわからないと どうしようもないけど、ホモロジー代数まで有用さがわからないというのは 代数が向いてないのか、興味が隔たっているのか微妙なところ : デフォルトの名無しさん [sage] 2019/11/07(木) 06:36:09.91:RqdAjhZM 関数型パラダイムの、ユーザ向けの簡単な部分のいいとこどりは各言語でされているし、 人気もあると思う それを超えて関数型言語に入ろうとすると、面倒くささのほうが勝っちゃうのかも F#は、実行速度が遅かったのも大きいと思う : デフォルトの名無しさん [sage] 2019/11/07(木) 06:48:07.50:OeHLbL3M F#が遅いって適当なこと言ってんな : デフォルトの名無しさん [sage] 2019/11/07(木) 07:46:21.60:XLcDzJj2 RISCとCISCって本当に2方式独立してんのか 圏論って複素解析を婉曲的に表現してんじゃないのか? アイレンバーグは4元数も研究してたしバーコフ息子は流体力学研究してた : デフォルトの名無しさん [sage] 2019/11/07(木) 07:52:29.18:XLcDzJj2 CPUレベルで実は関数型言語に翻訳されてたら 数学的に解析しやすいし高速化も数学的にできるしバグも数学的にとれる という妄想をするんだが 失敗の歴史をウソと考えると : デフォルトの名無しさん [sage] 2019/11/07(木) 09:47:06.79:8Vzx7lLq 現行の半導体プロセッサはスイッチングで起きる0と1状態を基本にして組みあがっている関係で 他の技術(量子関係?)が発達しない限り関数的内部表現うんぬんはLISPが誕生した時点で完了してます テキストベースの文字列を実行可能なコンピュータプログラムに変換する行為は 文字、テキストベースである限りLIPSの構文糖衣と見なせます : デフォルトの名無しさん [sage] 2019/11/07(木) 10:11:56.72:n7hI0M2o カプセル化の恩恵を受けられないからかと Haskell含む関数型はは仕組み上データを分離/隔離できないのでロジックに比重を置きすぎてるきらいがある 一般的にはクラスに任せたい、内容を知らなくても扱える構造が欲しいわけで 関数ドリブンではやはり困る 個人的にはCに逆戻りしてる印象すらあるね : デフォルトの名無しさん [sage] 2019/11/07(木) 11:12:23.51:6eFvSmvg ブライアン・カーニハンもf#の中間言語は 解析しやすいCであるべきだってプロジェクト立ち上げれば 関数型といいつ中身は手続き型でデバッガの資産も使い回せるから 人気でるかもよ。 : デフォルトの名無しさん [sage] 2019/11/07(木) 11:36:14.12:uxj9LdkK Cに逆戻りしている・・・型安全とガベコレがあるCを作ってしまったのか : デフォルトの名無しさん [] 2019/11/07(木) 11:51:10.43:dB1QBGXo ttps://mevius.5ch.net/test/read.cgi/tech/1471841975/ : デフォルトの名無しさん [sage] 2019/11/07(木) 12:41:20.34:y+UtRegG モジュールがあるからカプセル化の恩恵は受けられるのでは : デフォルトの名無しさん [sage] 2019/11/07(木) 14:23:10.73:B1e2KIDS 実装詳細の隠蔽にPatternSynonymsが使えるよ ttp://https://haskell-explained.gitlab.io/blog/posts/2019/08/27/pattern-synonyms/index.html : デフォルトの名無しさん [sage] 2019/11/07(木) 14:56:51.38:n7hI0M2o それはオブジェクトじゃないから目的が違うかもね : デフォルトの名無しさん [sage] 2019/11/07(木) 15:20:12.79:B1e2KIDS でもまさに内容を知らなくても扱える構造だぜ? : デフォルトの名無しさん [sage] 2019/11/07(木) 16:02:50.99:uxj9LdkK カプセル化「継承とポリモーフィズムがやられたようだな・・・」 : デフォルトの名無しさん [sage] 2019/11/07(木) 16:07:19.92:y+UtRegG カプセル化: 抽象データ型、pattern synonym等 継承: クラス継承 ポリモーフィズム: 存在量化によるサブタイピング多相 haskellってストラウストラップの言うOOP言語なのでは : デフォルトの名無しさん [sage] 2019/11/07(木) 18:28:48.58:THHm8pjB 横からですけど、ホモロジー代数の有用性を教えてくれませんか? 何に使えるんです? : デフォルトの名無しさん [sage] 2019/11/07(木) 19:14:04.10:y+UtRegG ホモが寄ってくる : デフォルトの名無しさん [sage] 2019/11/07(木) 19:41:36.65:a+LjUnl5 コホモロジー全般を抽象的に取り扱える。 : デフォルトの名無しさん [] 2019/11/07(木) 21:38:48.71:QQLc3fgk 俺もまだあやふやなんだけどどうも複素解析で積分するとコーシーの積分定理みたいに 純トポロジカルに積分値決まるじゃん どうもモチベーションはそこらへんで 複素平面だと複素解析の教科書みたいに簡単にいけるけど 複素多様体上で線積分しようとするとややこしいからざっくりややこしいところを ホモロジー代数って分科したみたい : デフォルトの名無しさん [sage] 2019/11/07(木) 21:48:30.40:QQLc3fgk ポアンカレから来ているし本当に突き詰めるとたぶん複素解析力学の問題解けるんだと思う : デフォルトの名無しさん [sage] 2019/11/07(木) 22:17:56.72:THHm8pjB 代数幾何の教科書に層とコホモロジーが載ってるけどそのあたりと関係するのかな 難しそうだね : デフォルトの名無しさん [sage] 2019/11/08(金) 02:23:56.93:xHGwPMhN > 圏論って複素解析を婉曲的に表現してんじゃないのか? 的外れにも程がある 層sheafは解析接続の考えを多変数複素関数へと拡張する発想で生まれたものだが 圏は複素解析から出てきたものではない : デフォルトの名無しさん [sage] 2019/11/08(金) 07:14:54.57:vRM9u/Iy エアプ乙 空リストにheadしちゃったらあっと言う間やん : デフォルトの名無しさん [sage] 2019/11/08(金) 07:33:23.28:KkBgvLKM ホモロジー代数の有用性... 代数系の多くの分野の主力ツールなので知らないと入門書を終えた後に代数系で先に進めない くらいには使われています。直接使われていなくてもやってることはホモロジー代数由来の ことがよくあります 古くは、ホモロジー代数の枠組み(コホモロジーなことが多い)で完全列が見つかると 機械な計算だけでいろいろな結果が出てくるというのが強みでしたけど、その後は ホモロジー代数の枠組みにはまらないものを一般化したりして新しい枠組みを作って ホモロジー代数のように扱えるようにしてきて多くの分野が生まれています。 derived categoryやtriangulated categoryもそうですし、環論のquasi-frobenius ring (入門書にある森田の定理の延長)などもこの線 自分で圏や代数構造をつくるのでなければ圏も代数も知らなくていいと思いますけどね : デフォルトの名無しさん [sage] 2019/11/08(金) 10:55:25.73:q9/Fdf+e 有用性について何一つ説明してないw : デフォルトの名無しさん [sage] 2019/11/08(金) 18:27:28.35:vRM9u/Iy Haskellって素晴らしい土台造りの研究に終始して、中々家を建てない印象 : デフォルトの名無しさん [sage] 2019/11/08(金) 18:41:50.96:O4xqpbU0 もう立ててあるんだろ。MSのpower shellも当初はモナドシェルという 名称だったけど無関係だとは思えない : デフォルトの名無しさん [sage] 2019/11/08(金) 19:37:52.83:tNfNofGs 印象と言っているのでは? : デフォルトの名無しさん [sage] 2019/11/08(金) 20:48:21.44:bTjIiHb/ haskellってほんのちょっとしたものにも名前つけなきゃいけなくて困る : デフォルトの名無しさん [sage] 2019/11/08(金) 21:26:54.71:nzoS2I9V 素晴らしい世代別GCの研究はする でも今作ってるアプリは参照カウントで十分 こういうとこだろ : 745 [sage] 2019/11/08(金) 22:49:41.82:FXrQ9F3T なるほど 層とホモロジー代数という本でも現代数学の多くの分野の記述に欠かせない重要な基本言語であると言ってますから そういうことなんでしょうね ありがとうございました : デフォルトの名無しさん [sage] 2019/11/09(土) 01:29:11.95:kdUUP+4v たとえば? : デフォルトの名無しさん [sage] 2019/11/09(土) 17:05:19.55:5gH5tpDv 型シグネチャちゃんと書いとけば、後はポイントフリーにしてお茶を濁して、利用者が命名してねって感じに逃げることも可能 : デフォルトの名無しさん [sage] 2019/11/09(土) 18:32:42.34:y5YvoXPL HKD(Higher Kinded Datatype)ってのはな おまえら例えばコマンドラインツールのオプションとかを扱うとき Options <$> ... <*> ... みたいにしてデータを返すアクションを構築してるだろうけどさ そこの ... 同士に共通性があるわけじゃん。 コマンド引数>環境変数>設定ファイルの優先順位で読み出されたりするじゃん。 でも各フェーズごとの処理をまとめるのはこのままじゃ難しいわけよ ところが方針を変えて、中身と外見がひっくり返ったような data Options_ f = Options _ { verbosity :: f Int, ...} を使うとエントリごとに Nothing にしたり出来るようになって、 Options_ を一般化したやつらが Generic 介しておんなじように舐められるから処理の共通化もできて、 値の合成もしやすく、コンパイラの warning でエントリの処理漏れを検知できて、いいよね。 このパワーアップしたデータみたいなもんを高カインド・データ(HKD)って呼ぶぞって話 : デフォルトの名無しさん [sage] 2019/11/09(土) 18:41:35.48:PlRJlzfP コマンドオプションを無駄に複雑にしないように設計に時間使う方が有意義。 てかオプションごとき糞みたいな複雑な解析いれるくらいならすべて設定ファイルにしろよ。 : デフォルトの名無しさん [sage] 2019/11/09(土) 19:36:35.25:LdPLX9iY なーる。多変数Maybeでコマンドレットか。 getoptにs付けるか付けんかとかいみなかったんや : デフォルトの名無しさん [sage] 2019/11/09(土) 19:49:25.81:LdPLX9iY 首相って数学そんな明るいの? : デフォルトの名無しさん [sage] 2019/11/10(日) 09:53:34.75:UPgh4+Yq オプションを上書きできないと不便だし、 ツールごとにどんなに設計しようと不可避の複雑さは残るだろうさ。 HKD使えば複雑な解析にはならない。 ttp://https://chrispenner.ca/posts/hkd-options ちな Options から Options_ を Generic で作るやつもある ttp://https://github.com/i-am-tom/higgledy : デフォルトの名無しさん [sage] 2019/11/10(日) 20:10:37.56:MbFf7EI6 いや普通に作ってればそんな複雑にはならんわ。。 無理やり用途を探してるってのはわかるけどさ。 : デフォルトの名無しさん [sage] 2019/11/10(日) 21:36:01.67:UPgh4+Yq そうかな。改善前と同等の機能のコードをもっとシンプルに書ける? 個人的にはさらにリッチに、設定値が原因で問題が起きた時「設定ファイル〜のここで定義された値が原因でコケたよ」 くらいのことも言ってくれると嬉しい。HKD に Writer を突っ込んだりすれば出来る。 : デフォルトの名無しさん [sage] 2019/11/14(木) 21:29:15.91:U/F2ohqe ttp://https://www.stepup-school.net/news/detail/728 微分方程式と圏論と量子コンピュータやるっていうけど こういうところで圏論という言葉が出てくるの不思議な感じがする : デフォルトの名無しさん [sage] 2019/11/15(金) 01:56:55.98:m2M4hoVH > こういうところで圏論という言葉が出てくるの不思議な感じがする 圏論は現代の数学を記述するための言語だから、ある程度以上のレベルの数学を教えようとすれば圏論という言葉を学ぶのは避けられない ちょうど、現代では英語という言葉を学んでおかなければ数学や自然科学で重要な研究論文を読んで学ぶことができないようにね : デフォルトの名無しさん [sage] 2019/11/15(金) 06:45:41.36:CTCYdIoU ステマ : デフォルトの名無しさん [sage] 2019/11/15(金) 11:19:15.11:mFhZFK7X だから自由ソフトウェアとか割れとかを宣伝して商品は宣伝しないスタイルがある : デフォルトの名無しさん [sage] 2019/11/15(金) 19:57:11.81:uG++m6MK PostgREST は Haskell のキラーコンテンツになれるか : デフォルトの名無しさん [sage] 2019/11/16(土) 00:01:26.66:TatvE4r/ 結局代数幾何やらずに圏論語っても胡散臭いものにしかならん。 別に代数幾何がすべてとはおもわんが起源ではある。 : デフォルトの名無しさん [sage] 2019/11/16(土) 01:13:46.97:yrgQ+1iB 集合論と集合の圏が胡散臭い だったら射はあっても冪はない圏などを考えれば胡散臭さは軽減される気がする : デフォルトの名無しさん [sage] 2019/11/16(土) 09:25:34.99:0kRbSQZl >射はあっても冪はない圏 集合論を取っ払うなんてことは圏論は望んでねーわ。 馬鹿すぎて話にならん。 : デフォルトの名無しさん [sage] 2019/11/16(土) 11:41:35.91:Zb6iL5XI 馬鹿を取っ払いたい願望があるとはっきり言い切る方が簡潔で良い : デフォルトの名無しさん [sage] 2019/11/17(日) 11:04:47.89:zhdkDGU4 私代数幾何ではありませんが数学科で代数系で圏論バリバリ使ってました。 しかし計算論への圏論の応用という意味ではほとんど役に立ってません。 圏論はその表現力の高さゆえにほとんどの数学に登場します。 しかし逆に言えばその登場の仕方で全く別の顔で出てくるのである一つのジャンルで出てくる圏論を極めても他ではほとんど役に立たなくなる事は多々あると思います。 まだ計算論で出てくる圏論の勉強は始めようとしてるとこなので代数幾何に出てくる圏論がどの程度役に立つかは断言はできませんが、あまり期待はできないと思います。 : デフォルトの名無しさん [] 2019/11/17(日) 11:15:51.64:X9AhIAwA CSに出て来る圏論はフェイク : デフォルトの名無しさん [sage] 2019/11/17(日) 12:27:10.16:zvcjV9Be 型はフェイクではない ○○を応用した成果が型である ゆえに○○はフェイクではない このように「応用」や「成果」の概念がフェイクに加担している : デフォルトの名無しさん [sage] 2019/11/17(日) 20:43:59.01:56xYlt3M > CSに出て来る圏論はフェイク CSとCSでないとの境界は曖昧なわけだが 例えば構成主義的な型理論などはその典型だ 少なくともBart JacobsのCategorical Logic and Type Theoryでの型理論はCSでなく数理論理学で そこで出て来る圏論はフェイクでなく本物だと思うがねえ Lambek & Scott (Phil)とそこで出て来る圏論に関しても同様 だからこそ数学を基礎付ける枠組みとしてのHTT (Homotopical Type Theory)などという考えが出てくるわけで 逆に言えば代数幾何で出て来る圏論は間違いなく本物なのは事実だが数理論理学で出て来る圏論から見ると酷く偏った部分だけだし 逆から見れば数理論理で出て来る圏論は代数幾何の圏論から見れば同様に非常に偏って見える 最近の高階圏や高次元圏の隆盛を見てもわかるとおり圏論の可能性は極めて広く豊かだから 「××で出て来る圏論はフェイク」といった主張はナンセンスだよ ただ、本来、数学を知らずに使えねばならない単なるプログラミング言語に過ぎないのに 「圏論がどうした、モナドがどうした」、といって圏論を勉強しておかないとプログラムを書けないかの如く喧伝するのは フェイクというか一種の羊頭狗肉あるいは虎の威(圏論、あるいは純粋数学という一種の高級ブランド)を借りる狐(プログラミング言語という実用道具)であり 間違った姿勢だとは思うけれどね : デフォルトの名無しさん [sage] 2019/11/17(日) 20:55:22.99:N5iPOVW/ そうそう 多言語との差別化、マウント 選民主義の道具 あるいは原理主義で貫いてますよという言い訳みたいなもの 圏論必須みたいに言うのはバカ : デフォルトの名無しさん [sage] 2019/11/17(日) 21:23:18.02:S3IAhXB4 とはいえほとんどのプログラマが欲しいのはどうせ虎の威だろ。 だからこの業界は何の発展もない。 : デフォルトの名無しさん [sage] 2019/11/17(日) 21:25:48.05:4jNKOHdS 何言ってのこの人 : デフォルトの名無しさん [sage] 2019/11/17(日) 21:55:46.27:N5iPOVW/ そう 僕らは「正しく」後追い根性から抜け出さなければならないと思うよ そこから抜け出せないから日本はIT後進国 : デフォルトの名無しさん [sage] 2019/11/17(日) 22:02:43.05:nzTNCHtX PostgREST は Haskell のキラーコンテンツになれるか : デフォルトの名無しさん [sage] 2019/11/17(日) 22:12:35.26:zvcjV9Be 動的型付け原理主義なら権威もないしダメージもないんだが ノーダメージな選択肢を冷笑して程々のダメージ受けてるやつもそれはそれで難儀な性格だ : デフォルトの名無しさん [sage] 2019/11/17(日) 23:21:11.81:S3IAhXB4 まあ権威が言ってんだからで済ましたり静的チェックしてるから大丈夫とか 言い聞かせる方が地道にベンチマーク取るよりよっぽど楽だからな。 結局はそういうことだろ。 言い訳をしたいんだよ。 : デフォルトの名無しさん [sage] 2019/11/18(月) 07:09:05.16:6/WJcbq2 REST API作るのは他言語でも簡単だし、いまさらRESTっていう気もするし、 これだけで使ってもらうのは無理筋 : デフォルトの名無しさん [] 2019/11/18(月) 11:01:11.35:ahZzeXy3 rubyをいくらdisっても構わないと思うが disるだけじゃ何も産まれないからな : デフォルトの名無しさん [sage] 2019/11/18(月) 19:55:00.90:6QIkNIz7 どこが嫌いかより、どこが好きかで言語を語れよ! : デフォルトの名無しさん [] 2019/11/19(火) 11:11:47.89:8naC8O/U 反日パヨク野党にはほめるところもすきなところも何もないわ : デフォルトの名無しさん [sage] 2019/11/19(火) 13:04:27.10:TS8kcjoi 誰だよそいつは 自分を匿名化するのは別にいいけど敵を匿名にするなよ : デフォルトの名無しさん [sage] 2019/11/19(火) 14:46:28.06:qFuVzVhm >野党 は言語なのか? はじめにことばがあった。ことばは髪とともにあった。 ことばは髪であった。 というくらいだから気になるかしらんが。 : デフォルトの名無しさん [sage] 2019/11/19(火) 20:45:50.91:EAp6ZFS6 何が問題のある機能か語る方がプログラム技術は向上する。 好きなものだけやってるバカは働いてほしくない。 : デフォルトの名無しさん [sage] 2019/11/20(水) 11:22:47.40:9VJHrV5/ 技術自体が目的になることを問題視する風潮なので サイコパスですら手段の目的化には強い罪悪感を持つようだ もはやサイコパスでもなんでもないただの人 : デフォルトの名無しさん [sage] 2019/11/20(水) 11:23:39.17:ADcW+Cyo つまらない : デフォルトの名無しさん [sage] 2019/11/20(水) 13:02:17.44:i01367Jm 東京でのhaskellプログラマの求人だとさ ttp://https://www.reddit.com/r/haskell/comments/dyh4rz/job_purescript_and_haskell_tokyo_or_remote/ : デフォルトの名無しさん [sage] 2019/11/21(木) 20:19:49.90:BfqobOk+ apiサーバー実装としてhaskell結構いけるという話が出てるな。 ちと興味出てきた。 モナドガーとかずっと言ってるバカしかいないのかと思ってたがそうでもないようだ。 : デフォルトの名無しさん [sage] 2019/11/27(水) 15:44:41.54:iuzce+69 よわそう : デフォルトの名無しさん [sage] 2019/11/28(木) 00:39:29.58:W12oiqHO 圏論流行っているのって、人工知能の機械学習の理論のベースが複素多様体(複素ファジー) にあってアルゴリズムに落とし込むにあたってバッチリ実学になるからとかそういう理由から? : デフォルトの名無しさん [sage] 2019/11/28(木) 00:44:08.38:W12oiqHO haskellの真価は機械学習で出るとかそういうやつかな。勝手に納得くっそー。 : デフォルトの名無しさん [sage] 2019/11/28(木) 00:58:23.73:O/IccFcB FRPの金脈は掘り尽くされてみな失望して出て行ったの? Haskellでゲーム作りを通してFRPを学べるみたいな本がLeanpubで書かれてたけど 作者途中で断念しちゃったんだよね : デフォルトの名無しさん [sage] 2019/11/28(木) 00:59:05.39:W12oiqHO ちくしょう。 : デフォルトの名無しさん [sage] 2019/11/28(木) 01:00:13.06:W12oiqHO 慈善事業で地位向上やってたんだろうが。ちくしょう。 : デフォルトの名無しさん [sage] 2019/11/28(木) 01:06:40.27:W12oiqHO くっそ。こんな頭に線繋いで文意の通らないコミュニケーションとれるとか。 公認基地外化してなんてやろうだ。 邪魔するつもりはないが、全国クイズ大会とかいつまでやるつもりだ。 : デフォルトの名無しさん [sage] 2019/11/28(木) 19:49:21.00:mtRfePwe 圏論の流行の理由はそっち方面とは全く関係ない 一つは関数型プログラミング言語の型の体系の理論的基盤である型理論が圏論と直接的な繋がりがあるところから もう一つは実用プログラムとしては避けて通れない例外処理や状態の概念をHaskellのような関数型プログラミングで扱うための理論的基盤としてのモナドから : デフォルトの名無しさん [sage] 2019/11/28(木) 22:20:47.13:8LP6mRiM 関数型言語設計者にとっては重要だとしても、 Haskellを使っている人にはどうでもいい理論ってことか。 >>圏論 : デフォルトの名無しさん [sage] 2019/11/28(木) 22:28:37.21:KJlOY0hh アリアドネーの糸か蜘蛛の糸か。 でもどのみち結論はゼロサムだろう。 : デフォルトの名無しさん [sage] 2019/11/29(金) 10:03:34.54:KypBmx9c arrayパッケージのData.Array.! は配列に O(1) の計算量で参照できるのでしょうか? : デフォルトの名無しさん [sage] 2019/11/29(金) 13:42:47.90:KypBmx9c よく考えたら、IOモナドではないので、O(1)で参照できる配列構造を作れるわけないですね。 質問は無かったことにしてください。 くだらないことでスレを汚してしまい、すいませんでした。 : デフォルトの名無しさん [sage] 2019/11/29(金) 13:57:38.91:BnvrknGG せやろか : デフォルトの名無しさん [sage] 2019/11/29(金) 23:26:58.09:rLKSZgh6 命題 IOモナドではない ⇒ O(1)で参照できる配列構造を作れない を証命せよ : デフォルトの名無しさん [sage] 2019/11/29(金) 23:37:51.77:UeTdOBou 漢字間違ってんぞ : デフォルトの名無しさん [age] 2019/12/01(日) 02:50:14.51:M279qGKp 我々は副作用は使ってないっ!キリッ 完全にクリーンなプログラムを書いているのだ!キリッキリッ : デフォルトの名無しさん [sage] 2019/12/01(日) 12:50:50.29:ZEhocPVE 色々なコホモロジーの同型の証明については圏論は力を発揮するが、 型理論においてはそういう風にも考えられるよね?以上の意味はない。 単なる箔付けだな。 : デフォルトの名無しさん [sage] 2019/12/01(日) 15:15:43.80:3hecj3NX doは単なる構文糖だな それで、Pythonのlambdaの仕様を変える必要がないことが証明されてしまった これだけでも十分大きい : デフォルトの名無しさん [sage] 2019/12/01(日) 15:24:48.19:3P4UY/g+ その話kwsk : デフォルトの名無しさん [sage] 2019/12/01(日) 17:20:16.47:m0gK1jxj 一つの型理論に対するモデルは原理的に様々なモデルがあり得る その様々なモデルをまとめて特徴づけるのには圏論が便利なんだよ いわゆる圏論的モデルだよ 圏論的モデルというのは本来の(数理論理学での)意味での具体的なモデルでなくて 与えられた理論に対するモデル全般が満たすべき性質の圏論による公理化とでも言ったほうが良い感じの代物だからね それと型理論に応じて圏論モデルとしての圏には特有の興味深い構造(例えばデカルト閉圏とかモノイダル閉圏とかね)を持つケースが多い : デフォルトの名無しさん [sage] 2019/12/01(日) 18:31:03.50:XkMP/E25 >圏論的モデルというのは本来の(数理論理学での)意味での具体的なモデルでなくて >与えられた理論に対するモデル全般が満たすべき性質の圏論による公理化とでも言ったほうが良い感じの代物だからね なるほど、数学基礎論の方面をあんま知らんからそういう発想になるわけか。 : デフォルトの名無しさん [sage] 2019/12/01(日) 20:45:57.22:3P4UY/g+ は?ちゃんと言え : デフォルトの名無しさん [sage] 2019/12/01(日) 21:43:32.61:DFWCjLrg いわゆる同型を除いて一意的(up to isomorphism)なモデルなことではないか。 どういうものかはわからんが。 : デフォルトの名無しさん [sage] 2019/12/02(月) 19:35:22.17:+Z2AJKW1 もうよElixirやろうぜElixir Haskellに近いコーディングパターンマッチングも出来るし もう、色々ユルユル 非同期マルチスレッドプログラムで受け手がないのにメッセージ送り捲れる(メール形式なので) 割り当てメモリーを使い切るとエラーで止まるけど(メールボックス満杯) もう、ユルで目からウロコ : デフォルトの名無しさん [sage] 2019/12/02(月) 19:39:36.79:6AEGHd3a メールボックスがオーバーフローしない証明しながらコーディングするんすか? : デフォルトの名無しさん [sage] 2019/12/02(月) 20:11:00.44:+Z2AJKW1 メールボックスだから受け手のプログラムも起動して非同期でメッセージを受け取って メールボックスから消せばOk. 通常はメッセージの送り手スレッドがメールボックスの空き待ちになるだろ メールボックス管理は独立したスレッドで動くんじゃね? とにかくユルイ 僕でも出来たヽ(^o^)丿な感じ : デフォルトの名無しさん [sage] 2019/12/02(月) 20:42:42.47:Y5cjsI9c 完全性定理でググレカス。 : デフォルトの名無しさん [sage] 2019/12/06(金) 04:46:46.01:Nw0PFMDP 話題は? : デフォルトの名無しさん [sage] 2019/12/07(土) 00:50:28.71:mKAqVLXw Nothing : デフォルトの名無しさん [sage] 2019/12/07(土) 02:10:24.53:nHnMq71L ライブラリーのソースコードをレビューしてるWebサイトってありますか? この書き方は秀逸だとか、これは泥臭いとか バージョンアップでのコードの進化を追ったり 英語でも全く構わないのですが : デフォルトの名無しさん [] 2019/12/07(土) 04:27:22.19:AZmQeN3A Windows 10 64bit 上で FFI (ccall) 使って Haskell の関数を呼び出してて 呼ぶ前に hs_init() が必要なのは,なんとなくわかるんだけど hs_exit() の方は,そのあとアプリケーション全体がすぐ終了する場合は 呼ばなくてもいい? Windows が呼び出し元のプロセスも Haskell ランタイムも開放してくれるよね hs_exit() 呼ばなくても。たぶん この辺,わかる人いますか : デフォルトの名無しさん [sage] 2019/12/07(土) 12:36:43.68:ZsYnLuoj プロセス切り離せば? そうでもしないと他言語呼び出しなんて低レイヤーデバッグする覚悟ないとやってられんぞ。 : デフォルトの名無しさん [sage] 2019/12/07(土) 20:22:19.70:JHE2lozm やってられない理由は低級言語でもHaskellでもなくGHC Haskell実装はGHC以外にもいくらでもありえるから : デフォルトの名無しさん [sage] 2019/12/07(土) 21:02:46.11:KFm7FNER Haskellでスマホアプリ作りたいの! : 831 [sage] 2019/12/08(日) 05:30:16.98:9cPQrEyK , なんか GHC の FFI は 入っちゃいけない領域みたいに思えてきたんだがw まぁたしかに,DLL で組み込むよりは別で組んだほうが デバッグは圧倒的に楽だよね (Rust でも DLL 書いてるけど,めちゃくちゃ苦労してる : デフォルトの名無しさん [] 2019/12/10(火) 15:02:27.60:6qyfceqR 計算のキャッシュをしたい。 ある重い計算 heavy :: IO Char があってそれを f,g :: IO () から呼び出す。 一度 heavy が呼び出されて Char が返ってきた後はそれを使いまわしたい。 f で呼び出したなら、その結果の Char を g でも使う。 ただし heavy の実行は f,g のどちらかが呼ばれるまではしたくない。 cachedHeavy = unsafePerformIO heavy とすれば cachedHeavy が利用されたときに一度だけ簡約がおこなわれて、 その時だけ heavy が実行されるので、これを使えば事は足りる。 でもなるべく unsafe は使いたくない。どうすればいいでしょうか。 : デフォルトの名無しさん [] 2019/12/10(火) 15:23:28.41:hI+yeapE 何もしなくても最適化で一回しか使われなくなるんじゃないの haskellはそんなに馬鹿なの? : デフォルトの名無しさん [] 2019/12/10(火) 15:23:58.32:48kVELqA memcached : デフォルトの名無しさん [sage] 2019/12/10(火) 17:01:00.59:6qyfceqR ターミナルからの入力 readLine みたいにキャッシュしたくないときもあって、 上記のような値を普通に呼び出すコードからは、コンパイラは意図を判別できない。 なんぞそれ : デフォルトの名無しさん [sage] 2019/12/11(水) 22:52:31.45:r4LYbsNN -- cached :: IO a -> IO (IO a) main = cached heavy >>= \ cachedHeavy -> 云々 こういうのでいいならunsafePerformIOは不要 : デフォルトの名無しさん [sage] 2019/12/12(木) 11:38:57.75:y6+ig4ik はい。 f,g はトップレベルではなくIOアクションの中で定義しても大丈夫です。 IORefを使わなきゃ無理かな、と思ってたんだけど、これは目から鱗でした。 cached = pure でいいんだよね?単にモナド一枚かぶせるだけで計算のキャッシュになるなんて、 今年一番のオドロキですわ : デフォルトの名無しさん [sage] 2019/12/12(木) 13:37:02.84:9RMznkJC cached = pure ではない IORefを使うのは正しい : デフォルトの名無しさん [sage] 2019/12/12(木) 15:32:55.96:y6+ig4ik うーん指摘の通りだった。 のやり方ではIOアクション cachedHeavy を簡約で実行した時点で heavy が計算される。 f や g の中でそれぞれ実行したなら都度重い計算が走ってしまう。 i <- cachedHeavy をその前に実行するなら一度で済むが、遅延の要件「f,g のどちらかが呼ばれるまではしたくない」 を満たさない。 : デフォルトの名無しさん [sage] 2019/12/12(木) 15:46:44.83:y6+ig4ik つまり… こんな感じでいいのかしら cached :: IO a -> IO (IO a) cached f = do r <- newIORef Nothing pure $ do c <- readIORef r case c of Nothing -> do ts <- f modifyIORef r . const . Just $ ts pure ts Just ts -> pure ts > x <- cached $ print "heavy" >> pure 42 > x "heavy" 42 > x 42 : デフォルトの名無しさん [sage] 2019/12/13(金) 00:08:15.85:0IkxZSMD IORefをご存知でない? : デフォルトの名無しさん [] 2019/12/13(金) 11:45:01.85:Zghtw6X7 間違っているところがあったら、具体的に教えていただきたい。 : デフォルトの名無しさん [] 2019/12/14(土) 10:44:10.58:EaJih9JU cabalファイルの中でexectableで同じcabalファイルの ライブラリー名をbuild-dependsにかいてあるのに そのライブラリーのbuild-depensを全部書かないとコンパイルできない のはなんで?テンプレート使ってるからとかある? : デフォルトの名無しさん [] 2019/12/14(土) 14:55:50.10:EaJih9JU ソースディレクトリをexeとlibに別々にしたら直った なんだこのバグは酷いバグだ : デフォルトの名無しさん [] 2019/12/16(月) 18:39:37.82:fwNQkg00 岡部健 (Ken Okabe)今度はQuoraでもアカウントBANされる ttp://https://link.medium.com/EX3Y4COIs2 : デフォルトの名無しさん [sage] 2019/12/16(月) 19:25:09.38 終わったコンテンツでしょ、彼はもう : デフォルトの名無しさん [sage] 2019/12/17(火) 00:03:50.44:3VYtFLTP オワコン。人間もっとやることある : デフォルトの名無しさん [] 2019/12/17(火) 08:07:51.17:hHVSxQ9g キャッシュ? ttp://https://wandbox.org/permlink/98ZKnQW0uSr5c5CV f () = print "hoge" >> getLine >>= \x -> print "foo" >> return (\() -> x) main = do putStrLn "1234" f () >>= \g -> do let e = g () print e print e : 836 [sage] 2019/12/17(火) 15:16:27.15:zdxsmCDQ たしかに f で行なった計算の結果を g で使えてるけど、俺の求めてたのは さらに g の結果も f で使えることなんです。どっちを先に実行しても計算は一度だけ、を求めてた。 : デフォルトの名無しさん [sage] 2019/12/17(火) 22:59:40.32:nTHXuzTI そもそもライブラリを全てimportする奴はいないので 使わなかったライブラリのコードは最後まで実行されない 全てのライブラリについて使うか使わないか予測できないならば実行の順序は予測できない : デフォルトの名無しさん [sage] 2019/12/18(水) 00:29:20.63:RN3F5ybK ここにいるぜ。まあ可能な限り、ということだけども… 多すぎでリンクできなくてGHCが落ちるのが面白かった。 : デフォルトの名無しさん [sage] 2019/12/18(水) 09:15:25.20:fJHQ6oEy え、岡部健ってQuoraで暴れてたの? アカウント停止はまた癇癪起こして名誉毀損してたとかが理由?? : デフォルトの名無しさん [sage] 2019/12/18(水) 11:17:26.49:RrfoIO3F 彼がなにかしらのコミュニティーでうまくやっていけないのは、これまでの活動からわかりきっている。 むしろ、Quoraではよく持った方だと思うよ。お薬をきちんと服用するようになってるんだろうね。 : デフォルトの名無しさん [sage] 2019/12/18(水) 14:06:51.57:eMsBbOWH あいつか : デフォルトの名無しさん [sage] 2019/12/19(木) 00:31:57.76:MqZ434Qi haskell自体はいいんだけどstackとかhieとかいちいちでかくてめんどくさい 本当にhaskell書いてる人はいるの? : デフォルトの名無しさん [sage] 2019/12/19(木) 07:07:47.77:lwXrm8Zb 依存関係を管理するのは理想 依存関係を消すのが現実 C++やSTLに依存することすら嫌ってCだけで書くみたいな現実 : デフォルトの名無しさん [sage] 2019/12/19(木) 07:48:35.49:gwJfRXBJ hieはもうちょっとなんとかならんのかとは思う : デフォルトの名無しさん [] 2019/12/19(木) 10:21:19.22:+cpLTGtZ Rubyをdisるのは止めれ : デフォルトの名無しさん [sage] 2019/12/19(木) 14:13:07.54:rbd8D3sc 実際にHaskellでコード書いてみると分かるけど コンパイル通れば計算結果は確かに正しいんだけど 巨大なメモリを謎に使うようなバグが混入する事が結構あって その種類のバグってエラー吐かないから特定がめっちゃ難しい。 巨大なプロジェクトでHaskell使うのは現実的には無理だと思う。 : デフォルトの名無しさん [sage] 2019/12/19(木) 14:32:39.93:0ocPbHfL それ haskell で書かれたプログラムのパフォーマンスチューニングむずすぎる : デフォルトの名無しさん [sage] 2019/12/19(木) 14:54:58.39 あればあるだけ使おうとするんでない? 足りなくなってからようやく(これからやる処理に必要最低限の)ガベコレ この繰り返しだから永遠に自転車操業 : デフォルトの名無しさん [sage] 2019/12/19(木) 19:09:11.03:rbd8D3sc この種のバグの混入原因って大抵の場合 ネットに散らばっている'Haskellらしい'記法にあったりするから 初心者の頃に読んだ書き方が 「(実はこの人全然Haskellでコード書いてないじゃんっ!!)」 と気が付くまでワンセット ネット上だと処理が大きくなると破綻するようなサンプルコードばっかりでウンザリする 特に遅延評価を活用するような記法は 大抵メモリ関連のバグの原因になるから実際には避けなきゃダメなのばかり : デフォルトの名無しさん [sage] 2019/12/19(木) 20:23:04.10:l1p3Y60G デフォルトの挙動性格評価にするやつあったよね あれ使ってる? : デフォルトの名無しさん [sage] 2019/12/19(木) 20:49:23.97:lwXrm8Zb ガベコレ言語を全否定してみるのも一つの方法 たとえばスマホが壊れたら全部新品にするかそれとも壊れた部品を特定してそこだけ修理するか : デフォルトの名無しさん [sage] 2019/12/19(木) 20:50:47.99:mvsIV7PX 結局最適化しようとするとコンパイラのくせをしっかり理解してたり 凄まじい技術力がいるという。。 : デフォルトの名無しさん [sage] 2019/12/19(木) 23:44:31.80 つまり Rust の時代か : デフォルトの名無しさん [sage] 2019/12/20(金) 10:00:27.91:lm7vpsLR Rustってhaskellerにも結構評判いいけどどうなの : デフォルトの名無しさん [sage] 2019/12/20(金) 11:16:14.21:MYxSal4F 俺は「あぁ,Haskell でいうアレね」みたいな感じで学べた 厳密な感じが好きなら,気にいるんじゃないのかな ドキュメントも揃っていて学びやすいと思う ただ,俺はいまいち使い所を見いだせてない Haskell で書ける分野なら Haskell で書いちゃうし ちょっとしたツールとかサーバーサイドとかは Go のが楽だし WebAssembly を生成するために使うのが 今一番,Rust の活きる分野な気がする Rust は,クロスコンパイルが楽なので (個人の感想です : デフォルトの名無しさん [sage] 2019/12/20(金) 11:25:55.75:mQBHONqp ただのLisp方言やML方言はもう飽きたってことだろ : デフォルトの名無しさん [sage] 2019/12/20(金) 12:03:56.77:tZwYgFV3 「C言語は純粋関数型」と言ってたのってQuoraの岡部健? : デフォルトの名無しさん [sage] 2019/12/20(金) 21:36:07.96:/W4lQx2e フロントをrustで書くとか一番馬鹿な選択だろ。話にならん。 : デフォルトの名無しさん [] 2019/12/23(月) 17:59:43.65:/flai8cL もしかしてParsecってあんまり使われてない? Parsecのドキュメントが2001年とか古いのしか無くて、最初のサンプルコードすら通らない ライブラリの使い方が解らなくていきなり躓いてる : デフォルトの名無しさん [sage] 2019/12/23(月) 18:29:48.72:B7hjQJ1Z ここの住民、圏論とかの話だと玄人っぽいのにプログラミングの話になると初心者っぽくて謎 : デフォルトの名無しさん [sage] 2019/12/23(月) 20:24:57.43:E1rjr0pL ドキュメントと言うのが何を指しているのか具体的なURLを示してくれないと、 何が原因でどう躓いているのか、助けようにも調べる取っ掛かりが無くて困る。 あと、本当にその古いドキュメントとやらしか学習資料は無いのか? 他にチュートリアルやブログなどは参考にならないのか? : デフォルトの名無しさん [sage] 2019/12/23(月) 20:56:14.64:A/dzNHpI どうせ躓くなら一番最初に躓く初心者っぽい奴の方が運が良い ビギナーズラック 巨大なメモリを使う巨大なプロジェクトの完成直前に躓くのはかなり運が悪い : デフォルトの名無しさん [sage] 2019/12/23(月) 21:51:15.50:pH3djwe1 Parsec の開発は今や"メンテナンスモード"に入っていて、代わりに attoparsec や megaparsec が活発。 ttp://https://haskell.e-bigmoon.com/posts/2019/07-14-megaparsec-tutorial.html : デフォルトの名無しさん [sage] 2019/12/23(月) 21:58:54.38:/flai8cL ここ[parsec: Monadic parser combinators]( ttp://http://hackage.haskell.org/package/parsec) に載ってる これ[Parsec, a fast combinator parser]( ttp://https://web.archive.org/web/20140528151730/http://legacy.cs.uu.nl/daan/download/parsec/parsec.pdf) です 他のは、ついでにParsecに触れているという感じで、詳しそうなのはこれしか見付けられませんでした <続く> : デフォルトの名無しさん [sage] 2019/12/23(月) 21:59:30.49:/flai8cL 最初のサンプルコードをGHCiで打ち込んで試そうとしてるんですが、 Prelude> module Main where Prelude> import Parsec <no location info>: error: Could not find module ‘Parsec’ Perhaps you meant Parser (needs flag -package-key ghc-8.6.5) モジュールが見つからないと言われます 最新バージョンの名前空間?と明らかに違っているので、 ここ[Text.Parsec]( ttp://http://hackage.haskell.org/package/parsec-3.1.14.0/docs/Text-Parsec.html) で、この二行 import Text.Parsec.Prim import Text.Parsec.Combinator を見付け書いたところ Prelude> import Text.Parsec.Prim Prelude Text.Parsec.Prim> import Text.Parsec.Combinator <続く> : デフォルトの名無しさん [sage] 2019/12/23(月) 22:00:22.40:/flai8cL Prelude Text.Parsec.Prim Text.Parsec.Combinator> simple :: Parser Char <interactive>:6:11: error: Not in scope: type constructor or class ‘Parser’ Perhaps you meant one of these: ‘Parsec’ (imported from Text.Parsec.Prim), ‘ParsecT’ (imported from Text.Parsec.Prim) Prelude Text.Parsec.Prim Text.Parsec.Combinator> simple :: Parsec Char <interactive>:7:11: error: ? Expecting two more arguments to ‘Parsec Char’ Expected a type, but ‘Parsec Char’ has kind ‘* -> * -> *’ ? In an expression type signature: Parsec Char In the expression: simple :: Parsec Char In an equation for ‘it’: it = simple :: Parsec Char Prelude Text.Parsec.Prim Text.Parsec.Combinator> simple :: ParsecT Char <interactive>:8:11: error: ? Expecting three more arguments to ‘ParsecT Char’ Expected a type, but ‘ParsecT Char’ has kind ‘* -> (* -> *) -> * -> *’ ? In an expression type signature: ParsecT Char In the expression: simple :: ParsecT Char In an equation for ‘it’: it = simple :: ParsecT Char 引数が足りないみたいなことを言われます 英語も怪しいのに英語の解説も使えないとなるとどうして良いやら… : デフォルトの名無しさん [sage] 2019/12/23(月) 22:04:05.15:pH3djwe1 haskell ide engine って今どんな使用感? そろそろ spacemacs haskell layer (中身 intero) から乗り換えようと思ってんだけど 未だにバージョン 1 未満なのが気になった。まだ待つべきかな。 : デフォルトの名無しさん [sage] 2019/12/23(月) 22:05:51.18:/flai8cL おお、ありがとうございます そっちでやってみます : デフォルトの名無しさん [sage] 2019/12/23(月) 22:07:10.46:wextYSDX クヌースなんかもそんなもんだぞ。 プログラム理論と実装ガツガツやる能力は別物だから。 : デフォルトの名無しさん [sage] 2019/12/23(月) 22:28:25.82:pH3djwe1 >> 883 このエラーメッセージ Not in scope: type constructor or class ‘Parser’ これは Parser が見つからないよ。みたいな意味 検索サイトのフーグルを「パッケージ指定」機能を使って探すと ttp://https://hoogle.haskell.org/?hoogle=Parser%20package%3Aparsec Parser は import Text.Parsec.String すれば使えるってことが解って、 同じように letter の場所も調べられる。 attoparsec や megaparsec にも似たやつあるっぽいから、何となくで読み替えていけばいいんじゃないかな。 : デフォルトの名無しさん [sage] 2019/12/23(月) 23:28:55.39:fuVSP632 > クヌースなんかもそんなもんだぞ。 Knuthはそんなことはないだろ TeXもMetafontも最初のはKnuth自身が実装したのだから > プログラム理論と実装ガツガツやる能力は別物だから。 圏論なんかの知識は実装と全く関係ないからね、そういう方面に明るいのと実装能力とは全く無関係だ : デフォルトの名無しさん [sage] 2019/12/23(月) 23:34:33.07:A/dzNHpI KnuthやLinusって 圏論どころかカプセル化・継承・ポリモーフィズムすら使ってない印象がある 実装能力とは全く無関係だし : デフォルトの名無しさん [sage] 2019/12/24(火) 07:35:31.98:nFH9kbNZ は? そんなの日本の組み込み現場の奴らの大多数と同レベルじゃん : デフォルトの名無しさん [sage] 2019/12/24(火) 08:12:11.27:IDR7+yeu 何をもってknuthにスキルを疑うのか分からんのだけど、彼のプログラミングスキルが ゴミクズな世界があったとしても、scratchから書く問題ならアルゴリズムだけで 他の人より速いもの書いてそう : デフォルトの名無しさん [sage] 2019/12/24(火) 16:43:33.89:Y/zbyQKx すごくタイムリーに reddit に似た質問が上がってるんだが偶然? ttp://https://www.reddit.com/r/haskell/comments/ee6lwy/resources_for_learning_parsec/ : デフォルトの名無しさん [sage] 2019/12/24(火) 21:34:10.54:4c9jV6+e 本人がtex書くまでこれほど大変と思ってなかったいうとるやん。 そのあとの文芸プログラミングとか、cのコード見てても、これあかんなとしか思わんわ。 : デフォルトの名無しさん [sage] 2019/12/27(金) 22:57:25.24:LIBStdaN Getting started with Haskell ttp://https://stackoverflow.com/questions/1012573/getting-started-with-haskell ttp://https://stackoverflow.com/questions/tagged/haskell ttp://https://stackoverflow.com/questions/tagged/functional-programming ttp://https://stackoverflow.com/questions/tagged/monads ttp://https://stackoverflow.com/questions/tagged/category-theory ttp://https://stackoverflow.com/questions/tagged/functor ttp://https://stackoverflow.com/questions/tagged/ghc ttp://https://stackoverflow.com/questions/tagged/ghci ttp://https://stackoverflow.com/questions/tagged/haskell-stack ttp://https://stackoverflow.com/questions/tagged/cabal . . . : デフォルトの名無しさん [] 2019/12/28(土) 23:16:17.55:wvWoDqVP Haskellは小さいプログラムを作るには最適なんだけど 大きいプログラムになるとメモリ周りの最適化が困難なのよね 実行結果自体は正しいからテストすり抜けるだろうし バックエンドで採用しても 本番環境で初めてメモリヤバイと気付いて死ぬ未来しか見えない : デフォルトの名無しさん [sage] 2019/12/29(日) 00:21:25.50:J8aGFBX9 自家用ジェット機と大型旅客機みたいなイメージかな : デフォルトの名無しさん [sage] 2019/12/29(日) 11:10:02.50:09k8oxGS 死ぬことなく成功させた例 ttp://https://serokell.io/blog/top-software-written-in-haskell : デフォルトの名無しさん [sage] 2019/12/29(日) 13:22:56.43:/UuMyPob 最初に上がってたsigmaの記事を発見したぞ ttp://https://engineering.fb.com/security/fighting-spam-with-haskell/ なるほどHaskellを実運用するコツはGHCの魔改造から着手する事なのか ・・・って真似できるかーい!! : デフォルトの名無しさん [] 2019/12/29(日) 15:18:21.26:n6JnyT9E ノリで採用したら地獄を見た感がヒシヒシと伝わってくる記事だね その後facebookでHaskellを採用していない事実で察し ttps://livedoor.blogimg.jp/sag_alt/imgs/7/e/7ece2698.png : デフォルトの名無しさん [sage] 2019/12/29(日) 16:42:39.91:ADVmDYvb 遅延評価を諦めて型システムとパターンマッチ系統だけを よくわからないけどCとかC++辺りに持っていくじゃだめかな : デフォルトの名無しさん [sage] 2019/12/29(日) 22:43:02.62:J8aGFBX9 何を諦めたら最適解になるか? これは愚問 : デフォルトの名無しさん [sage] 2019/12/30(月) 01:49:49.36:zGgGf8ov 赤黒木のコード読んでいたら 関数の定義に型情報があるけど 型推論で処理されるコード部分には型情報がない 目視で定義ーコード部を交互確認すると結構きつい 抽象化には貢献してるけど、人間が読み下すのは大変、オレはコンピュータじゃない(怒 そんな感じ : デフォルトの名無しさん [sage] 2019/12/30(月) 07:02:47.72:gVSpb87m そんなのエディタにやらせればいい : デフォルトの名無しさん [sage] 2019/12/30(月) 09:12:01.80:zGgGf8ov 要件定義が整っている関数の書き下ろしと プログラムで記述されたコードの読み下しは難度が異なる Haskellのコードは情報密度が高い事と抽象度の高さが強烈に効く : デフォルトの名無しさん [sage] 2019/12/30(月) 09:50:40.36:aMPpMkgz Hakellだしコード読めば分かるだろ(コメントなし) ↓数カ月後 俺の書いたコードなのに意味が分からない・・・ : デフォルトの名無しさん [sage] 2019/12/30(月) 10:41:43.52:0IC+e4Ro 工学と名のついた無根拠な宗教が蔓延ってる言語よりは科学してるだけマシ : デフォルトの名無しさん [] 2019/12/30(月) 12:14:13.13:WAqdspci 次の日とか その日のうちでも 意味が分からなくなることがある : デフォルトの名無しさん [sage] 2019/12/30(月) 13:26:36.21:khitn85K 赤黒木は左右対称のコードを2回書かされるから書きたくない コードを読まなくても分かる 読む前から分かることをどれだけ知っているかが重要 読み始めてから努力するのは遅い : デフォルトの名無しさん [sage] 2019/12/30(月) 16:27:15.32:LA/Q6l88 >その後facebookでHaskellを採用していない ttp://https://engineering.fb.com/security/simon-marlow/ : デフォルトの名無しさん [sage] 2019/12/30(月) 20:14:21.30:fOmQS2Mv ttp://https://stackshare.io/haskell : デフォルトの名無しさん [] 2019/12/30(月) 21:52:49.75:rDj24KcK よく読め、受賞は2019年だが 受賞内容は2009年の功績の話だぞ そこで語られてる内容も2014年のGHC魔改造の件の話だし 5年も経過してるのに未だにその話しか出てこないって事はそういう事よ : デフォルトの名無しさん [sage] 2019/12/30(月) 22:25:35.97:khitn85K よく読んだら分かること 読まなくても分かること 普遍的な方を重視するのがいいと思うよ : デフォルトの名無しさん [sage] 2019/12/30(月) 23:48:10.12:LA/Q6l88 枯れてきてるんじゃない? ttp://https://github.com/facebook/Haxl : デフォルトの名無しさん [sage] 2019/12/31(火) 00:12:07.17:Lj+eqMzp ちなみにFacebook自身は2015年の投稿で2年かけて Sigmaの主要技術をHaskellに移行したといっている ttp://https://engineering.fb.com/security/fighting-spam-with-haskell/ スライドもある ttp://http://multicore.doc.ic.ac.uk/iPr0gram/slides/2015-2016/Marlow-fighting-spam.pdf そしてSigma の Software Engineering Manager の公募を最近LinkedInでかけていた 職位はManagerだし応募要件にはHaskellスキル必須とは記載していないようなので Haskellが実用的に使われているっていう傍証にはならないけどプロジェクトは生きてる様子 またその後別の各技術にとってかわられたという情報もなさげ : デフォルトの名無しさん [sage] 2019/12/31(火) 01:50:17.69:Lj+eqMzp 紹介済み? ttp://https://serokell.io/blog/haskell-highlights-2019? : デフォルトの名無しさん [sage] 2019/12/31(火) 02:29:04.76:MpeDYErb ナイス : デフォルトの名無しさん [sage] 2019/12/31(火) 23:30:17.57:a+xjNkxx haskellやってる奴が評価されるのはその手の最適化できることを見込まれてるからだぞ。 : デフォルトの名無しさん [sage] 2020/01/01(水) 04:13:12.99:IaAF7ILo Haskellを始めたばかりの者です do構文は多用しても良いのですか? 手続き型を書いているような気分になります 関数型言語は初めてなので不安です : デフォルトの名無しさん [sage] 2020/01/01(水) 09:08:22.50:msO/HyKq いいよ。モナドは手続きを実現するのに役立つ抽象だよ。 でもアプリカティブで用が足りるならアプリカティブを使うべき。 IO モナドを do で合成するシーンが多いならリファクタリングの余地があるかも。 Control.Monad や Control.Applicative のユーティリティが利用できないか検討してみて : デフォルトの名無しさん [sage] 2020/01/01(水) 09:16:52.80:msO/HyKq =>= 2020年の抱負 =>= ・珠玉本を再開したい。少なくとも二度目の四天王登場回までは行きたい ・Haskell でごはん食べる : デフォルトの名無しさん [sage] 2020/01/01(水) 10:49:49.64:1YmeR5a8 豊富なんてかいちゃって意識高い系かよwwwwww : デフォルトの名無しさん [sage] 2020/01/01(水) 11:24:31.90:msO/HyKq いいでしょw 新年なんだし : 【最底辺】 【25円】 [] 2020/01/01(水) 13:25:14.55:tqBP4ADq Haskellの未来 : デフォルトの名無しさん [sage] 2020/01/01(水) 16:23:17.36:0CkTsEaj 一般化が未来だと仮定すると未来は... : デフォルトの名無しさん [sage] 2020/01/02(木) 06:03:17.61:Ee9Lo0CG 海外にはRemote OKなところあるよ A List of companies that use Haskell ttp://https://github.com/erkmos/haskell-companies : デフォルトの名無しさん [sage] 2020/01/02(木) 07:13:34.68:RghxuQ5t OSS として良さげなツールを作って Github Sponcers で支援を受ける って方針を考えてる。どうかな : デフォルトの名無しさん [sage] 2020/01/02(木) 07:26:54.44:RghxuQ5t 名古屋の時計販売店BIGMOONさん ttp://https://www.e-bigmoon.com ttp://https://haskell.e-bigmoon.com ってお役立ちHaskell 情報がありがたいサイトやん。 中の人、時計屋さんだったのか… : デフォルトの名無しさん [sage] 2020/01/03(金) 13:05:21.13:EVicjzWY Haskellは妙にテクニカルな部分が多い気がする 2変数関数fと1変数関数gを合成するときに g . f ではだめで g .: f where (.:) = (.) (.) (.) って書くのとか良く思いつくなって感じ : デフォルトの名無しさん [sage] 2020/01/03(金) 13:32:58.92:r+r/o5nr それは、ポイントフリーで書いているからテクニカルに見えるたけで、 引数を明記すればビギナーにも理解できる式になるぞ。 やってみれば分かる。 他のもそうだ。 例えばライブラリの作者がポイントフリーで書いているのは、 その方がベテランの作者やコミュニティーにとって読みやすいからだ。 彼らもビギナーを相手に解説する際は、 自分達には多少洗練されていない様に見えても、 ビギナーにとっての読みやすさを優先する。 日本語の文章における「漢字」と「かな」の関係のようなものだ。 : デフォルトの名無しさん [sage] 2020/01/03(金) 13:49:51.60:EVicjzWY (((.) (.) (.)) g f) a b をパパっと g (f a b) に式変形できる自信が無い : デフォルトの名無しさん [sage] 2020/01/03(金) 13:53:52.89:biPe5Zol g . f がだめな理由は型なので fun<A, B> g; fun<C, fun<D, A> > f; このような型を宣言できる任意の言語に同じ問題がある また、他の言語で問題が解決されたらHaskellでも解決できる : デフォルトの名無しさん [sage] 2020/01/03(金) 14:08:31.95:EVicjzWY g :: b -> c f :: a1 -> a2 -> b に対して (.) :: (b -> c) -> (a -> b) -> a -> c の a を a1 -> a2 と解釈してくれれば話が速いんだけどね a1 -> a2 -> b が実際には a1 -> (a2 -> b) で要は(->)が右結合だから駄目なのよね : デフォルトの名無しさん [sage] 2020/01/03(金) 15:06:47.95:r+r/o5nr すまん、そういう話ではない。 「妙にテクニカルな部分が多い」と言うのは、 君の感じたhaskellの不満点や欠点なんだと俺は捉えたが、違うか? 2変数関数と1変数関数とを合成する関数(.:)の「型がまず先」にあって、 (.:) :: (c -> d) -> (a -> b -> c) -> (a -> b -> -> d) これを実装するのに (.:) = (.) (.) (.) と書く者もいて、君に妙にテクニカルだと感じさせるのかもしれないが、 (.:) g f = \a b -> g (f a b) こう書けば、ビギナーにも容易に意味が読みとれる。 テクニカルでは全然ないだろう。 君が妙にテクニカルだと感じる大部分はhaskellの生来のものではなく、 単にビギナーに読めるようにも書けるコードをたまたまテクニカルに書いただけだ。 身の丈や好みに合った書き方をすれば不満に感じることはないだろう、と言いたかった。 : デフォルトの名無しさん [sage] 2020/01/03(金) 15:11:49.96:biPe5Zol 随伴の事か : デフォルトの名無しさん [sage] 2020/01/03(金) 16:07:32.31:EVicjzWY Haskellに不満を持ってるとかではなくて単に凝った式に良く出会うというだけの話よ そして凝った式を同値変形で分かりやすい式に変形するのが難しいことも多いと思う 個人的にはどう実装するかよりもどう同一視するかの方に興味がある : デフォルトの名無しさん [sage] 2020/01/03(金) 16:22:44.44:r+r/o5nr そうだったのか、俺の完全な勘違いだった。 長文でレスの流れぶった切ってすまなかった。 : デフォルトの名無しさん [sage] 2020/01/03(金) 16:34:21.29:EVicjzWY 謝ることは無いよ 自分も言葉足らずだったし 興味深い話が聞けて良かった : デフォルトの名無しさん [sage] 2020/01/03(金) 18:40:52.72:UgBOwnvC 凝った式を書ける俺ってイケてる!っていう中二病の文化なんでしょ : デフォルトの名無しさん [sage] 2020/01/03(金) 21:30:15.19:biPe5Zol また心理の話してる メンタリストの文化なのかな : デフォルトの名無しさん [sage] 2020/01/03(金) 21:54:01.12:jtHjGBI5 リストの1要素を書き換える関数が用意されてないのは、それが非推奨だからなの? 配列みたいな気分では使えないのかな : デフォルトの名無しさん [sage] 2020/01/03(金) 22:42:07.13:biPe5Zol IOが非推奨ではないから まるでIOが非推奨であるかのような関数が用意されていない事に違和感はない : デフォルトの名無しさん [sage] 2020/01/07(火) 17:00:22.12:xmklvGxc 書き換え・・・? Haskellに書き換えという概念がそもそもあったっけ? : デフォルトの名無しさん [sage] 2020/01/07(火) 18:53:28.45:KmM+4rGq 書き換えができるデータ型は定義できる それを定義したモジュールにはその概念がある そのモジュールと概念がHaskellの中にあるのか外にあるのかは知らん : デフォルトの名無しさん [sage] 2020/01/19(日) 01:06:57.37:7oa0iQg0 すみません質問なんですが、 f [5,4,8,7] == [5,(5+4),(5+4+8),(5+4+8+7)] みたいな関数を作りたくて g :: [Int] -> ([Int],[Int]) g (ys) = (ys,[1..length(ys)]) h:: ([Int],[Int]) -> [Int] h (xs, []) = [] h (xs,y:ys) = sum (take y xs) : h(xs,ys) f = h.g と書いたんですけど、これって関数合成以外の方法で書けますか? 出来れば一つの関数で定義したいんですが、行き詰ってます(汗 : デフォルトの名無しさん [sage] 2020/01/19(日) 01:34:42.77:lT5Fy0hi コレはダメ? sumlist [] = [] sumlist (x:xs) = x:(map (+x) $ sumlist xs ) main = do print $ sumlist [5,4,8,7] print $ take 10 $ [1..] ----- [5,9,17,24] [1,2,3,4,5,6,7,8,9,10] : デフォルトの名無しさん [sage] 2020/01/19(日) 01:37:22.32:lT5Fy0hi 間違った sumlist [] =[] sumlist (x:xs) = x:(map (+x) $ sumlist xs ) main = do print $ sumlist [5,4,8,7] print $ take 10 $ sumlist [1..] ---- [5,9,17,24] [1,3,6,10,15,21,28,36,45,55 : デフォルトの名無しさん [sage] 2020/01/19(日) 04:12:57.56:E4qdczJe import Data.List (inits) : デフォルトの名無しさん [sage] 2020/01/19(日) 08:14:33.78:to1IOlmG Data.List.scanl1 (+) [5, 4, 8, 7] == [5, 9, 17, 24] : デフォルトの名無しさん [sage] 2020/01/19(日) 09:55:55.71:JUDuINU+ やるじゃん : デフォルトの名無しさん [sage] 2020/01/19(日) 10:18:10.08:6mEdluRX おお、そんなのがあるのか。、 : デフォルトの名無しさん [sage] 2020/01/19(日) 18:10:44.86:7oa0iQg0 944です。返信が遅れてしまってすみません。 .947-948 さん早速の返答ありがとうございました。 : デフォルトの名無しさん [sage] 2020/01/19(日) 22:57:51.59:JsYzYAKP 4.7. GHCi commands ttp://https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/ghci.html#ghci-commands Prelude>:? Prelude>:browse Data.List scanl :: (b -> a -> b) -> b -> [a] -> [b] GHC.List.scanl' :: (b -> a -> b) -> b -> [a] -> [b] scanl1 :: (a -> a -> a) -> [a] -> [a] scanr :: (a -> b -> b) -> b -> [a] -> [b] scanr1 :: (a -> a -> a) -> [a] -> [a] : デフォルトの名無しさん [] 2020/01/20(月) 00:41:52.39:TXkt06UM Haskellの事を知れば知る程(圏論含む)、数学ってプログラミング言語だなと思う。 コンピュータが登場する遥か以前からあるプログラミング言語。 そうなると数学者はある種のプログラマーと言える。 ただ、数学はコンピュータに計算させるのではなく、自分で計算するから再帰みたいなループ構造は面倒臭い。 そこでループ構造を排除するアルゴリズム(法則や公式)を考え出して来たと考えられる節があって…。 そう考えると、コンピュータの登場で人間の効率的なアルゴリズムを考える能力が退化したかも知れん。 とか、考えてみたり。 : デフォルトの名無しさん [] 2020/01/20(月) 13:04:34.99:0GX6odYx ΣとかΠは実質ループだが数学ではループしないで計算出来る : デフォルトの名無しさん [sage] 2020/01/20(月) 18:51:38.56:9eVX0YAp 無理数や積分はほとんど計算してない C++のtemplate実体化してないメタプログラミングと同じ : デフォルトの名無しさん [sage] 2020/01/20(月) 19:20:02.11:h2nRkU1r カリーハワード対応しらんのか? : デフォルトの名無しさん [sage] 2020/01/20(月) 19:35:03.18:LcZgWv4y 普段のプログラミングでカリーハワード対応が出てくる場面ってどういうとき? 型レベルで凝ったことをするとプログラムを証明として書くことがあると思うんだけど、 その証明として書いたプログラムは実行するとどうなるの? この辺少し勉強したいんだが書いたことも見たこともなくてさっぱり想像つかない : デフォルトの名無しさん [sage] 2020/01/20(月) 20:28:12.96:9eVX0YAp C++のデザインパターンとHaskellの代数的データ型の同型対応 : デフォルトの名無しさん [] 2020/01/21(火) 08:51:19.90:lxIBo8y+ 数式の末尾再帰なfib関数を見た時、手続き型言語で書く副作用バリバリのfib関数との共通点が見えた。 (過去どこかに本の中身の画像落としたんだが、まだあるかは知らん) そこで一つの仮説が浮かんだ。 入出力を伴わない関数であれば、副作用のある関数でも正しく動く関数は数式と相互に変換出来るのでは? (入出力も含めるなら、相互にHaskellと変換出来る?逆に、バグがあるなら相互変換は無理?) 数学専門じゃないから、証明とか出来ないけども。 : デフォルトの名無しさん [sage] 2020/01/21(火) 09:00:45.96:Hkcle0K4 人に伝える努力をして欲しい ポエムいらない : デフォルトの名無しさん [sage] 2020/01/21(火) 11:28:06.62:d/fzPC0C 何か知りたいことがあるのか? 需要がないところを努力するのは意味不明だし、努力して欲しいと言うのも意味不明 : デフォルトの名無しさん [sage] 2020/01/21(火) 11:52:36.21:m86EWX9f 数学だけだなく国語力もないのな 努力といわれてバカにされてることに気付かない : デフォルトの名無しさん [sage] 2020/01/21(火) 13:47:51.38:L/RpGA77 ST で検索 : デフォルトの名無しさん [sage] 2020/01/21(火) 17:55:02.99:sFJRAv+Q 表示的意味論の話かな
凡例:
レス番
100 (赤) → 2つ以上レスが付いている
100 (紫) → 1つ以上レスが付いている
名前
名無しさん (青) → sage のレス
名無しさん (緑) → age のレス
ID
ID:xxxxxxx (赤) → 発言が3つ以上のID
ID:xxxxxxx (青) → 発言が2つ以上のID
このページは2ch勢いランキング が作成したアーカイブです。削除についてはこちら 。