関数型プログラミング言語Haskell Part29 [転載禁止]©5ch.io
レス数が1000を超えています。これ以上書き込みはできません。
0001岡部メモリリーク健
2015/07/14(火) 19:27:09.01ID:jJ1YDtNe,.-―: ̄`ー::::::::::、
/::::::::::::.::::::::::::::::::::::::::::`::、、
/::::::::::::::::::::::::::::::::::::::::::::::::::::::`、
l::::::::::::::::::::::::::::::::::::::::;':l:::::::::::\::l
l:::::::::::::::::::::::::::::::::,,::::::::;-,:,::::::::::::::::l
l::::::::::::::::,_,.::::,';::::::;:::::: :: l ::::::::::::::l
l::::::::::/-/:::/-ニ,.::::/=,./::::::::::l
ヽ:::: ´、ひ> ;: l .<ひ>' 、::::::::/
ヽ:::::  ̄ .)::; l  ̄ l::::/ < 毛の壁(岡部健)の話は禁止な
、:::::.. /:::; .,-、 l:::/、
,―:::::::: ゝヽ- ー' 、 l::/,、ヽ
l,、,、,,:、:: / ,--、,-.、_ l /::::::,、,、l
l,、,、,、,、,、::、 `ー ̄-' /:::::::::::,、,、l
l,、,、,、,、,、,、::ヽ /::::::::、,、,、,、,ノ:\
haskell.org (公式サイト)
http://www.haskell.org/
前スレ
関数型プログラミング言語Haskell Part28
http://peace.2ch.net/test/read.cgi/tech/1428535861/
0002岡部メモリリーク健
2015/07/14(火) 19:28:16.17ID:jJ1YDtNe(英語)
Haskell - Wikibooks, open books for an open world (ページ内に内容をまとめたPDFあり)
http://en.wikibooks.org/wiki/Haskell
Learn You a Haskell for Great Good! (『すごいHaskellたのしく学ぼう!』の無料オンライン版)
http://learnyouahaskell.com/chapters
Real World Haskell (同名書籍の無料オンライン版)
http://book.realworldhaskell.org/read/
(以下、日本語)
Haskell入門 5ステップ - HaskellWiki (公式サイト内、日本語入門セクション)
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の日本語版。未編集の項目、多)
http://ja.wikibooks.org/wiki/Haskell
Programming in Haskell
http://www.sampou.org/cgi-bin/haskell.cgi
Haskell のお勉強
http://www.shido.info/hs/
Haskell Programming
http://www.geocities.jp/m_hiroi/func/haskell.html
本物のプログラマはHaskellを使う:ITpro
http://itpro.nikkeibp.co.jp/article/COLUMN/20060915/248215/
[入門]関数プログラミング―質の高いコードをすばやく直感的に書ける!
http://gihyo.jp/dev/feature/01/functional-prog
0003岡部メモリリーク健
2015/07/14(火) 19:30:31.82ID:jJ1YDtNe27) http://peace.2ch.net/test/read.cgi/tech/1420718555/
26) http://peace.2ch.net/test/read.cgi/tech/1406436392/
25) http://peace.2ch.net/test/read.cgi/tech/1393313450/
24) http://toro.2ch.net/test/read.cgi/tech/1382705669/
23) http://toro.2ch.net/test/read.cgi/tech/1376111807/
22) http://toro.2ch.net/test/read.cgi/tech/1364009659/
21) http://toro.2ch.net/test/read.cgi/tech/1358702176/
0004岡部メモリリーク健
2015/07/14(火) 19:31:05.70ID:jJ1YDtNe19) http://toro.2ch.net/test/read.cgi/tech/1340760070/
18) http://toro.2ch.net/test/read.cgi/tech/1331902463/
17) http://toro.2ch.net/test/read.cgi/tech/1325510368/
16) http://toro.2ch.net/test/read.cgi/tech/1317958045/
15) http://hibari.2ch.net/test/read.cgi/tech/1310199414/
14) http://hibari.2ch.net/test/read.cgi/tech/1299385928/
13) http://hibari.2ch.net/test/read.cgi/tech/1286706874/
12) http://hibari.2ch.net/test/read.cgi/tech/1272536128/
11) http://pc12.2ch.net/test/read.cgi/tech/1252382593/
10) http://pc12.2ch.net/test/read.cgi/tech/1231861873/
09) http://pc11.2ch.net/test/read.cgi/tech/1211010089/
08) http://pc11.2ch.net/test/read.cgi/tech/1193743693/
07) http://pc11.2ch.net/test/read.cgi/tech/1174211797/
06) http://pc11.2ch.net/test/read.cgi/tech/1162902266/
05) http://pc8.2ch.net/test/read.cgi/tech/1149263630/
04) http://pc8.2ch.net/test/read.cgi/tech/1140717775/
03) http://pc8.2ch.net/test/read.cgi/tech/1076418993/
02) http://pc2.2ch.net/test/read.cgi/tech/1013846140/
01) http://pc.2ch.net/tech/kako/996/996131288.html
0005デフォルトの名無しさん
2015/07/14(火) 20:28:01.97ID:0RtCvlur「児童ポルノ単純所持で捕まったら無罪だったとしても社会的に終わるぞ」
という脅し文句を連呼してる人がいる
確か日本IBM会長が痴漢で捕まった時に騒いでたの2chの一部だけで
本当に痴漢で捕まったと思ってる人がほとんどいなかった記憶あるのだが
0006デフォルトの名無しさん
2015/07/14(火) 21:11:22.75ID:i6nYqHOghttp://judge.u-aizu.ac.jp/onlinejudge/index.jsp
Haskellで書けるようになった
0007デフォルトの名無しさん
2015/07/14(火) 21:59:12.35ID:rJOXcg+aうおおお!!朗報だありがとう!!!
0008デフォルトの名無しさん
2015/07/14(火) 22:54:43.45ID:zZLZaIbg0009デフォルトの名無しさん
2015/07/14(火) 23:45:50.85ID:9bHYU59Eうおおお!やったぜ。
0010デフォルトの名無しさん
2015/07/15(水) 08:14:27.60ID:4Hwk0PWMそのことは海外のサイト見れば明らか。権威のある人物ならみんな知ってる
0011デフォルトの名無しさん
2015/07/15(水) 10:03:03.19ID:YlUThGkUそれはわからんのよ。
バイオコンピュータによって可能になるかもしれんしな。
ただ、今目の前にあるのはバイオコンピュータではないってことが大事なんだろうな。
バイオコンピュータが目の前に来てからHaskellを使おうと考えるのが普通の人だわな。
まあその時には、Haskellは無くなってるだろけどな。
0012デフォルトの名無しさん
2015/07/15(水) 10:12:30.07ID:7IHYvImg0013デフォルトの名無しさん
2015/07/15(水) 10:14:47.29ID:FLOJGmtqhttps://www.haskell.org/tutorial/functions.html
A Gentle Introduction to Haskell(やさしいHaskell入門)
"The well-known map function"(よく知られたmap関数)
map :: (a->b) -> [a] -> [b]
map f [] = []
map f (x:xs) = f x : map f xs
基本中の基本です。
0014デフォルトの名無しさん
2015/07/15(水) 12:17:03.32ID:xvlXRMczhttp://hello.2ch.net/test/read.cgi/joke/1436928203/
0015デフォルトの名無しさん
2015/07/15(水) 12:19:15.92ID:K1aSLVoRもう許してやれよ
0016デフォルトの名無しさん
2015/07/15(水) 15:43:52.14ID:D9jiOfI+http://qiita.com/nonstarter/items/2763f5d85f2b8df3b18b#comment-7d7a978d53ad17b911c5
今度の名前はqiitapostの模様
0017デフォルトの名無しさん
2015/07/15(水) 15:53:29.88ID:LpfZNZ910018デフォルトの名無しさん
2015/07/15(水) 19:19:40.86ID:UBeVoT4I0019デフォルトの名無しさん
2015/07/15(水) 22:55:42.93ID:d/UN4JRsこんなスレ、僕は認めないからな
0020デフォルトの名無しさん
2015/07/16(木) 04:10:56.66ID:KHTiVbh0/::::::::::::.::::::::::::::::::::::::::::`::、、
/::::::::::::::::::::::::::::::::::::::::::::::::::::::`、
l::::::::::::::::::::::::::::::::::::::::;':l:::::::::::\::l
l:::::::::::::::::::::::::::::::::,,::::::::;-,:,::::::::::::::::l
l::::::::::::::::,_,.::::,';::::::;:::::: :: l ::::::::::::::l
l::::::::::/-/:::/-ニ,.::::/=,./::::::::::l
ヽ:::: ´、ひ> ;: l .<ひ>' 、::::::::/
ヽ:::::  ̄ .)::; l  ̄ l::::/
、:::::.. /:::; .,-、 l:::/、
,―:::::::: ゝヽ- ー' 、 l::/,、ヽ
l,、,、,,:、:: / ,--、,-.、_ l /::::::,、,、l
l,、,、,、,、,、::、 `ー ̄-' /:::::::::::,、,、l
l,、,、,、,、,、,、::ヽ /::::::::、,、,、,、,ノ:\
こんにちは。
私は現在、関数型プログラミングを勉強している者で、まさにこちらのスレで批評されている書籍を読んで、思考を切り替えるためのコツを分かり易く学べたと考えている者です。
様々な視点から学び、理解を深めたいと考えており、こちらのスレも目を通し、関心を持って注目しております。
0021デフォルトの名無しさん
2015/07/16(木) 18:10:05.00ID:GJpPkx9w0022デフォルトの名無しさん
2015/07/16(木) 20:22:23.87ID:r83nWszG0023デフォルトの名無しさん
2015/07/17(金) 09:35:07.66ID:tmwhQ/Tf0024デフォルトの名無しさん
2015/07/17(金) 10:24:36.36ID:F5MI8UaQ0025デフォルトの名無しさん
2015/07/17(金) 10:36:26.09ID:MFPhKAxgclass Monad m where
(>>=) :: m a -> (a -> m b) -> m b
return :: a -> m a
っていう関数が定義されていてモナド則を満たすもの
0026デフォルトの名無しさん
2015/07/17(金) 11:26:02.98ID:6p5xRLuMなるほど
やっぱり岡部健の間違いか。
0027デフォルトの名無しさん
2015/07/17(金) 13:59:02.04ID:ZQ7d1iCZ0028デフォルトの名無しさん
2015/07/17(金) 18:24:18.12ID:xMYrjQca一言で言うとなんなん?言うてるやん
それともほんとは分かってないから言えないとか?
0029デフォルトの名無しさん
2015/07/17(金) 20:05:48.09ID:OMUEmUCh0030デフォルトの名無しさん
2015/07/17(金) 22:36:24.63ID:5l1JDgrx「一言」って、どれくらいの長さまで認めてくれるの?
0031デフォルトの名無しさん
2015/07/17(金) 23:01:29.55ID:MFPhKAxg自己関手の圏におけるモノイド対象
0032デフォルトの名無しさん
2015/07/18(土) 00:36:23.29ID:74tlor8C順次、反復、分岐のうち分岐を可能にする構造[1]
という説明であれば一般的なプログラマは理解できるはず
[1] http://d.hatena.ne.jp/kazu-yamamoto/20150128/1422413182
0033デフォルトの名無しさん
2015/07/18(土) 03:20:25.11ID:uyPUGWQb一言でいっちゃうと必ず嘘を含むので言葉尻をとらえる重箱の隅をつつく言葉遊び勢を気にしておいそれと一言で言えないんだよ
だから一言で言って欲しいなら、『厳密でなく細かな間違いを含んだ私見でいいので、大雑把で直感的に言い直すとどんな風にとらえておけば当たらずとも遠からずですか?』って訊けよな
0034デフォルトの名無しさん
2015/07/18(土) 03:26:05.93ID:gfB+6PlWその説明、ずっと分からなかったんだけど、反復を実現するのはApplicativeなの?
単に関数を再帰的に定義すればいいんじゃないの?
0035デフォルトの名無しさん
2015/07/18(土) 09:51:48.04ID:H0ZPg8aJ>>32
そうそうこういうのがいいんだが、
モナドって、命令型でふつうにできてることを関数型の中でもやりたいってことでOK?
そうすると、IOはいいけどMaybeやListが置いてけぼりになるんじゃないの?
0036デフォルトの名無しさん
2015/07/18(土) 11:55:58.35ID:wQVOOXnd他のモナドだと直感的に「分岐」とはみなせないような例もあるかもしれないけど
そのモナドなりの意味で分岐を解釈できるはず
Functorを箱とみなすか文脈とみなすかみたいな話と同じで
一言で言おうとしたときに具体例を選べばどうしたって他で無理のある解釈が出てくるわけで
そこを突っ込みたかったら結局「定義にもどれ」ということになる
0037デフォルトの名無しさん
2015/07/18(土) 12:31:05.33ID:H0ZPg8aJああそう、やっぱり>>32はあくまで初心者向けの通俗的解釈に過ぎないわけね。
また振り出しにもどったわw
> そこを突っ込みたかったら結局「定義にもどれ」ということになる
突っ込みたいわけじゃないんだが。。。
「定義にもどれ」ってのは、一見もっともに聞こえるがダメダメよw
「なんでそんな定義なの?」というのが大事なわけで。
それに定義というなら、『Monad は、単なる型クラスの一つで、それ以上でも
それ以下でもありません』でほんとおしまいなんだし
0038デフォルトの名無しさん
2015/07/18(土) 12:36:02.25ID:v0EKlLM2以降、スルーでよろしくおながいします
0039デフォルトの名無しさん
2015/07/18(土) 13:51:37.96ID:0Oe5sxAPStateTとIOの複合は頻出っぽいから頑張って身につけたい
なにか参考になるサンプルとかないでしょうか
0040デフォルトの名無しさん
2015/07/18(土) 14:56:48.04ID:BTDuC5lZこれはどちらが正しいんだ?
0042デフォルトの名無しさん
2015/07/18(土) 19:49:11.57ID:sxZpdZw2ちゃんと見て無いけど、
どっちもどっちな感じ…
0043デフォルトの名無しさん
2015/07/18(土) 20:30:55.47ID:8uXNBMZf>状態を完全にリセットしてしまうか、ライブラリの実装の内部に立ち入らない限り、書けません。
>(これはworldcomponentが、unmountされたコンポーネントに対してもforceUpdateを呼び出してしまうせいなので、
>通常のライブラリであれば、そのような問題はありません。なお、基本的再確認ですが、
>Facebook Reactの公式マニュアル https://facebook.github.io/react/docs/component-api.html には "Normally you should try to avoid all uses of forceUpdate()"
>すなわち「通常はforceUpdate()のいかなる使用も避けるべきである」とあります。)
どう考えてもkenokabeのコードが悪いと思うが。
0044デフォルトの名無しさん
2015/07/18(土) 21:59:10.40ID:+ygt6sr1うんじゃぁ これも通俗的な話だけど
(>>=) :: m a -> (a -> m b) -> m b
って関数が凄い便利なんだよ scalaだとflatMapなんていったりするけど
monadの力って (>>=) って関数が定義されてる mっていうデータ構造(文脈だの箱だの言われるが)
これをhaskellは副作用を扱うのに使ってるけど
副作用を普通に扱える言語でもmaybeやfutureみたいにエラー時の処理や非同期計算に便利なんだ
もちろん上は全然正確な話ではない
0045デフォルトの名無しさん
2015/07/18(土) 22:45:41.76ID:obUySxxZこれに関してはメモリリークの件でコード改竄を指摘されて
「お前らだってコード改竄してるじゃないか!」
って言いたいんだろうなぁと思う。
事実関係よりも心の平安を保てるかどうかで発言してるっぽいし。
0046デフォルトの名無しさん
2015/07/19(日) 00:11:41.45ID:g7CK7gj2print "Hello"
これをghc hello.hsすると生成された実行ファイルのサイズが1MB超えるんですが
こんなものですか?
もっと大量のコードが書けるほどのレベルではないんですが、500行ぐらい書いたらサイズが1GB言っちゃうんじゃないかと心配になりました
0047デフォルトの名無しさん
2015/07/19(日) 00:36:25.80ID:Nq0FmX+u0048デフォルトの名無しさん
2015/07/19(日) 01:43:02.12ID:csGsF3Kw0049デフォルトの名無しさん
2015/07/19(日) 07:26:20.64ID:au0Vcvujjhcを使うとランタイムがないぶんそれだけ小さくなるというのを
岡部究(master_q)さんが一時期熱心に調べてたな。
0050デフォルトの名無しさん
2015/07/19(日) 08:05:11.94ID:BgJ/88od一面を捉えた正確な説明だと思いますよ。
0051デフォルトの名無しさん
2015/07/19(日) 10:16:27.53ID:ZQ+VxBJa> (>>=) :: m a -> (a -> m b) -> m b
うん、これは、たしかに
(a -> b) -> (m a -> mb)
m(a -> b) -> (ma -> mb)
に比べるとやや崩れているところな。そこが人間にとっていいってことか?
だが、IOからMaybeや非決定性まであまりに無節操に広く適用されるところが、
かえって、実はナンセンスなんじゃないの?と思ってしまうな
0052デフォルトの名無しさん
2015/07/19(日) 10:57:36.17ID:XE+dCI5P0053デフォルトの名無しさん
2015/07/19(日) 13:47:54.47ID:I4MCl2HA0054デフォルトの名無しさん
2015/07/19(日) 15:46:09.62ID:I1Wicbx/0055デフォルトの名無しさん
2015/07/19(日) 16:48:46.04ID:OqblcV5wまず最初に、モナドと全く関係のない言語が、副作用を無節操に広く適用した
そうして無節操に広がったIOの適用範囲の一部をIOではなくMaybe等で書き直している
Maybeが広くなった分だけIOが狭くなるのでモナド全体の広さは変わらない
0056デフォルトの名無しさん
2015/07/19(日) 17:14:36.93ID:kvcDaKH1QtでもさすがにHello出力だけで1MB超えは無い。
0057デフォルトの名無しさん
2015/07/19(日) 18:26:20.48ID:ZQ+VxBJa> まず最初に、・・・副作用を無節操に広く適用した
> IOの適用範囲の一部をIOではなくMaybe等で書き直している
> Maybeが広くなった分だけIOが狭くなる
上の3行の一つ一つが意味分からん。
もう少し補足してくれんか
0058デフォルトの名無しさん
2015/07/19(日) 19:00:07.54ID:OqblcV5w分からんなら後回しにして比較的分かりやすいところを先に解決すればいいと思う
分からんところに拘るのは効率が悪い
0059デフォルトの名無しさん
2015/07/19(日) 19:13:47.34ID:ZQ+VxBJa例えば教科書に出てくるなにかの概念が分からんというようなことじゃなて、
あなたが>>55に書いている文が、あれじゃ意味不明と言ってるんだが。
副作用を無節操に広く適用ってどういうこと?
そしてIOとMaybeしか出てこんがモナドはこの二つだけじゃないし
0060デフォルトの名無しさん
2015/07/19(日) 19:32:23.42ID:OqblcV5w対案を出せばいいと思う
0061デフォルトの名無しさん
2015/07/19(日) 21:26:06.98ID:BgJ/88odそれについてはすごいHaskell に平易な解説があったと思う。
要するに>>= があるおかげで、 モナドから取り出した値を見て、次に行う副作用を作れるってことだ。
0062デフォルトの名無しさん
2015/07/19(日) 23:30:44.39ID:ZQ+VxBJa対案出せと言われましても意味分からんからできません、なんよw わからへん?
>>61
> 要するに>>= があるおかげで、 モナドから取り出した値を見て、次に行う副作用を作れる
それって、 (>>=) :: m a -> (a -> m b) -> m b 言うてるだけやし
0063デフォルトの名無しさん
2015/07/19(日) 23:34:09.77ID:bed99W+wapplicative使ったほうがいいよって言われてね?
0064デフォルトの名無しさん
2015/07/20(月) 00:20:18.66ID:0TG+/+/W0065デフォルトの名無しさん
2015/07/20(月) 00:27:41.08ID:wg3sT89+取り出すところまでは同じだが、取り出した後でできることが違う
m a -> (a -> b) -> m b
m a -> (a -> m b) -> m b
-- 超えられない壁 --
m a -> (a -> b) -> b
0066デフォルトの名無しさん
2015/07/20(月) 02:08:57.73ID:u/oPh9jr>>63
mapでできることをfoldや再帰でやらないってのと同じ発想だね
0067デフォルトの名無しさん
2015/07/20(月) 09:29:20.00ID:c+ACSEXZ箱やコンテナもそうだがそういう物理的比喩は所詮本物じゃない
>>65
超えられないのか?
0068デフォルトの名無しさん
2015/07/20(月) 09:57:42.74ID:wg3sT89+IOが超えられない
モナドクラスというのはIOと同じクラスになりたいやつが集まってるから
0069デフォルトの名無しさん
2015/07/20(月) 21:32:15.43ID:tLpP/4eqderiving (Eq, Show)
という型があるとします。
型構成子で包まれているリストを取得するにはどうしたらよいでしょうか?
getData :: DataType -> a
getData (DataI a) =a
getData (DataF a) =a
getData (DataD a) =a
getData _ = error "no"
とやってもうまく取り出せません。。
0070デフォルトの名無しさん
2015/07/20(月) 21:52:25.58ID:WnNA5LDR0071デフォルトの名無しさん
2015/07/20(月) 22:03:47.04ID:l2CykBu3まさかとは思うが kenokabe先生(a.k.a qiitapost, chimetorch) は React.js を使いさえすればプログラムが FRP になると考えているのだろうか。
https://twitter.com/bolero_MURAKAMI/status/623057115456733184
007269
2015/07/20(月) 22:10:25.52ID:tLpP/4eq関数のオーバーロードみたいの使ってできるようにないませんかね??
0073デフォルトの名無しさん
2015/07/20(月) 22:56:29.03ID:XuKvM2I+それに対応するfmap, ap, bind が揃っているだけ。
だが、その代数データ型の値をデータコンストラクタで出来上がった
構文木と見ると、代数データ型がBNFみたいに見えてくるはずだ。
そのBNFが表現する言語に、まさにfmap, ap, bindが制御構造を
もたらすものとして理解できる。
これが「モナドがDSLフレームワーク」ということの意味。
0074デフォルトの名無しさん
2015/07/20(月) 23:06:18.94ID:XuKvM2I+>getData :: DataType -> a
なんでこの型付けがおかしいかわかれば
getDataが作れないことの諦めがつくよ。
0075デフォルトの名無しさん
2015/07/20(月) 23:52:10.07ID:WnNA5LDRHaskellに関数のオーバーロードはない
型クラスを変に絡めればあるにはあるけど
どういう状況を想定してその関数がほしいと思ったのかを教えてもらえれば、アドバイスできるかもしれない
基本的にHaskellではそういう関数を必要とすることはないはず
0076デフォルトの名無しさん
2015/07/21(火) 00:28:11.79ID:2lFdT9I+class IorForD a where {getData :: DataType -> [a]}
instance IorForD Int where {getData (DataI xs) = xs; getData _ = error "no"}
instance IorForD Float where {getData (DataF xs) = xs; getData _ = error "no"}
instance IorForD Double where {getData (DataD xs) = xs; getData _ = error "no"}
0077デフォルトの名無しさん
2015/07/21(火) 00:39:13.17ID:xbZldfZG確かに記述上できる事になるけど
意味ないなあー
0078デフォルトの名無しさん
2015/07/21(火) 01:37:31.91ID:XB/uoEzxNum a => DataType a
getData :: DataType a -> [a]
みたいにしたらいけない理由が見当たらない。
0079デフォルトの名無しさん
2015/07/21(火) 01:57:25.58ID:iDhKY9Vq欲しいのは (Num a) => [a] のような型か
fromIntegralとかrealToFracのような
具体型をジェネリックな数に変換する関数だったりしないだろうか
0080デフォルトの名無しさん
2015/07/21(火) 13:15:45.21ID:Dco/MENI0081デフォルトの名無しさん
2015/07/21(火) 13:21:44.03ID:/2Z49al6一言で言えばそういうことだった
0082デフォルトの名無しさん
2015/07/21(火) 13:22:20.40ID:B0LBt+ac0083デフォルトの名無しさん
2015/07/21(火) 13:32:51.80ID:aaCdXzrqGitHub/Qiita/StackOverflowの臭い奴を観察1
0084デフォルトの名無しさん
2015/07/21(火) 19:49:21.60ID:LwXUVlfX0085デフォルトの名無しさん
2015/07/21(火) 22:58:37.09ID:eRnXfzMM0086デフォルトの名無しさん
2015/07/23(木) 08:07:45.47ID:Hd8z6QavQiita荒らしにしか見えない。
0087デフォルトの名無しさん
2015/07/23(木) 09:38:20.27ID:UOPnVIxG>>= :: ma -> (a -> mb) -> mb
となっているですが、これは、どうして
>>= :: ma -> (ma -> mb) -> mb(つまり普通のapply)
ではだめなのでしょうか?
0088デフォルトの名無しさん
2015/07/23(木) 10:23:45.67ID:9NQb4EqnX -> m Y というタイプの関数をたくさん繋げたいという気持ちがあるわけ。mがモナドだとするとき
m でラップされた型、たとえば m Int だとか m () だとかを「mという文脈を付与された型」だと思う
ことにします。m としては IO や Maybe を考えれば考えやすい。
f :: X -> m Y
g :: Y -> m Z
みたいなのがあったとき、fの結果の文脈を引き継いでgを計算したいわけ。たとえば m が
Maybeならば、fの結果は Nothing かもしれないわけ。IOだったら、実行時環境からIOで
ラップされた値を受け取ってるかもしれない。そういうのを受けて g を計算したいわけ。
このとき、>>= があるおかげで
(f x) >>= g
というのが計算できるわけ。「fのあとにg」というのを素朴に、思いついたままにやろうとすると
g ( f x) -- 型が合ってないので illegal
だけど、これは m 一個分型がずれてるからダメ。>>= は、一個分の m を吸収して
適用してくれる。だから、「モナドでラップされた値を取り出して適用してくれる」
みたいな言われ方をするけど、まあ、結果としてそう見えるようなうまい定義が
されてる。(例えばモナド則なんかがそんなうまい定義の背景にあって、そういうのを
どうやって思いついたか説明しようとすると圏論の話しになる。しらんでいい。)
0089デフォルトの名無しさん
2015/07/23(木) 10:30:27.22ID:9NQb4Eqnついで。 IO () みたいに、「中身がない」というか、文脈を持ってるという以外に
意味がないモナド値ってのもある。もっと広く言うと状態系のモナドね。
そういう場合、
f :: X -> m ()
g :: Y -> m ()
h :: Z -> m ()
みたいなのを「つなげたい」場合がある。これは入り口が違うので (>>=) は使えない。
だもんで、(>>) なんてのがある。
0090デフォルトの名無しさん
2015/07/23(木) 10:46:01.13ID:UOPnVIxG>>= :: ma -> (a -> mb) -> mb
を用意する代わりに、
extract :: ma -> a
みたいなのがあれば、普通の関数適用だけでも同じことができるのではないのですか?
0091デフォルトの名無しさん
2015/07/23(木) 11:47:48.09ID:9NQb4Eqn「そういうのが作れるならば」あなたのおっしゃるとおり。
具体的に考えてみましょう。 m が Maybe の場合、 extract Nothing は何になりますか
0092デフォルトの名無しさん
2015/07/23(木) 11:59:35.34ID:9NQb4Eqnよくいろいろなところで、(>>=) は「モナドから値を取り出して関数に適用する」
と言われたりするけど、unit と join を基礎にしてモナドを作ると、このトリックは
理解しやすい。
参考: ttps://ja.wikibooks.org/wiki/Haskell/%E5%9C%8F%E8%AB%96
要するにMがモナドだとして
unit :: a -> M a
join :: M (M a) -> M a
があったとき
(>>=) :: M a -> (a -> M b) -> M b
x' >>= f = join ( (fmap f) x' )
となって、実際には fmap f を適用して、ダブった M を一枚剥がして M b の値を返してる。
(つまりモナドの中から値を引っ張りだす、というような事は実際にはやってないわけ)。
実際にはモナドのなかから値を引っ張りだしてないにも関わらず、引っ張りだして
適用したと「プログラマの心の中で」みなしていても整合してるように書けてしまう。
そういううまいルールをどうやって設定するかみたいな話をするために圏論を借りてきてる。
正直、圏論だとかいってもこのレベルの話ならグラフ理論と難しさは変わらん。
(表示的意味論でも圏論を使うけど、そっちは数学がよほど好きでないと厳しい)。
0093デフォルトの名無しさん
2015/07/23(木) 13:06:35.41ID:UOPnVIxG> extract Nothing は何になりますか
なるひどこれは困った。。。
>>92
たしかに、fmap と join を基礎にすれば、 >>= はその一手ですね
>>= :: ma -> (a -> mb) -> mb の中では、特に、
a -> mb の部分がモナドにとって本質的なんだなと思えてきました
0094デフォルトの名無しさん
2015/07/23(木) 13:35:05.00ID:UOPnVIxG> そういううまいルールをどうやって設定するかみたいな話をするために圏論を借りてきてる。
「そういううまいルール」とは、どこの事でしょうか?
0095デフォルトの名無しさん
2015/07/23(木) 13:41:38.62ID:UOPnVIxGextract :: ma -> a
は存在しない場合があるようですが、
いつも存在しないのですか?
また、join :: m(ma) -> ma
は必ず存在するのですか?
0096デフォルトの名無しさん
2015/07/23(木) 14:03:17.98ID:9NQb4Eqnそういう上手いルール、はモナド則です。(Functor則と合わせて機能する)。
>>95
たとえば identity モナドなら extract は存在します。大事なのは「一般には、モナド M
に対して extract :: M a -> a が定義できない」ということ。 extract の存在を仮定してると
モナドの一般論にはならないわけです。
join :: M(M a) -> M a
の存在は、モナドの構成要件の一つだと言って差し支えないと思います。
Mがモナドであるかぎり必ず存在する。
参考:ttp://hackage.haskell.org/package/base-4.8.1.0/docs/Control-Monad.html#v:join
(さっき挙げたWikibooksのページには、unit + join でやる流儀と unit + bind
でやる流儀の両方が解説されてます。論理的にはどっちで考えても良い。)
0097デフォルトの名無しさん
2015/07/23(木) 18:38:39.92ID:KEVSaEFA0098デフォルトの名無しさん
2015/07/23(木) 21:02:13.38ID:hAeb0KoI静的型と動的型の高度な煽り合いの成果物だ
0099デフォルトの名無しさん
2015/07/23(木) 21:31:05.23ID:UOPnVIxG> そういう上手いルール、はモナド則です。
うまいというより、ふつうに定義すればモナド則は満たされるのではないですか?
> join :: M(M a) -> M a
> の存在は、モナドの構成要件の一つだと言って差し支えないと思います。
joinがそうであるのにextractがそうでないのはなぜでしょうか?
まあ、oinは不可欠だが、extractはなくても代わりがあるからだということなのでしょうが
0100デフォルトの名無しさん
2015/07/23(木) 21:46:55.16ID:9NQb4Eqnたとえば http://d.hatena.ne.jp/itto100pen/20090710 に、モナド則の一部が満たされない例があります。
「普通に定義すれば」モナド則は満たされるというのは、経験的には確かにそういう場面が多いかもしれませんが、
状況が込み入ってくれば、いつか「普通にモナドっぽいものを作ったつもり」なのにモナド則を満たさないものに
遭遇するかもしれません。
>joinがそうであるのにextractがそうでないのはなぜでしょうか?
モナドというものがそういうものだからとしか言いようがないですね。
>>93 であなたは
>a -> mb の部分がモナドにとって本質的なんだなと思えてきました
と書いていましたが、この X -> m Y 型の射をつなげてどうにかするための仕組みが
備わっているものをモナドと呼ぶわけです。うまくこのタイプの射をつなげるためには、
ダブったmをうまく剥がしてくれるものが必要で、それが join なわけです。
さっき挙げたWikibooksのページに、join を使って bind を作ったり、bind を使って join を作る
話が載ってますので、参考になさってください。
一方、あなたが書いてる extract :: M a -> a に相当する仕組みを考える場面は
一応あります。それは、 m X -> Y 型の射をうまくつなげてどうにかしたい場合です。
それは「コモナド」と呼ばれてます。(これを積極的に考える場面もあるらしいのですが
私の勉強が追いついていないのでコモナドについてこれ以上語れることはありません。)
0101デフォルトの名無しさん
2015/07/23(木) 21:58:48.06ID:GSXYPmA+空でないデータ構造に対して、その中のある(現在注目している)要素を特に指し示す
ある種のポインターを持った構造として使う、というのがよく知られた例ではないかと。
ストリームをチューリングマシンのテープに見立てた時のヘッドの現在位置とか。
0102デフォルトの名無しさん
2015/07/23(木) 22:28:56.93ID:ul3W6A8M0103デフォルトの名無しさん
2015/07/23(木) 23:19:05.16ID:UOPnVIxGページ紹介ありがとうござます。
そこの return x = [x x] は、(私の思うw)「ふつうの」定義ではないので、
それがモナド則を満たさないのも尤もかなと思いました
0104デフォルトの名無しさん
2015/07/23(木) 23:32:47.82ID:GSXYPmA+逆に言えば、あなたが直観的に思う「ふつう」を保証してくれるのがモナド則なのですわ。
0105デフォルトの名無しさん
2015/07/23(木) 23:45:33.49ID:UOPnVIxGモナド則というのがそういうものだという説明ははじめて聞きました。本当ですか?
0106デフォルトの名無しさん
2015/07/24(金) 00:04:12.32ID:E+4NqHJH0107デフォルトの名無しさん
2015/07/24(金) 06:20:03.70ID:SOLi30hJ法則はもっと不吉な意味を持つべきなんだよ
「不自然にならないよう自然を保証してくれるので復旧シナリオは考えていない」
まさかこのパターンの意味がわからない難聴系主人公はいないよね
0108デフォルトの名無しさん
2015/07/24(金) 08:17:51.80ID:ZflfUkEE> 「不自然にならないよう自然を保証してくれるので復旧シナリオは考えていない」
> まさかこのパターンの意味がわからない難聴系主人公はいないよね
ここよくわからない。少し説明を加えてくれませんか
0109デフォルトの名無しさん
2015/07/24(金) 08:31:24.73ID:sUR4TL+C上の return x = [x x]
とか
0110デフォルトの名無しさん
2015/07/24(金) 09:47:25.11ID:+b/Jkmb9「ふつうの」FunctorやApplicative Functorであって
Monadでないものの具体例ってあるのかな
0111デフォルトの名無しさん
2015/07/24(金) 10:31:52.55ID:qo8KZeeDZipList
理由はこれ http://www.mail-archive.com/[email protected]/msg57217.html
0112デフォルトの名無しさん
2015/07/24(金) 12:24:32.99ID:mRGyPSzK確かにロボットが困った顔してるように見える
0113デフォルトの名無しさん
2015/07/24(金) 16:30:09.13ID:sUR4TL+C間違ってるかもしらんけど
関数はFunctorやApplicative Functorだけどmonadではなかったような
0114デフォルトの名無しさん
2015/07/24(金) 18:21:56.53ID:ZflfUkEE関数は恒等モナドなのでしょう?
0115デフォルトの名無しさん
2015/07/24(金) 20:30:46.83ID:ZflfUkEEそのネーミングがよくないなw
0116デフォルトの名無しさん
2015/07/24(金) 22:02:00.45ID:UUB1Rdtfモナドの本質とは、Kleisli射が「合成できる」ことであって、モナド則は
そのような合成が well-defined であることを保証しているという意味では本質と
関係している。
0117デフォルトの名無しさん
2015/07/24(金) 22:15:15.51ID:E+4NqHJH(->)型はモナド。
Readerモナドの正体は関数モナドそのもの。
0118デフォルトの名無しさん
2015/07/24(金) 22:26:30.02ID:XFwmWe1A(>>=)やreturnでwrapするだけで元の情報が失われるような実装は禁止
後に続く関数に元の情報を全て渡す
つまりわざと情報を捨てればモナド則を満たさない例を作れる
return x = ("", x)
(_, x) >>= f = f x
("warning", x) >>= return = ("", x)
0119デフォルトの名無しさん
2015/07/24(金) 22:29:22.04ID:+b/Jkmb9なるほどZipListか
まだちゃんと読めてないんだけど、
> (可算無限も含めて)長さが固定のベクトルだったらその定義で上手く行くんだけどね、
> でも一般のリストに対する上手い定義ももしかしたらあるかもね
って感じの結論か
return (= pure) が無限リストを返すから
確かにモナド則を満たすのは容易ではなさそう
>>115
Haskellでは型さえ合っていればコンパイルできてしまうだけで
モナドがモナド則を満たすのはむしろ定義だと思う
0120デフォルトの名無しさん
2015/07/24(金) 22:52:20.29ID:jOlzxqLq辛くなったら帰って来い
0121デフォルトの名無しさん
2015/07/24(金) 23:04:31.56ID:ZflfUkEE> モナド則は...合成が well-defined であることを保証している
>>118
> モナド則は情報量保存則のようなものだと思ってもよい
>>119
> モナドがモナド則を満たすのはむしろ定義だと思う
えっ? モナド則って単位元の存在と結合則ですから、モナドに限らないおよそ代数演算に
課される最低限の規則に過ぎないでしょう?
0122デフォルトの名無しさん
2015/07/24(金) 23:18:40.52ID:UUB1Rdtfその最低限の規則だって明示的に指定して置かなければ混乱するでしょ。
あなたにとって最低限のことは隣の誰かにとっては最低限の常識ではない。
0123デフォルトの名無しさん
2015/07/24(金) 23:40:04.07ID:XFwmWe1A交換法則 (+ z) . (x +) = (x +) . (+ z)
これらは数学的に同じ意味だから
結合法則は最低限だとか、交換法則は最低限じゃないとかいうのは
数学じゃなくて言葉遊びだよね
0124デフォルトの名無しさん
2015/07/25(土) 07:47:47.08ID:6zkZTkly群は交換法則を満たさなくてもよい,満たすものを特に可換群とよぶ
十分に数学的だ
0125デフォルトの名無しさん
2015/07/25(土) 07:57:27.29ID:Jr3WK49j0126デフォルトの名無しさん
2015/07/25(土) 08:09:08.78ID:Jr3WK49j別の台集合(+z)(x+)と合成(.)で構成される構造に等価だといったところで
もとの演算(+)の可換性について何も言ったことにはならないというだけのことよね
0127121
2015/07/25(土) 08:44:38.00ID:Bvjhkxqq強調点は「最低限」のところではなく「およそ(ふつうの)代数演算に共通」
というところにありました
0128121
2015/07/25(土) 08:46:08.24ID:Bvjhkxqq0129デフォルトの名無しさん
2015/07/25(土) 08:55:06.98ID:gZG0Y+YD嘘を言ったのではなく何も言ってないのか
チャレンジよりゼロリスクを選んだ人間がどのような評価を受けるかという意味で面白い
0130デフォルトの名無しさん
2015/07/25(土) 09:14:59.38ID:bPfkCbEC0131デフォルトの名無しさん
2015/07/25(土) 09:34:33.91ID:Bvjhkxqqtrace f b = let (c, d) = f(b, d) in c
としたとき、このtraceってwell-defined?
0132デフォルトの名無しさん
2015/07/26(日) 10:00:37.02ID:dkr9+eHq「選択と集中」とかいう言葉を信じるなら値に特質を持つことは寧ろ禁止した方が良い
0133デフォルトの名無しさん
2015/07/26(日) 11:46:33.95ID:rsm1cXgs検索方法はないでしょうか。
たとえば、yesod が必要なパッケージの一覧など。
0134デフォルトの名無しさん
2015/07/26(日) 14:06:20.87ID:ihM0rggdその「選択と集中」というカルト宗教流行ってるの? 根拠もなんもないくせに
耳あたりだけいい言葉に騙されてない?
選択と集中でおもいっきり原子炉にぶっこんだ東芝はどうなった?
0135デフォルトの名無しさん
2015/07/26(日) 20:37:01.68ID:vJ1KGCO50136デフォルトの名無しさん
2015/07/26(日) 20:44:23.44ID:vJ1KGCO5利用者が困る
0137デフォルトの名無しさん
2015/07/26(日) 20:52:18.39ID:dkr9+eHq欲しくないものまで買わされて損する場合がある
それよりは欲しいものだけを集中的に買って損する方がマシ
0138デフォルトの名無しさん
2015/07/26(日) 21:02:49.59ID:vJ1KGCO50139デフォルトの名無しさん
2015/07/26(日) 21:02:55.04ID:PdaEJy2y0140デフォルトの名無しさん
2015/07/26(日) 23:01:02.42ID:ooP+OwHf0141デフォルトの名無しさん
2015/07/27(月) 03:43:19.54ID:+mQx9Q9Eなんでこんな所で選択と集中の話が出てくるの?
0142デフォルトの名無しさん
2015/07/27(月) 06:11:57.70ID:3edBlaSG0143デフォルトの名無しさん
2015/07/27(月) 11:31:50.70ID:pQHi2myk特に、間接的なimportを強制されたら最悪
0144デフォルトの名無しさん
2015/07/27(月) 22:21:38.16ID:+pmDbRz6ジャック・ウェルチが言ってる「選択と集中」とは何の関係もないな
0145デフォルトの名無しさん
2015/07/28(火) 05:08:55.87ID:XoUEQPXjジョブズのようなものがいるんだ
0146デフォルトの名無しさん
2015/07/28(火) 11:57:02.42ID:RBpFIWq50147デフォルトの名無しさん
2015/07/28(火) 13:39:01.53ID:d4M8qnVVジャック・ウェルチの「選択と集中」でもってあなたが何を言わんとしてるか
さっぱりわからないし、「型に特質がある」という言い方も意味不明。
モナド則は値の特質ではなくモナドでラップされた型がどのように振る舞うか
を決めてるのであって、このルールがあるからこそ do 記法を
安心して使える。とにかく地道に勉強しよう。
0148coolio
2015/07/28(火) 16:34:52.05ID:n3cGSoaVなんでJavaScript使わないのみなさん?
普及率も需要もこっちの方が上だし、国際的潮流かとおもうけど
0149デフォルトの名無しさん
2015/07/28(火) 17:47:57.77ID:d4M8qnVVじゃあまずお前が国際的潮流に合わせて英語か中国語で書き込めよ
0150デフォルトの名無しさん
2015/07/28(火) 17:50:36.54ID:Ni9zj/4A人のことはどーだってよくね?
0151デフォルトの名無しさん
2015/07/28(火) 21:05:55.89ID:ROVV0dd80152デフォルトの名無しさん
2015/07/28(火) 21:40:55.38ID:UXOcgM9+哦,可以用國語嗎?你看得到呢?
0153デフォルトの名無しさん
2015/07/28(火) 21:54:20.49ID:d4M8qnVV日本語でOK
0154デフォルトの名無しさん
2015/07/28(火) 22:15:38.33ID:uKnSRdVu0155デフォルトの名無しさん
2015/07/28(火) 22:49:30.17ID:MQ4Zq0Y10156デフォルトの名無しさん
2015/07/28(火) 23:02:16.25ID:2DleteTo0157デフォルトの名無しさん
2015/07/30(木) 13:15:34.02ID:XKVzkpKt0158デフォルトの名無しさん
2015/07/31(金) 14:52:35.97ID:gTceL3gJさっさと2chから消えろ
0159デフォルトの名無しさん
2015/07/31(金) 21:02:27.62ID:SPFFmEBo0160デフォルトの名無しさん
2015/07/31(金) 22:59:33.38ID:Tuqyf3gY0161デフォルトの名無しさん
2015/08/01(土) 01:31:31.22ID:CYsajC4Sアンダーメンバー全員集合 16ページ お祭り騒ぎ
ベルセルク連載開始 + 別冊付録 直近4話分
皆、短パン・ランニングシャツ姿
堀・らりんのお股
ひめたんの胸
0162デフォルトの名無しさん
2015/08/01(土) 05:22:40.82ID:494SgxRt0163デフォルトの名無しさん
2015/08/01(土) 10:47:10.94ID:jD/MwJWz客観的に1人いようが2人いようが主観的には1人しか視えない
0164デフォルトの名無しさん
2015/08/02(日) 20:21:12.98ID:htkPKsn50165デフォルトの名無しさん
2015/08/02(日) 20:36:45.90ID:SLv/zRdd原発長文君は効率的な情報収集という意味では有用であった復活を拒絶しない
0166デフォルトの名無しさん
2015/08/02(日) 20:39:24.29ID:Iy0keT5I0167デフォルトの名無しさん
2015/08/02(日) 21:10:57.21ID:jhqklPYlパッケージをインストールするとドキュメントも一緒にインストールされるように設定しましたが、
ドキュメントのルートのindex.html(.cabal/config ファイルの dic-index-file の項)が更新されるとき、
インストールしたパッケージが公開しているモジュールへのリンクが間違った場所を指しています。
.cabal/config ファイルのインストールディレクトリ関係の項はデフォルトで下記のようになっています(一部だけ抜粋)。
doc-index-file: $datadir/doc/$arch-$os-$compiler/index.html
install-dirs user
prefix: /home/ユーザー名/.cabal
datadir: $prefix/share
docdir: $datadir/doc/$abi/$pkgid
htmldir: $dicdir/html
haddockdir: $htmldir
例えば今 hacolour-1.23 パッケージをインストールすると、ドキュメントは
/home/ユーザー名/.cabal/share/doc/x86_64-linux-ghc-7.10.1/hscolour-1.23/html/
以下にインストールされます。
しかし、doc-index-file の index.html ページの例えば Language.Haskell.HsColour のリンクは
/home/ユーザー名/.cabal/share/doc/x86_64-linux-ghc-7.10.1/Language-Haskell-HsColour.html
を指すように更新されてしまいます。
当然、そんな所に Language-Haskell-HsColour.html ファイルはありません。
この間違ったリンクを正しく
/home/ユーザー名/.cabal/share/doc/x86_64-linux-ghc-7.10.1/hscolour-1.23/html/Language-Haskell-HsColour.html
を指すように設定するには
.cabal/config ファイルのどこを直せば良いのでしょうか。
0168デフォルトの名無しさん
2015/08/02(日) 21:22:35.46ID:PjsL8G7T>doc-index-file: $datadir/doc/$arch-$os-$compiler/index.html
普通に
doc-index-file: $datadir/doc/$arch-$os-$compiler/$pkgid/index.html
じゃいかんの?
0169デフォルトの名無しさん
2015/08/02(日) 21:23:45.67ID:PjsL8G7T0170デフォルトの名無しさん
2015/08/02(日) 21:27:13.13ID:PjsL8G7T総インデックスファイルは確かにそこになきゃダメだ。
0171デフォルトの名無しさん
2015/08/02(日) 22:14:50.22ID:5gB+ySz/モナドは自己関手なんで、関手を合成することができるが、
そうしてできた合成関手は一般にはモナドにならない。
0172デフォルトの名無しさん
2015/08/02(日) 23:43:12.86ID:htkPKsn5合成関手はモナドになり得ると思うが。。。
モナドの合成は一般にはモナドにならないということね?
なぜそうなのか、まだよく分かってないのだが、
そもそも合成できないっていうのはモナドが圏的でないということね?
それって結構困ったことなのでは?
0173デフォルトの名無しさん
2015/08/03(月) 01:17:03.15ID:kH5++B+D見当違いかもしれないけど、俺の手元の~/.cabal/configは
htmldir: $docdir/html
になってた。貴方のは
htmldir: $dicdir/html
0174デフォルトの名無しさん
2015/08/03(月) 07:24:39.84ID:UJ5SIf4Hすいません、ただの書き間違えです。
私の方でも正しくは
htmldir: $docdir/html
です。
0175デフォルトの名無しさん
2015/08/03(月) 11:59:33.09ID:C3iL4RK8モナドFとGについて、合成関手FGに対して適切なηとμを、
「一般には」構成できない。FとGがよほど相性が良い場合は別だけど。
0176デフォルトの名無しさん
2015/08/03(月) 17:24:38.72ID:u3Kfbgnb/::::::::::::.::::::::::::::::::::::::::::`::、、
/::::::::::::::::::::::::::::::::::::::::::::::::::::::`、
l::::::::::::::::::::::::::::::::::::::::;':l:::::::::::\::l
l:::::::::::::::::::::::::::::::::,,::::::::;-,:,::::::::::::::::l
l::::::::::::::::,_,.::::,';::::::;:::::: :: l ::::::::::::::l
l::::::::::/-/:::/-ニ,.::::/=,./::::::::::l
ヽ:::: ´、ひ> ;: l .<ひ>' 、::::::::/
ヽ:::::  ̄ .)::; l  ̄ l::::/ < 排便ダン きんもちい〜
、:::::.. /:::; .,-、 l:::/、
,―:::::::: ゝヽ- ー' 、 l::/,、ヽ
l,、,、,,:、:: / ,--、,-.、_ l /::::::,、,、l
l,、,、,、,、,、::、 `ー ̄-' /:::::::::::,、,、l
l,、,、,、,、,、,、::ヽ /::::::::、,、,、,、,ノ:\
/⌒\〆', `  ̄ ´ ゝ/⌒\
/ ノつ\ ・ ・ /⊂ ヽ!
o0○ノ / 3 \ (::::⌒ヽ / とノ\ ヽ○0o
( /、_ノ\ Y `(_、_) / \´ )゚
\_) `ヽ : :;;*:; : : : | (_ノ
人__;;:;;、___ノ ヽヽ ヽヽ
;:;;:;;:;,, ──┐ | | ──┐ | |
∬ ;;:;::.;::.::;::..:;:..: ∬ / | | /. | |
・〜 ;::;.:;:;:;:;:.:;:.:::.;:;:;.:.:.: ノ ノ ┐ ノ ノ ┐
∬;;;:::;;;:;:.:;:.::.:;;.:.;.:;.:; ∬ ┴ ヽヽ ┴
:"
0177デフォルトの名無しさん
2015/08/04(火) 07:05:53.89ID:fTn2TRnu意味不明すぎてコピーできない武器を使えばいい
0178デフォルトの名無しさん
2015/08/04(火) 09:50:58.91ID:Jii/ZMO+了解。
モナドが合成できないということは、代数的議論としてはそうだと言ってればいいんだろうが、
プログラミングとしては、致命的なのではないの?
0179デフォルトの名無しさん
2015/08/04(火) 18:16:37.45ID:Qc8p5PG4代数的な議論とか言ったって簡単に情報系の議論に移せるよ。
Fという文脈に、さらにGという文脈をつけたものは、先にG、それをFでかぶせたものとは
同一視できない。
もう少し具体的に言えば、Maybeと状態モナドStateを考えたとき、Maybe State s a と State s Maybe a
を何も制約つけずに同一視できるほうがプログラミングとしては致命的だよ。
0180デフォルトの名無しさん
2015/08/04(火) 20:22:00.28ID:T0ZfeL7Sハスケルでは「=」は代入ではなく束縛だという事で
関数定義
func :: Int -> Int
func x = func (x - 1)
それを使った式
func 100
と書いた場合無限に減算を繰り返す理由は
「=」は代入ではなく束縛だから
ハスケルがfunc xに該当する唯一の値を求めて処理を繰り返すという
仕組みになっているという理解でよろしいでしょうか。
0181デフォルトの名無しさん
2015/08/04(火) 20:46:26.59ID:8q1xh6uiint func(int x) {
. return func(x-1);
}
int x = func(100);
Cでこう書いたって無限再帰
0182デフォルトの名無しさん
2015/08/04(火) 21:03:02.69ID:Jii/ZMO+可換でないといけないとは言っていない。
合成ができないのが致命的と言ったのだが
0183デフォルトの名無しさん
2015/08/05(水) 08:30:57.49ID:XaoKQAnnモナドとモナドの合成がモナドでないのは致命的か?
0184デフォルトの名無しさん
2015/08/05(水) 08:31:02.84ID:8IuY4/EZx = x - 1
とかの場合の話じゃない?
0185デフォルトの名無しさん
2015/08/05(水) 09:20:55.44ID:PKbBdrRVなぜ致命的なのかさっぱりわからない
0186デフォルトの名無しさん
2015/08/05(水) 11:55:37.34ID:6JvEd9Ae> 素数と素数の積が素数でないのは致命的じゃないが
それは素数の本質からの帰結だが、モナドの場合はそうではない。
もし整数と整数の積が整数にならないとすると、それは整数概念にとってかなり致命的。
群とまでいわなくても圏すらなさない概念はふつう使い物にならない
0187デフォルトの名無しさん
2015/08/05(水) 12:21:47.56ID:/t+jhWZx>モナドが合成できないということは、代数的議論としてはそうだと言ってればいいんだろうが、
>プログラミングとしては、致命的なのではないの?
そりゃモナドでプログラミングしたことなきゃわかんないよな
0188デフォルトの名無しさん
2015/08/05(水) 13:35:33.66ID:WyZxE69Iよくわからんが仮に「モナド」が使い物にならないなら
「素関手」みたいな、素数に似た名前の新しい概念を提案すればいいんだろ?
0189デフォルトの名無しさん
2015/08/05(水) 14:44:47.74ID:6JvEd9Ae今は、素でないといけないと言ってるわけじゃないし(むしろ素しかないのは変だなと言ってる)
名前を問題にしてるわけでもないんだが
0190デフォルトの名無しさん
2015/08/05(水) 15:47:37.18ID:WyZxE69Iコストは最小化した方が良いし
0191デフォルトの名無しさん
2015/08/05(水) 19:06:59.33ID:nSk5CAms具体的にはエロ画像サイトのスクレイピングやりたい
0192デフォルトの名無しさん
2015/08/05(水) 20:35:22.09ID:3EIw/aJpやったらいいじゃん
0193180
2015/08/05(水) 20:35:53.33ID:++LOioZGすいません代入束縛関係なく無限再帰の構文でした。
無限再帰途中で停止するため基底部を
パターンマイッチングの設定で止めてみました。
func' :: Int -> Int
func' 0 = 0
func' x = func' (x - 1)
x = x - 1でもやってみます。
0194デフォルトの名無しさん
2015/08/05(水) 23:13:16.26ID:/t+jhWZxはHaskellだと止まらないよ。
x = x-1 = (x-1)-1 = ((x-1)-1)-1) = ...
といつまでたっても書き換えが終わらないから。
ただこの例ではループの検出が容易なのでghciで
ghci> let x = x-1
ghci> x
を試すと *** Exception: <<loop>> となって中断される。
基底部のない再帰はそうならない。
0195デフォルトの名無しさん
2015/08/06(木) 15:22:18.11ID:gwZmdoaPほんとこれ。 モナドの積がモナドにならないことがなぜ致命的なのか、全然言えないんだよねこの人。
0196デフォルトの名無しさん
2015/08/06(木) 16:19:38.61ID:hE+0lNLB0197デフォルトの名無しさん
2015/08/06(木) 20:09:37.57ID:QVat9e3X自分は何もやらず安く買って高く売るだけの能力に全振りしてるんじゃないか
0198180
2015/08/06(木) 20:35:31.96ID:9HWheWsAありがとうございます。
試してみて止まらないのを確認しました。
xが無限ループに束縛される様な感じです。
0199デフォルトの名無しさん
2015/08/07(金) 09:35:35.60ID:qqVIQMo+素関手ってのは、あらゆる関手がそれらから合成できるときに使う言葉だ。
モナドは全然そんなものじゃないだろ?
>>195 >>196 >>197
モナドっていうのは、ごく限られた単純局面でのみ使えるプログラミング技法だっていう自覚はないの?
その意味で、関手はもちろんメジャーだが、モナドはニッチなんだよ。
もっと実用の「コード書いて」いくとそれがわかってくると思うが
0200デフォルトの名無しさん
2015/08/07(金) 10:39:25.62ID:aKStrfm+御託はいいんだよ。モナドってのは自己関手が作り出す「文脈」を引き継いで
どんどん計算してく、そういう発想をカタチにしたものなわけ。そういう具体的な
思想と具体的な実装を持っていて、Wadlerが示したように do 記法を通じて
参照透明性を壊さずに命令型のプログラミングができることは示された。
んで君は、「モナドは合成できないじゃないか」と言ってるわけ。んなこたあ誰だって
知ってるんで、たとえばモナドをパラメトリックにして、モナドトランスフォーマなんかを
考えたらいいんじゃね?いや、それ一見いいように思えてモナドがタワー状に積み重なって
保守しづらいんだけどとかいろんな人がまだあれこれやってる最中。
なんか便利なものができたら、その「便利なもの」が切り開いた地平の先に新しい岩があるの。
それは「問題の解決がもたらした新しい問題」なので頭が痛いところだけど、そうやって新しい問題の
解決のために挑むのが「知性ある人間」のしごとなの。
「馬車は不便」を内燃機関による自動車が解決したけど、今度はその馬力と速度を人間が
制御しそこねて「走る棺桶」だと言われたり、自動車による死者が多すぎて「交通戦争」と
言われたりすることに対して、シートベルトが知性ある人間によって発明されたの。
シートベルトは中途半端な解決策だね、ということでエアバッグを発明したの。
なんかのアイデアが副次的にもたらす頭の痛い問題をとりあげる、それは大事。
でも、「こんな致命的な欠陥があるから問題外」という考えは知性の放棄なの。
「自動車事故で人がたくさん死ぬから自動車禁止な」←知性の放棄です。
経済的工学的制約があるから、自動車事故の問題だってまだ解決してない。でもそれを
解決しようと続けることが知性なの。
モナドの合成の話は頭が痛い問題で、まだ十分な解決策をだれも見いだせてない。でも
それで喚き散らして「欠陥品」と罵ってるのはバカでもできる。知性がある人間は君が喚き散らしてる
間も圏論の本を読みながら「いくらかマシなアイデア」をひねり出そうとしてるの。
0201デフォルトの名無しさん
2015/08/07(金) 13:10:20.13ID:qqVIQMo+力のこもったコメントありがとう
> 御託はいいんだよ。
もっと冷静にw
> 参照透明性を壊さずに命令型のプログラミングができることは示された。
それは関数型にとって宿命的課題。だが、モナドはそのためのものでもないし、モナドだから解決できるわけでもない
> んなこたあ誰だって知ってるんで
もっと冷静に。合成できないことは知っててもその意味が分かっていない
>「馬車は不便」を内燃機関による自動車が解決した
その場合の自動車は、限界はあっても、本質的技術進歩なんだよ。
その他あまたのそもそも成立しない技術とは区別しないとな。
合成できないというのは成立し得ない兆候なのよ。
> でも、「こんな致命的な欠陥があるから問題外」という考えは知性の放棄なの。
いやいや、致命的な欠陥があればそれはもうそれでだめなのよw
> モナドの合成の話は頭が痛い問題で、まだ十分な解決策をだれも見いだせてない。
それが分かっているなら、少し救いだが
> 君が喚き散らしてる間も圏論の本を読みながら「いくらかマシなアイデア」をひねり出そうとしてるの。
圏論の本を読みながらw
そもそもモナドが圏論から形式的にひねり出したアイデアだから、プログラミングでは使えないんじゃないのかい?
0202デフォルトの名無しさん
2015/08/07(金) 20:18:30.98ID:/Xr5U2Jc0203デフォルトの名無しさん
2015/08/07(金) 22:14:14.99ID:CgCkvu6aモナドでパイ生地宜しく抽象レイヤ重ね出したら、結局手続き型と同じ業を背負い込むんじゃねーの?
という素朴な疑問がある。
0204デフォルトの名無しさん
2015/08/08(土) 07:32:51.12ID:OWyBYzJTこの流れなら普通は自然言語に疑問をもつ
自然言語なんて空論記述言語にすぎないんじゃねーかと
0205デフォルトの名無しさん
2015/08/08(土) 09:16:43.49ID:SyZUU7PY意味不明w
自然言語だからか?w
0206デフォルトの名無しさん
2015/08/08(土) 10:03:20.67ID:OWyBYzJT自然言語を理想とする理想主義が否定されれば高級言語や人工知能の大部分が崩れるから
0207デフォルトの名無しさん
2015/08/08(土) 10:56:41.88ID:fC37rrhT逆だよ。ラッセルのような論理主義は自然言語が曖昧性を持ち、真理を記述するのに不適格だと
考えて記号論理を推進した。そのラッセルが生み出した型理論を(大幅に)修正したものが
強い型を持つ言語の基盤になっている。
自然言語による真理記述に興味を持ち続けた学者もいるけど、少数派(間違いだといいたいわけじゃない)
で、今日のプログラミング言語には全く影響を与えていない。
0208デフォルトの名無しさん
2015/08/08(土) 14:05:14.68ID:OWyBYzJT高級言語は曖昧性がないことに加えて更に別の理想を追求している
おそらく一度あきらめた理想を取り戻そうとしている
0209デフォルトの名無しさん
2015/08/08(土) 15:28:39.84ID:TgCfkrij0210デフォルトの名無しさん
2015/08/08(土) 15:52:47.27ID:mk1m6mga0211デフォルトの名無しさん
2015/08/08(土) 16:16:44.90ID:TgCfkrij0212デフォルトの名無しさん
2015/08/08(土) 17:24:31.84ID:CVdJzgpn0213デフォルトの名無しさん
2015/08/08(土) 17:25:05.09ID:CVdJzgpn0214デフォルトの名無しさん
2015/08/08(土) 17:31:44.38ID:9n35IarN0215デフォルトの名無しさん
2015/08/08(土) 18:46:17.01ID:i6VMh23Wひたすら型を複雑にすれば勝手に精密なプログラムになってくれるんだぜ?
あんな楽な言語、他に無いよ
0216デフォルトの名無しさん
2015/08/09(日) 09:57:54.75ID:Goie4Pfe0217デフォルトの名無しさん
2015/08/09(日) 10:15:53.22ID:z+nEtG9u1 自然言語 ←コード書かない
2 型を書くだけ ←コード書かない
3 短い (一行とか) ←コード書く
0218デフォルトの名無しさん
2015/08/09(日) 10:19:57.32ID:yc5ubK7v日本人が普通に世界でバリバリHaskellで書いたアプリケーションをたくさん紹介してくれ
0219デフォルトの名無しさん
2015/08/09(日) 11:07:30.63ID:uWrNjf8Rこの3つの中では
1しかないかな?
2と3は論理的にありえない
0220デフォルトの名無しさん
2015/08/09(日) 12:47:58.32ID:fLWMExWl0221デフォルトの名無しさん
2015/08/09(日) 15:46:05.53ID:IcT2pazV金融屋だけどHaskellは実務ではあんまり使わないよ
金融業界で使われている有名なライブラリがOcamlで書かれてるから、Ocamlが多い
あとは、F#だっけ?なんか、Ocaml互換のプログラミング言語
0222デフォルトの名無しさん
2015/08/09(日) 16:06:00.55ID:q2cZe2Ik0223デフォルトの名無しさん
2015/08/09(日) 16:07:28.11ID:t8Adpj370224デフォルトの名無しさん
2015/08/09(日) 17:14:22.35ID:IcT2pazV普通に現職の俺より詳しいというなら、なにかそれらしい反論してみろって
>>223
OCamlだったか、すまん
特定のドメイン領域でしか使わないし、俺は普段使わないから間違えたの
0225デフォルトの名無しさん
2015/08/09(日) 17:56:53.34ID:jZAMYmB+0226デフォルトの名無しさん
2015/08/09(日) 20:15:02.83ID:yc5ubK7vまともに動く Haskell アプリのソース全体が見れる機会ってなかなかないんだ。
日本人が書いたなんて意地悪なことはもう言わんから、紹介してくれないか。
github 漁っても、実験的なものやサンプル、ライブラリくらいしか見あたらん。
なんか小粒な Web アプリはやたら出てくるが、なんだろ。
流行ってるのか?
0227デフォルトの名無しさん
2015/08/09(日) 21:01:04.74ID:0a1Qk31rまぁ下請けだったけどね
元受の会社は誰でも知ってる大会社
ヒントだけ書くと、ソー○ネク○ト
0228デフォルトの名無しさん
2015/08/09(日) 21:19:45.38ID:0nk6UHsv0229デフォルトの名無しさん
2015/08/09(日) 21:22:35.31ID:bxjvjJcB間違える→Ctrl-Pの連打数が増える→間違えるの繰り返し辛い
0230デフォルトの名無しさん
2015/08/09(日) 22:57:12.53ID:PuCXERZp数値計算につかうわけじゃない
ADTで金融商品の記述のDSL作って使う
0231デフォルトの名無しさん
2015/08/10(月) 08:18:32.34ID:5dby/keT0232デフォルトの名無しさん
2015/08/10(月) 10:22:50.55ID:6CToalvRWadlerの"Theorems for free"に、
r: ∀X. List(X) -> List(X) ならば a* o r-A = r-B o a*
ここで、a: A -> B, a*: List(A) -> List(B),
r-A: List(A) -> List(A), r-B: List(B) -> List(B)
という定理が出てきます。
しかし、ここのrやaをたとえば
r = { ["a", "b"] |-> ["a", "b", "b"],
[1, 2] |-> [2, 1],
........... }
a = { "a" |-> 1, "
"b" |-> 2,
............}
のようにとった場合、
a* (r-Char(["a", "b"]) = a* (["a", "b", "b"])
= [1, 2, 2]
r-Int (a* (["a", "b"]) = r-Int ([1, 2])
= [2, 1]
となってしまい、明らかに
この定理は成り立たないと思うのですが、どこか誤解があるでしょうか?
0233デフォルトの名無しさん
2015/08/10(月) 10:23:33.03ID:h0Losqum0234デフォルトの名無しさん
2015/08/10(月) 10:32:54.55ID:mZ18nlaN0235デフォルトの名無しさん
2015/08/10(月) 10:45:40.66ID:6CToalvR> rの型が違う
どう違うのでしょうか? 気が付きません
0236デフォルトの名無しさん
2015/08/10(月) 11:02:23.74ID:dDBl8Ksv0237デフォルトの名無しさん
2015/08/10(月) 11:20:23.87ID:6CToalvR0238デフォルトの名無しさん
2015/08/10(月) 13:39:27.85ID:Mr6uGRV9もしかしてコンパイラがなくても型が見える人なのかな
Haskellも自分が使うためじゃなくて型が見えない人のために作っただけ
そう考えるとHaskellでアプリを作っている気配がないのも辻褄が合う
0239デフォルトの名無しさん
2015/08/10(月) 14:07:42.71ID:3agS2rXWWadlerの論文のどこの話をしてるの?
0240デフォルトの名無しさん
2015/08/10(月) 14:33:14.35ID:qNcURq9A0241デフォルトの名無しさん
2015/08/10(月) 14:40:16.50ID:08na6m/Lhttp://ttic.uchicago.edu/~dreyer/course/papers/wadler.pdf の
Introductionの話だと思う
>>232が何を言いたいのかは分からないけど
0242デフォルトの名無しさん
2015/08/10(月) 15:19:32.65ID:3agS2rXWありがとう。そんな最初のところだったのか。
こりゃ単に r はパラメトリック多相な関数じゃなきゃいかんて話だな。
>>232みたいに型ごと値ごとにアド・ホックな対応を付けて
r を構成することはできない(任意の型のリストの任意の値を
取らなきゃいけないんで計算可能にならない)。
0243デフォルトの名無しさん
2015/08/10(月) 15:23:45.69ID:6CToalvRそこです。
そこにある例では、odds関数の説明がよく分かりません。
「これは(定理の)反例にはならない。なぜなら、oddsの型が∀X. List(X) -> List(X)
ではなく、より特定的な List(Int) -> List(Int)であるので」と言うのですが、
oddsの型が∀X. List(X) -> List(X) になっていないとなぜ言えるのでしょうか?
φ(A)であってさらに∀X.φ(X) でもあることはあり得ることではないのですか?
0244デフォルトの名無しさん
2015/08/10(月) 15:29:36.39ID:3agS2rXW"odds"はIntについてしか定義できないだろ。
他の型についてどうやって定義すんだ?
というわけで、どんな型のリストにも適用できる関数は
特定の型の値を具体的に見て処理できないので
リストの構造を弄ることしかできない、ということよ
0245デフォルトの名無しさん
2015/08/10(月) 15:29:57.17ID:3agS2rXW0246デフォルトの名無しさん
2015/08/10(月) 15:31:01.54ID:6CToalvR> 型ごと値ごとにアド・ホックな対応を付けて
> r を構成することはできない(任意の型のリストの任意の値を
> 取らなきゃいけないんで計算可能にならない)。
その条件が明記されているのはあまり見たことがないのですが、
暗黙の常識なのですか?
0247デフォルトの名無しさん
2015/08/10(月) 15:32:35.38ID:3agS2rXWこの文脈での「関数」が計算可能関数じゃなきゃいけないのは常識。
0248デフォルトの名無しさん
2015/08/10(月) 15:39:35.42ID:6CToalvRすれ違いすみません。
> "odds"はIntについてしか定義できないだろ。
> 他の型についてどうやって定義すんだ?
Int以外についてはidにする、とかすればいいのではないですか?
そうしたときには
> この文脈での「関数」が計算可能関数じゃなきゃいけないのは常識。
計算可能でもあると思うのですが?
それに「この文脈」というのは今のような場面では少しいい加減な感じがしますが
0249デフォルトの名無しさん
2015/08/10(月) 15:42:48.51ID:3agS2rXW0250デフォルトの名無しさん
2015/08/10(月) 15:46:02.23ID:6CToalvR「アド・ホック多相」という概念があって、
ここでは「ただしアド・ホック多相でないこと」という条件が暗黙に付いている
ということですか?
0251デフォルトの名無しさん
2015/08/10(月) 16:08:40.11ID:C7dCXIlE問題の部分のちょっと前で暗黙どころか明確に否定している気が…
> The intuitive expIanation of this result is that r must work on lists of X
> for any type X. Since r is provided with no operations on values of type X,
> all it can do is rearrange such lists, independent of the values containedin them.
> Thus applying a to each element of a list and then rearranging yields
> the same result as rearranging and then applying a to each element.
0252デフォルトの名無しさん
2015/08/10(月) 18:26:41.48ID:6CToalvR> 問題の部分のちょっと前で暗黙どころか明確に否定している気が…
特に以下の部分のことでしょうか?
>> Since r is provided with no operations on values of type X,
>> all it can do is rearrange such lists, independent of the values containedin them.
そういう意図なのだろうと思うのですが、
「r: ∀X. List(X) -> List(X)」だけではその意図を正確に形式化できていないのではないか?
と疑問なのですが。。。
0253デフォルトの名無しさん
2015/08/10(月) 19:25:00.79ID:aurF6Aj80254デフォルトの名無しさん
2015/08/10(月) 19:25:52.09ID:aurF6Aj80255デフォルトの名無しさん
2015/08/10(月) 19:27:08.10ID:xfbTbnyl0256デフォルトの名無しさん
2015/08/10(月) 19:32:28.40ID:G+nIt1Sd0257デフォルトの名無しさん
2015/08/10(月) 19:44:04.49ID:yZ3j9jzU0258デフォルトの名無しさん
2015/08/10(月) 20:02:43.98ID:G+nIt1Sd私(>>256)への質問でしょうか。
勘違いでしたらすいません。
普通の社会人です。
type family を調べていたら出てきましたが、type family は型族という訳があるのに
associated data type は訳がネット上に見当たらないので質問しました。
単純に「関連データ型」でググっても associated data type に関連する記事は見当たりませんでした。
0259デフォルトの名無しさん
2015/08/10(月) 20:31:37.97ID:P/rKXiwW0260デフォルトの名無しさん
2015/08/10(月) 20:54:08.85ID:yZ3j9jzU0261デフォルトの名無しさん
2015/08/10(月) 21:23:30.78ID:G+nIt1Sd誤解させてしまったようです。
勉強のために日本語訳を訊いたのではなく、
単に日本語ならなんて言うのだろうかと思っただけです。
0262デフォルトの名無しさん
2015/08/10(月) 22:11:23.36ID:6CToalvR正確に形式化できていないのではないか?という疑いは解けていないまま。。。
0263デフォルトの名無しさん
2015/08/10(月) 23:19:26.21ID:08na6m/L0264デフォルトの名無しさん
2015/08/11(火) 00:48:36.91ID:35SQIDRW0265デフォルトの名無しさん
2015/08/11(火) 06:26:59.37ID:hdf2tNQK0266デフォルトの名無しさん
2015/08/11(火) 06:30:12.53ID:hdf2tNQK0267デフォルトの名無しさん
2015/08/11(火) 06:36:13.99ID:l/j/VTng論文や入門書どころか2chのレスすら読めないのか?
0255 デフォルトの名無しさん 2015/08/10 19:27:08
形式化はイントロ以外の本論か、普通の型理論の入門書を読み直そう。
ID:xfbTbnyl(1)
0268デフォルトの名無しさん
2015/08/11(火) 08:39:19.79ID:cH2UxrcDアドホック多相は実体化する前に
["a", "b"] |-> ["a", "b", "b"],
[1, 2] |-> [2, 1]
のような単相のコードを仕込んでおかないと実体化できない
つまり型名だけでなくコードとか色々な情報を注入している
0269デフォルトの名無しさん
2015/08/11(火) 21:39:29.31ID:csNtDDNcそれらに共通の「多相」って何か言ってみろよ
0270デフォルトの名無しさん
2015/08/12(水) 10:32:15.38ID:E9Tw94sD君はなぜ自分より知識や教養が上の相手にタメ口なんだ
0271デフォルトの名無しさん
2015/08/13(木) 12:02:19.75ID:mwGqyG64答えられないのか?
ところで君はこのスレをご主人と崇める番犬なんだな?w
0272デフォルトの名無しさん
2015/08/13(木) 15:16:34.02ID:M3nW2qvPhttps://en.wikipedia.org/wiki/Polymorphism_(computer_science)
0273デフォルトの名無しさん
2015/08/13(木) 15:18:03.14ID:d32APRUA0274デフォルトの名無しさん
2015/08/13(木) 15:24:02.22ID:Po5dRgtj単相は昔からみんな知ってたやつなので分かりやすい
0275デフォルトの名無しさん
2015/08/13(木) 15:52:21.18ID:Gt0qYtbNおまえみたいなダメ学生のレポート代筆を誰が手伝うかってことです。
0276デフォルトの名無しさん
2015/08/13(木) 16:02:02.25ID:Gt0qYtbN自我が肥大してしまっていつしか
「わからなくてもコツコツ勉強するのは大事」
「世の中わからんこともある」
「わからんのは、教え方が悪いからとは限らず、自分の知力の限界かもしれない」
というようなことを認めようとしないまま中途半端な歳まで来ちゃうと限りなくアウトに
近い。
妙に肥大した自我と釣り合いを取るために、「わたしには
知性も教養も欠けてるのでどうか憐れむと思って教えてください」
の一言が出せずに煽ることしかできない、そういう喧嘩腰が
いつまでも通じると思ってる時点で社会知性が低すぎてダメ。
コンビニのバイトですら務まらないレベル。
狭いサークルで褒められまくっていたせいか、妙な自信と
プライドだけは高いんだが中身はスッカスカ。
たまに親切な誰かが丁寧に教えてやっても礼の一言も述べず
「ふーん、なんか結局モナドって合成できないからプログラミングにとって致命的じゃん」
とか、言ってる本人にも意味不明なワードサラダめいたポエムを投げることしかできない。
0277デフォルトの名無しさん
2015/08/13(木) 19:19:34.10ID:mwGqyG64君どうしちゃったんだ?w
本題についてだけ静かに語ればいいんだよ
0278デフォルトの名無しさん
2015/08/13(木) 19:56:35.31ID:Gt0qYtbNまあそんなに落ち込むな。
0279デフォルトの名無しさん
2015/08/13(木) 20:09:47.48ID:kVSCQFgg0280デフォルトの名無しさん
2015/08/13(木) 20:16:46.88ID:cFZHcgXb0281デフォルトの名無しさん
2015/08/13(木) 23:59:10.02ID:/TT2ZElL毛の壁宛なんだろうが、なんとなく流れ弾に中った感がある
0282デフォルトの名無しさん
2015/08/14(金) 06:57:25.05ID:UKR1Ens3ルールがなければ勝ち目のない相手にもルールを守らせれば勝てるからなんだよな
0283デフォルトの名無しさん
2015/08/15(土) 12:23:13.66ID:fL/PzS3/0284デフォルトの名無しさん
2015/08/15(土) 14:50:11.24ID:U2H5mvyM「勝ちたいのならルールを作る側になれ」てよく言うじゃん
そういう意味で体育会系を束ねるのは楽だけどな
0285デフォルトの名無しさん
2015/08/15(土) 16:27:38.46ID:fL/PzS3/0286デフォルトの名無しさん
2015/08/15(土) 19:01:57.66ID:ijksDLQOカモリーマン相手の自称ベテランコンサルタントが言いそうな言葉っすね。
そういうゴミみたいな言葉を頭に突っ込むとゴミみたいな考えしか出てこないゴミ頭になります。
0287デフォルトの名無しさん
2015/08/15(土) 19:48:49.12ID:LE4LycT30288デフォルトの名無しさん
2015/08/15(土) 20:18:09.10ID:R9hEcy+Ehttp://hackage.haskell.org/package/base-4.8.1.0/docs/src/GHC.Base.html#local-1627391929
どうやって作るんだこれ…
0289デフォルトの名無しさん
2015/08/15(土) 21:16:49.43ID:2DqmJ2ZCプロは他人が作る仕様 (変更) を予知するべき
0290デフォルトの名無しさん
2015/08/16(日) 03:11:32.19ID:uK7XPl3A0291デフォルトの名無しさん
2015/08/16(日) 06:31:17.72ID:aYrENx1aすげぇなw
https://dl.dropboxusercontent.com/u/7687891/join_to_Monad/join_to_Monad.html
0292デフォルトの名無しさん
2015/08/16(日) 18:29:05.94ID:Vkg3e5dl若干長いけど良い記事だよね。
0293デフォルトの名無しさん
2015/08/17(月) 23:42:32.36ID:E8Zlkk8dとても素直な気持ちのいい記事だね
0294デフォルトの名無しさん
2015/08/18(火) 17:03:51.11ID:j5KExTo2今だとHaskellの入門書としてお勧めってどれになるんです?
0295デフォルトの名無しさん
2015/08/18(火) 22:53:30.76ID:1H/7a1LXいろいろとか言っても Monad が Applicative になったとかそんな程度じゃないの?
0296デフォルトの名無しさん
2015/08/19(水) 03:34:39.76ID:fY37jaweMonad m => m (m a, m b) -> (m a, m b)
ってできるっけ?
0297デフォルトの名無しさん
2015/08/19(水) 03:58:30.08ID:fY37jawejoin . liftA (uncurry (liftA2 (,)))
0298デフォルトの名無しさん
2015/08/20(木) 02:59:44.72ID:UVdNs5g4> (++) <$> (Sum (42::Int), "apple"::String) <*> (Sum 13,"banana")
(Sum {getSum = 55},"applebanana")
> let flipP (a,b) = (b,a)
> (++) <$> (writer $ flipP (Sum (42::Int), "apple"::String)) <*> (writer $ flipP (Sum 13,"banana")) :: Writer (Sum Int) String
WriterT (Identity ("applebanana",Sum {getSum = 55}))
--
現状、
writer :: Monad m => (a, w) -> WriterT w m a
になってるが、
writer :: Monad m => (w, a) -> WriterT w m a
だったら上記の例のflipPが要らない。
0299デフォルトの名無しさん
2015/08/20(木) 07:37:43.38ID:hMgOl3Olその問いに正解はない
0300デフォルトの名無しさん
2015/08/21(金) 01:40:51.70ID:fXEaGRk/ビッグエンディアン: しばしばリトルエンディアンより優れているとされる
0301デフォルトの名無しさん
2015/08/21(金) 22:08:23.86ID:oak8Xfw5エンディアンを切り替えられるバイエンディアンプロセッサ。
0302デフォルトの名無しさん
2015/08/22(土) 00:31:10.13ID:EXDcUcnUttp://www.amazon.co.jp/圏論-原著第2版-Steve-Awodey/dp/432011115X/
あとこれも、
ttp://www.amazon.co.jp/圏論の歩き方-圏論の歩き方委員会/dp/4535787204/
以前の数学セミナー(だっけ?)の連載のまとめだと思うけど。
{- 間違えて sc の方に書き込んだら、まるっきり反応がなかった。 -}
{- で、.net で再投稿 -}
0303デフォルトの名無しさん
2015/08/22(土) 01:20:33.93ID:OQor0U0W>圏論を初期の学部生に教授することは強い反対にあっている。
にわかに圏論の勉強を始めない方が良い?
0304デフォルトの名無しさん
2015/08/22(土) 01:53:23.77ID:PkWehqCK0305デフォルトの名無しさん
2015/08/22(土) 03:47:42.60ID:N1uhek7+一言で言うと、Haskellのモナドや多相型の関数の概念を理解し使いこなす、つまり関数プログラミングの実務に圏論は全く必要ないし
知っていても何の役にも立たない、つまりは圏論はそのキーワードをひけらかしていい恰好したいだけの単なるファッションの飾りに過ぎない
他方、本当に計算の理論(例えば表示的意味論を展開する数学的構造な枠組みとしてのScottらの領域理論など)を
勉強して理解し将来的にはその分野で学術誌か国際会議に論文の1つでも通したいのならば、圏論の勉強は不可欠
(Scott理論の古典的で基礎的な部分の学習だけならば別に圏論を知らなくとも一応はできるけれどね)
0306デフォルトの名無しさん
2015/08/22(土) 07:42:28.65ID:pHk1lnIKその説明もなんか変なんだよな
いい恰好したいなら金持ちか政治家になればいいのに
なんで批判する側もされる側も学者を標的にするのかさっぱりわからない
0307デフォルトの名無しさん
2015/08/22(土) 10:28:17.35ID:bUf5bCJ1知っていても何の訳にもたたない。つまり熱力学だとかカルノーサイクルを勉強してるやつは
カッコつけたいだけのファッションバカにすぎない。
ブレーキは踏めば止まる、エンジンはなんかガソリン入れときゃ動く、ラジエーターだとか
よくわからんものはガソリンスタンドでチェックしてもらえばいいし、タイヤの空気圧が下がってる
事の意味もガソリンスタンドの人が注意してくれるし、物事が動く原理というのは
全く知る必要がない。
原理厨はなにかとあれこれ勉強しないとわからん言って脅してくるけど、俺達は反知性主義の
旗を掲げて徹底抗戦だ。
0308デフォルトの名無しさん
2015/08/22(土) 10:33:20.58ID:XZXv5ALV0309デフォルトの名無しさん
2015/08/22(土) 10:39:12.14ID:Hb7eGyOr0310デフォルトの名無しさん
2015/08/22(土) 11:04:44.83ID:bUf5bCJ10311デフォルトの名無しさん
2015/08/22(土) 11:07:41.75ID:Hb7eGyOrとか
「〜だけ」
とか
「〜にすぎない」
が多用されてる文章は確かに反知性主義的な感じがする。
0312デフォルトの名無しさん
2015/08/22(土) 12:08:13.94ID:pHk1lnIKミニマリストが反知性の手口を学べばそっくりそのまま応用できる可能性が高い
0313デフォルトの名無しさん
2015/08/23(日) 09:18:45.96ID:bL4DWVex宣伝乙(良い意味で)
0314デフォルトの名無しさん
2015/08/23(日) 09:57:28.55ID:LhCUqlmjどこで違いが出てくるの?
0315デフォルトの名無しさん
2015/08/23(日) 11:44:34.87ID:28kORioTHaskは圏のなかでもやや特殊。型付のラムダ計算なんかを抽象化して得られる
圏と近い。例えば、Hask圏では A, B という対象に対して A->B という対象を作れるが、
このような性質は「一般の圏」にはない。
0316デフォルトの名無しさん
2015/08/24(月) 02:49:24.38ID:UcMD+ccy0317デフォルトの名無しさん
2015/08/24(月) 08:58:11.78ID:kCQmOeKa0318デフォルトの名無しさん
2015/08/24(月) 11:27:43.78ID:/WF09MBN俺達先進国の人間はベトナムの優秀なIT技術者を時給50円で死ぬまで使えば良いからだ。
そもそも何かを学ぶということは人間の自然に反する。言語を捨て、文明を捨て、原始に回帰すること
こそ人類の究極の目標である。
0319デフォルトの名無しさん
2015/08/24(月) 11:43:02.32ID:OjRQ25eS個人の人生のテーマなんぞは、本人にしか関係ないし、他人からしたらどうでもいいこと
お前が知識が要らないと考えるなら、そうすればいいし、俺らには関係ない、お好きにどうぞ
機能性を追及することが、人類の永遠のテーマなのです
分かりやすく言えば、100人の人間が集まって、その100人で、どういう機能を果たすか、ということ
昨今コミュニケーション能力が高らかに叫ばれるのは、そういうこと
ここで、知識は手段に過ぎず、目的になりえない
0320デフォルトの名無しさん
2015/08/24(月) 12:00:06.78ID:kCQmOeKaマイナス60人は1人よりも小さい
0321デフォルトの名無しさん
2015/08/24(月) 12:08:55.77ID:OjRQ25eS0322デフォルトの名無しさん
2015/08/24(月) 13:50:02.35ID:1q9FvsVIhttp://haskellformac.com
0323デフォルトの名無しさん
2015/08/24(月) 13:50:44.81ID:twgtagYC0324デフォルトの名無しさん
2015/08/24(月) 13:51:24.77ID:twgtagYC0325デフォルトの名無しさん
2015/08/24(月) 19:00:25.78ID:pjiRa/zc0326デフォルトの名無しさん
2015/08/24(月) 19:03:26.28ID:/WF09MBN圏論厨を滅ぼすまではダメです
0327デフォルトの名無しさん
2015/08/25(火) 02:06:08.16ID:YISO+qUP0328デフォルトの名無しさん
2015/08/25(火) 02:10:41.85ID:YISO+qUP0329デフォルトの名無しさん
2015/08/25(火) 07:15:28.00ID:oMRqhMXwC++使えよ
マクロじゃなくてテンプレートを使うんだぞ
0330デフォルトの名無しさん
2015/08/25(火) 10:27:27.34ID:Vmm9VscjそれはむしろHaskellをやればCCCがすぐ分かるということだ
Haskellをやっても圏論は分からないという例はないの?
>>316
いやその逆で、圏論の学習の替わりにhaskellが使えるか?ということなんだが
0331デフォルトの名無しさん
2015/08/25(火) 11:52:16.03ID:oMRqhMXwPerlをいくら完璧に学習しても「OOPを正しく理解していない」と見做される
0332デフォルトの名無しさん
2015/08/25(火) 12:14:07.00ID:Vmm9VscjOOPは茫漠とした思想みたいなもんだが圏論は違うだろ?
0333デフォルトの名無しさん
2015/08/25(火) 13:33:39.80ID:oMRqhMXwみんなで共有する知識はそういう怪しいものばかり
なので個人で頑張る
0334デフォルトの名無しさん
2015/08/25(火) 14:11:55.34ID:nys8WXaqHaskellの話に圏論絡めてくる奴は皆殺しにしろとか言い出す
僕みたいな反知性主義者が「答え合わせ」に参加すると結論が歪む。
0335デフォルトの名無しさん
2015/08/25(火) 15:35:47.03ID:YISO+qUP0336デフォルトの名無しさん
2015/08/25(火) 21:13:15.88ID:nys8WXaqつうほうせんといてや〜
0337デフォルトの名無しさん
2015/08/26(水) 01:43:51.18ID:fE8RXalP0338デフォルトの名無しさん
2015/08/26(水) 08:31:04.41ID:NnDRip21そうやな!圏論いらんわ。
だいたいあいつらちょっと数学が得意だからって調子こいてるよな。
0339デフォルトの名無しさん
2015/08/26(水) 12:27:26.78ID:W/3BVY4r圏論だと思って使わなくても圏論の概念は使うことになるし。
逆に言えばわざわざ圏論を学ばんでもどうせ触れるっつー話でもある。
俺ら日本語の文法をわざわざ学んでから喋っとるわけちゃうみたいに、
実用から入っていけばなんとなく自然な使い方もわかるようになるで。
まあ、どっちから入門してもかまへん。
ただ、圏論から入っていくやつをあえてディスるんはやめよで。
0340デフォルトの名無しさん
2015/08/26(水) 13:44:56.04ID:31UMARGP0341デフォルトの名無しさん
2015/08/26(水) 14:45:58.21ID:gQwT5cTuhaskellのモナドを人に教えるときに圏論の話を絡める奴は全く信用できん、という程度の話。
0342デフォルトの名無しさん
2015/08/26(水) 14:54:08.52ID:H1SEqDeZ>>338
>>339
君たち、
「Haskellやモナドを使うのに圏論を知っておく必要は全然ない」てのはよく聞くけど
それって、「そんなの知らなくてもできる仕事は一杯あるからね、下流底辺に。
上流の仕事は圏論が分かる層がやるから気にしなくていいよ。」ってニュアンス?
0343デフォルトの名無しさん
2015/08/26(水) 15:30:11.46ID:W/3BVY4r「最初からハードル上げるな」という話。
Haskell でプログラミングするだけなら圏論を意識することはない。
圏論で言ってることというのは意識せずとも使える程度のものでしかないんだよ。
ただ、そこに明確な定義を与えて名前を付けたのが圏論という学問領域になってるだけ。
言うなれば数学界のデザインパターンが圏論。
先に Haskell を実用している人が圏論みても、
あ〜このパターンってこういう名前がついてんのね〜、ってくらいの感想だろうよ。
0344デフォルトの名無しさん
2015/08/26(水) 15:57:11.19ID:W/3BVY4rそれを学ぶことを無意味と切り捨てることはできない。
圏論として学ばなくても誰かのコードを読んでいるときに知るということもあるだろうから、
圏論という形で学ぶ必要は必ずしも無いけど、
まあほどほどに Haskell を使えるようになった頃に一度くらい斜め読みしてもいいんじゃないのかねとも思う。
上手く使えるようになったつもりでもさー、全然知らなかった概念が頭の中に湧いて出てくるってことはないんだよ。
たとえ話で言えば、字を早く書きたくてペンの性能を目いっぱい追求して満足な結果が出るとするじゃん?
そしたら世の中には実はタイプライターがありました、ワードプロセッサがありました、っていう感じ。
0345デフォルトの名無しさん
2015/08/26(水) 16:14:34.56ID:9WcNfeqJ0346デフォルトの名無しさん
2015/08/26(水) 16:39:39.65ID:U9Ynnj38342のように自由というニュアンスを理解できない人が多い
で、自由ってよくわからんから全部義務にしようということで圏論まで強制されてしまう
0347デフォルトの名無しさん
2015/08/26(水) 16:50:54.29ID:W/3BVY4rほどほどでいいならほどほどの知識でいいっていう当たり前の話だよな。
文章にきちんとまとめて発表しようとすると使う言葉が圏論の世界のものに
なってしまうからどうしてもそういう言葉を目にしてしまうだけで。
0348デフォルトの名無しさん
2015/08/26(水) 21:07:20.44ID:2om2SE560349デフォルトの名無しさん
2015/08/26(水) 21:21:20.27ID:6+xCvXdx0350デフォルトの名無しさん
2015/08/26(水) 22:58:54.24ID:H1SEqDeZ自由とか義務とかの問題じゃないだろw
能力の問題
>>347
やっぱりHaskellより圏論の方が高度wってことね
0351デフォルトの名無しさん
2015/08/26(水) 23:36:27.51ID:NnDRip21「俺は圏論をまったく知らないが、モナドを自由に使えてる。だから圏論は必要ない」
以上です。
0352デフォルトの名無しさん
2015/08/26(水) 23:47:35.06ID:H1SEqDeZ反知性主義者か。ええなあ。がんばってや
0353デフォルトの名無しさん
2015/08/27(木) 05:45:42.82ID:hpMNnVK0その圏論を知らずにモナドを自由に使えているあなたが仮に圏論を学べば、
モナドを人に上手く教えたりもっと
自在にモナドを操れるようになるのかも知れないね。
0354デフォルトの名無しさん
2015/08/27(木) 05:55:16.94ID:V7YRDu0j0355デフォルトの名無しさん
2015/08/27(木) 07:04:42.40ID:gHMFOOrZその例を一つ二つ挙げてみてよ
0356デフォルトの名無しさん
2015/08/27(木) 07:15:24.26ID:MMHzsuN9ただ型推論を使って動的型付け言語のレベルに追いつけるかどうかの問題
0357デフォルトの名無しさん
2015/08/27(木) 07:48:02.01ID:2fn5iyFt0358デフォルトの名無しさん
2015/08/27(木) 07:58:41.43ID:MMHzsuN90359デフォルトの名無しさん
2015/08/27(木) 08:41:46.96ID:TbOH8VLZ0360デフォルトの名無しさん
2015/08/27(木) 08:53:04.69ID:2fn5iyFtffiで各々が呼びだせば解決する程度の話をする頭の悪さ
0361デフォルトの名無しさん
2015/08/27(木) 09:24:03.24ID:MMHzsuN90362デフォルトの名無しさん
2015/08/27(木) 09:57:44.93ID:8/UVeoJ+0363デフォルトの名無しさん
2015/08/27(木) 11:07:03.44ID:2fn5iyFtすまんが放射能語ではなくて日本語で頼む
0364デフォルトの名無しさん
2015/08/27(木) 12:31:59.92ID:a/U6YIqaFreeモナドが、Stateが、Parsec.ParsecTが、あるいはXMonad.Core.Xがどういうモナドなのか、圏論が教えてくれることはない。
VisitorとSingletonとIteratorと各々を学ばなきゃ使えないのに、デザインパターンという言葉の意味にだけ耽溺する奴とよく似ている。
よっぽど学術的なことをしたいか、さもなければ馬鹿だ。
俺は「純粋関数型言語で副作用はどう書けばいいのか」という初学者の質問に「IOモナドがー」と馬鹿な答を書く馬鹿がこのスレにいたのをよく覚えている。
ttp://blog.jle.im/entry/io-monad-considered-harmful
スノッブ共からモナドや圏論の言葉を取り戻さないといけない。
0365デフォルトの名無しさん
2015/08/27(木) 12:51:13.31ID:a/bxJDEM結局どう使うかはほとんど説明されてなかったり
0366デフォルトの名無しさん
2015/08/27(木) 12:59:12.92ID:SD+R1pbM実際あんまり使わないからだと思う。
それに、本当に状態操作が欲しいなら素直にSTモナド使うほうがいい。
0367デフォルトの名無しさん
2015/08/27(木) 14:07:36.44ID:V7YRDu0jどういうモナドかは当然それぞれの性質があるんだろうけど、
共通する性質があってそれをモナドというパターンに当てはめてるんだから、
モナドがどういうものかは知らんと話にならんだろう。
デザインパターンに過剰にこだわるのが害悪の場合はあるが、説明に使う言葉に何を使えばいいっていうんだ?
っていうか、基礎的な質問ならキーワードとなる言葉を与えてウェブ検索させるってのは普通のことだろう。
共通認識できる「名前」が重要で、それが圏論由来のものであろうがそうでなかろうが重要じゃない。
既についている名前があるなら新しい言葉を発明することにどれだけ意味があるっていうんだ?
0368デフォルトの名無しさん
2015/08/27(木) 15:20:33.74ID:/PZRaFKUMonads for functional programming
Philip Wadler, University of Glasgow
No knowledge of category theory is required to read these notes.
0369デフォルトの名無しさん
2015/08/27(木) 15:33:29.45ID:sT+Vb4Anうんうん、それもまた反知性主義だね!
反知性主義者たちがどんどん集まってきてうれしい。
Haskell界で声がでかい人で圏論にハッキリ嫌悪感を示してる人って山本センセぐらいしか
いないんで、貴重な同士だわ〜
0370デフォルトの名無しさん
2015/08/27(木) 15:38:27.37ID:sT+Vb4Anなんか糖衣にくるんで圏論に誘導しようとしてるような感じがして嫌だな。
参考文献に悪名高いMoggi(こいつのせいで調子こいて圏論言うやつが計算機科学に入ってきた)
が挙がってるし、ろくなもんじゃないだろ。
そもそも反知性主義者である俺は英語論文を読むなどというスノビズムに染まった行動には断固として反対なのだ。
日本男児なら日本語で語れ!
0371反知性主義者
2015/08/27(木) 15:40:14.71ID:V7YRDu0jdscじょぎkdさkjgdskげj子rイオdsgkあd祖gsだ
j御k自ソアdgjポdsjgぴおdsあぽgだぽあ
0372デフォルトの名無しさん
2015/08/27(木) 15:44:45.48ID:a/bxJDEMまあStateモナドは確かにそうなんだけど
そういう意味じゃなくてSTモナドも含めてきっちり実用面まで含めて状態計算関連の説明してる所ってほとんどないよね、ってことが言いたかった
ソース読めって言われればそれまでだけど
0373デフォルトの名無しさん
2015/08/27(木) 15:48:48.19ID:sT+Vb4An``It is doubtful that the structuring methods presented here would have been
discovered without the insight afforded by category theory.''
とか言い出してるあたりで、「あーこいつ自分が圏論を知ってますアピールしとるな」
と分かるじゃん。心の底では「Moggiくらいお前ら読めよ」とか思ってるわけ。
自分では圏論信者なんだけどそれは小乗の教えだとか密教だと思ってるわけ。
それで、大乗というか大衆バージョンの教えとして「ほら経典なんか勉強しなくても
この車輪を手で回すだけで救われますよ」とか大衆をバカにした布教をしてるんだよね。
そういう態度がいちいち鼻につくからね、圏論厨はキモいんですよ。
0374デフォルトの名無しさん
2015/08/27(木) 15:59:38.82ID:V7YRDu0j圏論的背景があるのはどうしたって動かせないだろう。
真髄を理解したければ圏論は必要じゃないか。
真髄は必要ない、ただ使えればいいっていう人向けの情報が嫌なら
もう Haskell 使うなよとしか言いようがないよ。
0375デフォルトの名無しさん
2015/08/27(木) 17:02:40.00ID:SD+R1pbMSTモナドはIOモナド理解してればそのまま使えるよね?
そして、IOモナド・STモナドの仕組みは原理としては別に難しくない
0376デフォルトの名無しさん
2015/08/27(木) 17:06:24.88ID:6g/R3ZXuそろそろ裏でどういう理論づけがあるのかなーみたいなことを知りたくなってきたのですが、
何かしらおすすめのルートはございますか(普通に圏論に入門してみればいいの?)
0377デフォルトの名無しさん
2015/08/27(木) 17:37:41.46ID:a/U6YIqa初心者が聞く「モナドって何?」っていう質問に圏論的な説明はじめるのは迂遠過ぎてhaskell難しいっていう印象しか残せない。
単に「中の値を直接取り出せないようなコンテナ型であっても、その中身を(安全に)操作、合成するための技法」の1つであると言えばいいのに、
それを「何故モナドという名前なのか」という意味に曲解し、そこだけ説明したり訂正したりする奴がいるから、haskellの真髄は圏論であると勘違いする人が出てくる。
圏論じゃなくて型付けラムダ計算あるいはSystemFがhaskellの基礎でしょ。
Control.MonadやControl.Categoryはあくまでも利便性を高めるためにあるもの。無くても不便なりに使える。
>>376 なので、haskellのコアな部分というなら型理論を学べば良い。ライブラリの中には圏論をベースにしたものがあるから、そっちの理論的背景を学びたいなら圏論を学べば良い。
圏論は間違ってもマクレーンの本からはじめない方がええ。最近ならもっといい(例が数学的過ぎない)文書がネット上にもある。
日本語だったら前スレにも出てた↓とか。
http://nineties.github.io/category-seminar/#/
0378デフォルトの名無しさん
2015/08/27(木) 18:03:40.63ID:sT+Vb4An自分は反知性主義を掲げて圏論厨を批判してるけど、「なぜモナドという名前なのか」とか言い出す
圏論厨は見たことない。
マクレーンが隠れ哲学厨だったんで範疇論から名を借りてcategory とつけた分野に、
ついでにライプニッツの単子論から名前を借りて(こっちはもう本当に名前を借りただけ)
monad と呼んだだけで意味とか全くないし。
それまでは triple と呼ばれてたんでまともな複合語が作れないという問題があったから
モナドと呼ぶほうがマシじゃんぐらいの意味しかない。
ほらね、圏論ってのは意味がないんです。やめましょう。
0379デフォルトの名無しさん
2015/08/27(木) 18:34:38.62ID:75t8dyUl型クラスがなくても(->)は存在する
(->)がなければMonadもCategoryもない
0380デフォルトの名無しさん
2015/08/27(木) 18:35:35.68ID:sT+Vb4An圏論はやらんほうが人生を有効に使えると思いますが、人生を無駄にしたいというなら
Benjamin C. Pierce "Basic Category Theory for Computer Scientists"
あたりはお勧めできます。ただしモナドは載ってません。とはいうものの索引まで入れて100pなので
圏論がどんなものか概観するにはちょうど良いでしょう。100pもあんのかよ、というツッコミもあるでしょうが
ラムダ計算の領域理論のための議論も含まれてるので、Hask圏をゆるっと理解したい程度なら
領域理論の準備の箇所を飛ばせばいいと思います。
他に、もうすぐ共立から邦訳が出ますが
Steve Awody "Category Theory", 2nd ed.
あたりも好評のようです。非常に丁寧に書かれてる本ですが、丁寧ということは長ったらしいという
ことでもあり、いちいち説明が大仰だったりする感もないではないです。
みなさんも仰ってるとおり圏論なんてのは言葉づかいにすぎないわけで、日常会話程度なら
大げさな本で勉強せずともよろしいという人は、圏論の教科書ではありませんが
J. L. Bell "Toposes and Local Set Theories" ←Doverなのでそこそこ安い
の最初(一章)の20pぐらいまでを眺めるとよいでしょう。モナドは載ってませんが米田ぐらいまで一気に話が進みます。
Pierce とかBellをざっと眺めるぐらいの理解をしておけば
ttps://ja.wikibooks.org/wiki/Haskell/圏論
の議論は簡単に理解できるでしょう。理解したからといってHakellのコーディング能力は一ミリも伸びないと思うけど、
とりあえず「return,join でモナド実装するのがスッキリしてわかりやすいと思うな」とか言い出した奴に
ドヤ顔で「うんうん、圏論で言う eta, mu だね」と返せるようになります。
0381デフォルトの名無しさん
2015/08/27(木) 20:00:44.71ID:kht9K5Vg0382デフォルトの名無しさん
2015/08/27(木) 20:03:43.73ID:gHMFOOrZ反知性主義者というので期待してたが
結構知ってるよ的なので、ガッカリしたw
0383デフォルトの名無しさん
2015/08/27(木) 20:18:05.69ID:kht9K5Vg0384デフォルトの名無しさん
2015/08/27(木) 21:38:54.38ID:gHMFOOrZ> VisitorとSingletonとIterator
これらデザパタはクソなのだが、モナドも同類なのか?
>「純粋関数型言語で副作用はどう書けばいいのか」という初学者の質問に「IOモナドがー」
Moggiはじめ皆そう言ってきてるんだが違うの?
> ttp://blog.jle.im/entry/io-monad-considered-harmful
これモナドを全否定してるかと思ったらそうでもないので期待外れ
>>377
> 圏論じゃなくて型付けラムダ計算あるいはSystemFがhaskellの基礎でしょ。
圏論は後者とどう違うという認識?
0385デフォルトの名無しさん
2015/08/27(木) 21:59:24.02ID:b8i3sMHcありがとうございます。
なんかある程度勉強してからだと「あ、そういうことね」っていうふうになれそう
というのに最近出会ってちょっと悔しかったので、やってみます
0386デフォルトの名無しさん
2015/08/27(木) 22:16:22.24ID:kht9K5Vg0387デフォルトの名無しさん
2015/08/27(木) 22:41:39.44ID:sT+Vb4AnBenjamin C. Pierce "Types and Programming Languages" ですね。 "Basic Category Theory for Computer Scientists"
のようなコンサイスな本を書いた人がなぜこんな風に長ったらしく書いたのか不思議ですが丁寧な本ですね。
もう少し読者の数学的マチュリティを信頼して書いてくれたら簡潔になっただろうにと思うとそこんとこ残念ですが。
>>384
圏論と型付ラムダ計算との関係については、J. Lambek and P. J. Scott "Introduction to Higher Order Categorical Logic"
なんかを見ると良いと思います。
0388デフォルトの名無しさん
2015/08/27(木) 23:45:18.92ID:SD+R1pbMHaskellに関する限り、Ekmettが何してるのか理解したい時に
少し役に立つ程度だと思う。
0389デフォルトの名無しさん
2015/08/27(木) 23:58:49.19ID:Rek5NYGpラムダ計算とLisp・一階述語論理とPrologのような、その生い立ちに根源的に関っているもんじゃないからね
オナニーの道具としては最高なんだろう
0390デフォルトの名無しさん
2015/08/28(金) 04:26:11.78ID:SsK9tv390391デフォルトの名無しさん
2015/08/28(金) 10:12:07.75ID:ngZ5utA1「高校教育で女の子にサイン、コサイン、タンジェントを教えて何になるのか」
「社会の事象とか、植物の花とか草の名前を教えた方がいい」
ということになる。
0392デフォルトの名無しさん
2015/08/28(金) 14:21:25.95ID:UpW/wiba普通∀や∃も使うだろう
0393デフォルトの名無しさん
2015/08/28(金) 14:56:36.00ID:SsK9tv39関数の名前は知ってるけど内容は知らないんだろ
植物の名前でも同じことだ
名前ばっかり宣伝するのは本当に無意味だからやめればいい
0394デフォルトの名無しさん
2015/08/28(金) 16:13:34.32ID:hUebxbgg0395デフォルトの名無しさん
2015/08/28(金) 20:02:41.16ID:UpW/wibaちょっと話が面白くなってる気がするな
反知性主義者や山本さんやらが出てきて。
勿論知性主義者が出てきてもいいよ
あれを読めとか何かを教えてやったとかつまらんこと言わずに
自分の見解を言ってくれ
0396デフォルトの名無しさん
2015/08/28(金) 21:14:35.56ID:YaVx9p2Lおれはバカンス先のホテルで2冊も読んだらだいたい分かったよ
0397デフォルトの名無しさん
2015/08/28(金) 22:12:50.40ID:UpW/wiba「スゴイ」とか「分かった」という語句を使う点がなんだかなと思うが。。。
すぐに分かったと言うあなたとなかなか分からん奴とは何が違うと思うか語ってみてくれないか
0398デフォルトの名無しさん
2015/08/29(土) 14:46:46.88ID:bSBiDVBZ0399デフォルトの名無しさん
2015/08/29(土) 23:11:48.82ID:VDxSZNt2.cabal/config ファイルの documentation の項を True に設定すれば
cabal でインストールしたパッケージのドキュメントが追加され、
ドキュメントルート内にある index.html ファイルが更新されますが、
その際に index.html ファイルの更新のされ方を指定する方法はあるでしょうか。
具体的には、index.html に張ってあるリンクの URL をデフォルトから変えたいです。
たとえば、ただいま index.html 内の Data.List へのリンクの URL は、
最後 Data-List.html で終わっています。
これを base-4.8.0.0/Data-List.html のように文字列を加えたいのです。
.cabal/config ファイルにはパッケージのインストール先を指定する項目はありますが、
このようにドキュメントのリンクの URL を指定する項目は見あたらないようです。
不可能なのでしょうか。
0400デフォルトの名無しさん
2015/08/29(土) 23:27:12.74ID:UzL1ueYpたぶん、haddockセクションの html-location の項がそれ。
0401デフォルトの名無しさん
2015/08/29(土) 23:38:33.21ID:VDxSZNt2そこに文字列を入れ、いろいろなパッケージをインストールしてみましたが、
何も変わりませんでした。
0402デフォルトの名無しさん
2015/08/30(日) 00:01:23.79ID:U2/m8tQL-- html-location:
を
html-location: hoge
にしないといけないよ。
0403デフォルトの名無しさん
2015/08/30(日) 00:21:30.92ID:XpmQg4Hyもちろん、コメントは外しています。
0404デフォルトの名無しさん
2015/08/30(日) 00:38:28.61ID:XpmQg4Hyちなみに、cabal install --haddock-html-location='・・・' で直接指定しても何も変わりませんでした。
0405デフォルトの名無しさん
2015/08/30(日) 02:57:07.12ID:U2/m8tQL以前似たような質問をしてた方と同じ人ですか?
前回ともども、ろくすっぽ調べもせずテキトウに答えちゃってごめん。
いろいろ試してみたんだけど、どうやら無理っぽい。
html-locationはその時にインストールしたパッケージの内部のドキュメントのリンク先を変えるものらしい。
haddockにある別のオプションを変えることで、ドキュメント右上のContentsや、Indexの参照先を変えることはできた。
でも、ご所望の、パッケージが依存している別のパッケージのドキュメントへのリンクは、書き換えられないみたいだ。
すべてのパッケージのドキュメント位置の情報は、ghc-pkg が握ってる。
$ ghc-pkg field '*' haddock-html
...
haddock-html: /usr/local/Cellar/ghc/7.10.2/share/doc/ghc/html/libraries/array-0.5.1.0
haddock-html: /usr/local/Cellar/ghc/7.10.2/share/doc/ghc/html/libraries/base-4.8.1.0
haddock-html: /usr/local/Cellar/ghc/7.10.2/share/doc/ghc/html/libraries/bin-package-db-0.0.0.0
haddock-html: /usr/local/Cellar/ghc/7.10.2/share/doc/ghc/html/libraries/binary-0.7.5.0
...
これらの情報を参照して、haddockはパッケージのリンク先を書くんだと思う。
だから、やりたいことを実現するには、そもそもの依存パッケージの位置を変えるしかない。
(cabalを通して呼ばれるhaddockにだけその情報を渡す方法があるのかもしれないが、俺の調査ではわからなかった。
cabal installへのフラグ--haddock-option=--optghc=-package-db=hoge/.../package.conf.dなどを試したけど何も変わらず)
0406デフォルトの名無しさん
2015/08/30(日) 10:45:14.93ID:XpmQg4Hyこちらでは ghc-pkg field '*' haddock-html 出力と、
ドキュメントの index.html 内の各リンクの URL とが異なっています。
たとえば、ghc-pkg field '*' haddock-html の出力では
/usr/share/doc/ghc/html/libraries/array-0.5.1.0
/home/.../.cabal/share/doc/x86_64-linux-ghc-7.10.1/random-1.1/html
となっています。
前者は ghc インストール時にデフォルトで入っているパッケージ、
後者は cabal でインストールしたパッケージです。
ところが、/home/.../.cabal/share/doc/x86_64-linux-ghc-7.10.1/index.html では、
Data.Array へのリンクは /home/.../.cabal/share/doc/x86_64-linux-ghc-7.10.1/Data-Array.html
System.Random へのリンクは /home/.../.cabal/share/doc/x86_64-linux-ghc-7.10.1/System-Random.html
になっています。
.cabal/config がデフォルトの状態でこのようになります。
ちなみに、frames.html や doc-index-A.html などの中にあるリンクは正しいです。
また、各モジュール個別のページ内にある他モジュールへのリンクも正しいです。
トップの index.html 内のリンクだけがおかしいのです。
もう少しアプローチを変えて調べてみます。
ありがとうございました。
0407405
2015/08/30(日) 11:56:14.08ID:U2/m8tQL$ ghc-pkg field '*' haddock-html
ではなく、
$ cabal sandbox hc-pkg field '*' haddock-html
を呼んでください。
あと、405の時点では「haddockがghc-pkgを内部で呼ぶ」と思ってたんだけど、実は「cabal が haddock に依存先パッケージのドキュメントの位置を渡す」ということがわかった。
cabal install に --verbose=3 を渡して、haddockに渡っているオプションを見て気づいた。
cabal の --package-db オプションの値が、haddockへ --read-interface オプションとして渡されるらしい(ただし、sandboxにいるときは cabal install に直接package-dbを指示しても無視されるみたい)。
0408デフォルトの名無しさん
2015/08/30(日) 12:43:47.11ID:XpmQg4Hy問題が解決しました。
結論から言うと、最新版の GHC をインストールしたら治りました(7.10.1 --> 7.10.2)。
ここに私と似たような質問がありました。
http://comments.gmane.org/gmane.comp.lang.haskell.arch-linux/2119
要約すると、これはインストール時の設定などではなくもっと上流で起きている問題であり、
以前はオンラインドキュメントでも同じ問題が起きていて、GHC 10.7.2 で治ったそうです。
つまり、私は問題の根本が分からず、とりあえず config ファイルの設定によって URL を変えて一時しのぎをしようと思い、
その方法をここで質問しましたが、最新版で問題が解決され、質問の意味がなくなったということです。
私は ArchLinux を使用しており、GHC も cabal-install も ArchLinux のパッケージシステムを使用してインストールしていましたが、
ArchLinux のパッケージでは GHC の最新版はまだ 7.10.1 のままでした(ArchLinuxは最新版の提供が比較的早いはずなのですが・・・)。
そこで GHC の公式サイトから 7.10.2 をDLしインストールしたところ、デフォルトのライブラリドキュメントも、
その後で cabal でインストールしたライブラリドキュメントも、index.html が正しいリンクを張ってくれるようになりました。
実際のところは、ArchLinux のパッケージだったからまずかったのか、7.10.1 だったからまずかったのか分かりませんが。
cabal の挙動について詳しく解析していただいたのに活用できなくて申し訳ありません。
ただ、その解析方法や情報についてはとても勉強になりました。
ありがとうございました。
0409デフォルトの名無しさん
2015/08/30(日) 13:07:09.40ID:U2/m8tQLhaddockのバグだったのか(cabalではなく)。
haskellのツール周りは色々混み合っててよくわかんないなあ。
0410デフォルトの名無しさん
2015/08/30(日) 16:07:36.51ID:XpmQg4Hyそのデフォルトの定義をインスタンス定義の側から呼ぶことはできるでしょうか。
例えば下記のようなことがしたいです。
class Umai a where
level :: a -> Int
level _ = 3
data Nasu = Nasu
instance Umai Nasu where
level x = Umai.level x * 100
これは最後の Umai.level でコンパイルエラーが出ますが、ニュアンスは伝わると思います。
他にも、デフォルトと同じ挙動をさせたいが、Debug.Trace.trace 関数を仕込んで調査したい時とか。
0411デフォルトの名無しさん
2015/08/30(日) 21:36:21.87ID:/UH+7Zkmnewtype X10 a = X10 a
nasu = X10 (X10 ())
class Oldtype a where { oldtype :: a b -> b }
instance Oldtype X10 where { oldtype (X10 o) = o }
instance Umai a => Umai (X10 a) where { level x = level (oldtype x) * 10 }
0412デフォルトの名無しさん
2015/08/31(月) 00:21:09.78ID:VGvD8wHtdata Umai a = Umai { defaultLevel :: Int,
season :: Season}
data Season = Spring | Summer | Autumn | Winter deriving Eq
data Nasu
data Tomato
class Level a where level :: a -> Int
instance Level (Umai Nasu) where level = defaultLevel * 100
instance Level (Umai Tomato) where level = defaultLevel * (liftA (== Summer) season ?) 200 100
{--
> level (Umai 1 Summer :: Umai Nasu)
100
> level (Umai 1 Summer :: Umai Tomato)
200
> level (Umai 2 Summer :: Umai Tomato)
400
--}
0413412
2015/08/31(月) 00:22:07.09ID:VGvD8wHt{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances,TypeFamilies #-}
module Main where
import Control.Applicative
(412の中身)
instance Num n => Num (a -> n) where
(+)= liftA2 (+)
(-) = liftA2 (-)
(*) = liftA2 (*)
abs = liftA abs
signum = liftA signum
fromInteger = const . fromInteger
class Conditional q a where
type ConditionalExec q a
(?) :: q -> ConditionalExec q a -> ConditionalExec q a -> ConditionalExec q a
infixr 1 ?
instance Conditional Bool a where
type ConditionalExec Bool a = a
(?) b x y = if b then x else y
instance Conditional (a -> Bool) b where
type ConditionalExec (a -> Bool) b = a -> b
(?) = liftA3 (?)
main :: IO ()
main = print $ level (Umai 1 Spring :: Umai Tomato)
0414デフォルトの名無しさん
2015/08/31(月) 20:29:14.75ID:YNC36to9ありがとうございます。
そのままでは使えないのですが、考え方を参考にさせていただき、応用してみます。
ちなみに、さすがに Umai 型クラスにも、Nasu データ型にも手を加えずに実現する方法はないですよね。
0415デフォルトの名無しさん
2015/08/31(月) 21:06:33.97ID:BIyPIWGf手を加えてはならない場所に書くのはリスクが大きすぎる
0416デフォルトの名無しさん
2015/08/31(月) 21:21:39.09ID:YNC36to9すいません、そういう意味ではなくて、
Umai 型クラスに相当するものがライブラリで提供されていて、
こちらでは手が加えられないのです。
もし方法がないなら、ライブラリのソースはあるので、
アドバイスを参考に改変しようかと思います。
0417デフォルトの名無しさん
2015/09/02(水) 01:39:18.87ID:MPctfeu00418デフォルトの名無しさん
2015/09/02(水) 23:39:30.67ID:VgKb5GV5なんで君はいつも上目線なんだ
0419デフォルトの名無しさん
2015/09/03(木) 05:35:30.84ID:OYAV2gHU0420デフォルトの名無しさん
2015/09/04(金) 12:32:49.27ID:5HbwgMaM0421デフォルトの名無しさん
2015/09/04(金) 17:36:40.07ID:KCyhzv120422デフォルトの名無しさん
2015/09/04(金) 21:44:05.44ID:Ziq//RxQ対策
1.諦める
2.共有ライブラリを使う
from : ttp://downloads.haskell.org/~ghc/7.10.2/docs/html/users_guide/using-shared-libs.html
>4.13.1. Building programs that use shared libraries
>
>To build a simple program and have it use shared libraries for the runtime system and the base libraries use the -dynamic flag:
>
>ghc --make -dynamic Main.hs
0423デフォルトの名無しさん
2015/09/05(土) 17:50:27.56ID:zbNENDxsまず下記の関数を定義しました。
siplus :: String ->Int -> Int
siplus str num = read(str) + num
普通に使うと次のように動作します。
> siplus "1" 2
> 3
最初のStringを部分適用したものの型を調べると、こうなります。
> :t siplus "1"
> siplus "1" :: Int -> Int
ここで最初のStringではなく、2つ目のIntを部分適用したいと思った時、
例えばこんな書き方はできません。
> :t siplus _ 2
> エラー
しかしこれを中置関数として扱った場合、2つ目のIntのみを部分適用した
関数を作ることができてしまいます。
> :t (`siplus` 2)
> (`siplus` 2) :: String -> Int
これは一体どういうことなのでしょうか?
String -> Int -> Intの関数への部分適用でString -> Intの関数を作り出せてしまうのは、
カリー化の考え方から見て矛盾があると思います。
どういう理屈でこれは成り立っているのでしょうか?
0424デフォルトの名無しさん
2015/09/05(土) 18:08:50.90ID:NPRaO0u1普通の部分適用と区別して「セクション」と呼ばれている。
いずれにせよ、実体は (¥str -> siplus str 2) のようなラムダ式作るのと変わらん。
0425デフォルトの名無しさん
2015/09/05(土) 18:33:26.79ID:zbNENDxsなるほど、つまり中置記法の右側に値を置いたものは、
カリー化とは無関係で単にラムダの糖衣構文ってことなんですね。
0426デフォルトの名無しさん
2015/09/05(土) 18:40:53.83ID:NPRaO0u10427デフォルトの名無しさん
2015/09/06(日) 00:53:10.15ID:wfrbDpC50428デフォルトの名無しさん
2015/09/06(日) 08:00:48.38ID:SMmxtXxm1+が綺麗に書けるけど、そんなにこだわる機能じゃないと思う
むしろ二項演算子無くして前置に統一したほうがよく無いかな?
0429デフォルトの名無しさん
2015/09/06(日) 08:29:11.83ID:wfrbDpC5a * x + b
なんてのをまともに書けない言語はアカンでしょ
0430デフォルトの名無しさん
2015/09/06(日) 08:41:14.99ID:SMmxtXxm>a * x + b
つ (+ (* a x) b)
0431デフォルトの名無しさん
2015/09/06(日) 09:30:37.52ID:wfrbDpC5そういうのが好きならLisp使えばいいじゃん。。。
0432デフォルトの名無しさん
2015/09/06(日) 09:44:06.70ID:Vj9nK5xCそれは嘘です
後置演算子の直後の二項演算子はセーフ x! * y
二項演算子の直後の二項演算子はアウト x + * y
>>419
「本当か嘘か」を優先して考え「謙虚か傲慢か」などという雑念は捨てました
0433デフォルトの名無しさん
2015/09/06(日) 09:45:15.82ID:OmMBsRo+0434デフォルトの名無しさん
2015/09/06(日) 10:14:27.94ID:wfrbDpC5うーん、その例と「二項演算子は結合強度最弱の単項後置演算子とみなせる」
がどう矛盾するのかよくわからないです。
0435デフォルトの名無しさん
2015/09/06(日) 10:31:40.00ID:Vj9nK5xC結合強度を変えてもsyntax errorを覆すことはできません
0436デフォルトの名無しさん
2015/09/06(日) 10:59:37.29ID:wfrbDpC5x + * y
によってあなたが何を例示したのか正直まったく理解できないのです。
元ネタは外国のブログ記事だった気がするけど見つからないので自己流解説すると、
なんか二項演算子(算術に限らない。ここでは (#) とする。)があって、そのシグネチャは
(#) :: X -> Y -> Z
だとしますね。そうすると x : X に対して作られるセクション x # は Y -> Z という型を持つわけですね。
そうすると、結局「あたかも」
postfix #
(#) :: X -> (Y->Z)
と定義されていた「かのごとく」見れますねという話をしてるつもりです。
(Haskellでは自前の後置演算子は作れないので上のは嘘コードですが)。
0437デフォルトの名無しさん
2015/09/06(日) 17:00:24.15ID:Vj9nK5xCところが構文解析を見ると二項演算が存在する証拠が出てきたので理解できないと
0438デフォルトの名無しさん
2015/09/06(日) 20:34:02.72ID:2q2onHzVちょっと上のレスに出てるように二項演算子だと
# x
っていうように後ろの引数だけ適用もできることになってるからこれは後置単項演算子とは別物だよね
0439デフォルトの名無しさん
2015/09/07(月) 06:23:10.52ID:+vVUVgP4実装の話じゃないから困らないよな?と言われて困ることはある
{-# LANGUAGE #-} とか
0440デフォルトの名無しさん
2015/09/07(月) 21:31:00.77ID:mXAJW74Lに対して
構文解析では二項演算子が分けてあるんだよ
と言われても はあそうですか としかならないがな
なぜ構文解析上分けてあるかの理由まで示されると納得しそうだが
0441デフォルトの名無しさん
2015/09/07(月) 23:06:47.81ID:+gBmAsnfApplicativeスタイルを使うときに出てくる「途中の式」はそうやって考えるとわかりやすいね。
0442デフォルトの名無しさん
2015/09/07(月) 23:35:52.84ID:saV1gx5W今日はじめて知ったんだが、実は出来るぜ。
{-# LANGUAGE PostfixOperators #-}
data Currency = Yen Int deriving Show
(¥) :: Int -> Currency
(¥) = Yen
main = print (105 ¥)
{--
> :main
Yen 105
--}
0443デフォルトの名無しさん
2015/09/08(火) 00:02:16.96ID:FdaSRh76それが後置演算子だとすると
(2 +)と(+ 2) で(+)が別の演算子だということになってしまう。
数式の構文解析で(-)が単項演算子と二項演算子の両方に使われるせいで
BNFが無駄に複雑化するの知ってるでしょ?
同じことが(-)だけでなく二項演算子一般について大規模に生じてイヤなわけ。
0444デフォルトの名無しさん
2015/09/08(火) 04:52:37.64ID:5w88oMs5構文は理由より人気を優先した方がいい
どんな理由を示してもおそらくライバルの1.05倍くらいのメリットしか出てこない
一方、理屈抜きで人気投票すれば1000倍とか差がつく可能性がある
0445デフォルトの名無しさん
2015/09/08(火) 21:51:21.00ID:1BhJxNoGっていう話をよく聞くけど、納得いかない。
例えばMaybeモナドの中に値を入れても、fromJustで簡単に取り出せるし、
入れる時もJustで簡単に入るじゃん。
こんなユルユルの箱に入れたところで何が安全なの?
0446デフォルトの名無しさん
2015/09/08(火) 22:00:09.71ID:KAkZMLHa(IO は別)
0447デフォルトの名無しさん
2015/09/08(火) 22:03:02.01ID:gWCBxnxw箱の喩えでいうなら、その箱から中身を取り出したままでいられる仕組みは
モナドの範疇ではないよ。
Monad 型クラスのインスタンスであるその型に付随された
モナドとは何の関係もない機能だ。
0448デフォルトの名無しさん
2015/09/08(火) 22:04:03.13ID:FdaSRh76>「モナドは値を箱の中に入れるので外からは見えない、だから安全だ」
>っていう話をよく聞くけど、
そんな話を聞いた覚えがないのだが……
0449デフォルトの名無しさん
2015/09/08(火) 22:11:56.24ID:CPV+4Ywq安全だって言ってる文献を教えて欲しい
0450デフォルトの名無しさん
2015/09/08(火) 22:15:43.73ID:1BhJxNoGでも取り出す機能を簡単に付けられるのであれば、箱としての堅牢性は無いに等しいじゃん。
一回入れたらもう出せない!ってのならわかるけど。
>>448-449
IOモナドなんかそんな風に言われるじゃん。
でもIOモナドに入れた値だってfromJustで取り出せる。
0451デフォルトの名無しさん
2015/09/08(火) 22:17:47.80ID:FdaSRh76>IOモナドなんかそんな風に言われるじゃん。
>でもIOモナドに入れた値だってfromJustで取り出せる。
???
まず前半、聞いたことがない。そういうこと言ってる実例挙げられる?
後半、意味がわからない。
0452デフォルトの名無しさん
2015/09/08(火) 22:18:26.87ID:CPV+4Ywq「モナドは外からは見えないから安全」という話に思い込んだんじゃ?
0453デフォルトの名無しさん
2015/09/08(火) 22:20:00.08ID:1BhJxNoG0454デフォルトの名無しさん
2015/09/08(火) 22:20:30.14ID:CPV+4Ywq0455デフォルトの名無しさん
2015/09/08(火) 23:38:38.43ID:vkbbpybQパターンマッチでいつでも値取り出せるじゃん。って。
モナドはデストラクタを隠蔽するのが肝なんだよな。
だからparsecとかIOとかをみて、初めてありがたみがわかった。
0456デフォルトの名無しさん
2015/09/08(火) 23:44:27.36ID:FdaSRh76>モナドはデストラクタを隠蔽するのが肝なんだよな。
データ構築子のこと?
runXX の形でモナドの実体を取り出せるモナドは珍しくないし、
IOモナドもそこは変わらないよ?
IO aの実体をWorld -> (a, World)として取り出してもありがたくないだけで
>だからparsecとかIOとかをみて、初めてありがたみがわかった。
うーん、その感覚はさっぱり
隠蔽云々とは関係なくリストモナドだろうがIOモナドだろうがありがたいけどなあ
0457デフォルトの名無しさん
2015/09/08(火) 23:52:35.54ID:FdaSRh76Maybe a の値、つまりNothingによって集合aを拡大していることになるわけで、
この拡大された集合a+上の計算を、元々のaの計算から自然に与えることが
できるようなそういう拡大の仕方とその構造のことをモナドというわけ。
Maybeほどストレートではないけど、他のモナドも基本は一緒。
これはデータ構築子が公開されててパターンマッチできるかどうか、とか
或いはそれと等価な関数が公開されてるかどうか、とかとは関係のない話。
0458デフォルトの名無しさん
2015/09/09(水) 00:06:36.58ID:EJNsNdDh要するに
OOPでクラス関数で主に記述するってことと同じでしょ?
メンバ関数・変数をなるべく使わずに
何がすごいのかさっぱりわからない
0459デフォルトの名無しさん
2015/09/09(水) 00:14:15.49ID:15Wbqaqp誰が関数型言語使えと頼むじゃなし使わないと死ぬわけでもなし
0460デフォルトの名無しさん
2015/09/09(水) 00:50:04.74ID:+WsBDtotバグめっちゃ減るんすよwwww
その代わりコンパイル通りににくくなるんで慣れるまでめっちゃ苛々するんすけど
実行時にヘマするくらいならコンパイル失敗した方がマシだってことを学ぶんすよwww
もうC++は体力続かない
三ヶ月前のコードとか読みたくないでしょ
歳取ったらHaskellが良いって解りますよ
Haskellなら三ヶ月前のコード、また読んでみてもいいかなって、それはとっても嬉しいなって
0461デフォルトの名無しさん
2015/09/09(水) 01:57:38.90ID:rpodVdITなんていうか上手く言えないんだけど、例えば、
データ構築子がreturnとbindしか無くて、一方分解子、runの類いがたくさん提供されてるデータを考えてくれ。
どうだいそれって滅茶苦茶役に立たないだろ?
0462デフォルトの名無しさん
2015/09/09(水) 02:07:49.07ID:15Wbqaqp>データ構築子がreturnとbindしか無くて、一方分解子、runの類いがたくさん提供されてるデータを考えてくれ。
なにが言いたいのか理解できないが、いずれにせよreturn とbind があれば
他のはそれから定義できるんだからなにも問題ない
runXXの類がたくさん提供されてる、というのもよくわからんが、
それで有用性が損なわれるとはちっとも思えない
0463デフォルトの名無しさん
2015/09/09(水) 02:09:55.95ID:15Wbqaqpもし、returnでしか当該データ型の値が作れないならrunXX云々以前にそりゃ役には立たない
m a 型の計算が実質的に a 型の計算そのものに崩壊するからな
0464デフォルトの名無しさん
2015/09/09(水) 02:28:58.80ID:rpodVdITだからモナドにするならreturn以外にカスタムコンストラクタをたくさん提供するべき。
逆にコモナドなら、コンストラクタは少なくていい。けど、デストラクタはextractだけじゃだめ。
(俺は_ -> Hoge のヤツをHogeのコンストラクタ、Hoge -> _ をデストラクタって呼んでる。異端かもしれんが)
0465デフォルトの名無しさん
2015/09/09(水) 02:39:48.87ID:15Wbqaqp>だからモナドにするならreturn以外にカスタムコンストラクタをたくさん提供するべき。
いやまったくもって意味不明なんだけど
普通に型定義のデータ構築子がある以上、それを使えばいいんだし、
それらのデータ構築子から構成できないようなものもあり得ない
しかもなんで「べき」なわけ?
Maybe型が役に立たなかったことなんかないだろう
あと、勝手な自分用語振り回されても理解できない(するきになれない)
0466デフォルトの名無しさん
2015/09/09(水) 02:57:08.05ID:rpodVdITところでさ、ライブラリを作っていて、データの内部表現を公開したくない時があるじゃない?
あとでチューニングしたいときとか。そういう時にデータがモナドなら主に ... -> Hoge a を、コモナドなら Hoge a -> ... を提供する。
return / extract に加えて。
理由は、えー… 逆だと使いづらいから。
(たとえばMaybeなら、fromJustってあんまり使わないでしょ?)
0467デフォルトの名無しさん
2015/09/09(水) 02:58:54.11ID:FLIFW6sl荒らしかな
0468デフォルトの名無しさん
2015/09/09(水) 03:07:23.01ID:rpodVdIT理由が弱いので、もう少し考えると、
例えば、doの途中でrunして値を取り出して、その値で分岐して別のモナディックアクションにつなぐのは、計算量が無駄。
それを避けるためにモナド(手続きの抽象)がある、と俺は理解している。
0469デフォルトの名無しさん
2015/09/09(水) 03:13:59.62ID:15Wbqaqpパターンマッチで実体取り出されたくないとき
(実体に依存した利用をされたくないとき)、というのはあるからな
だが、「return に加えて」は意味不明だ
作ろうとするモナドが恒等モナド以上の何かであろうとする限り、
returnでは作れないようなモナド値を構成する方法を提供しなければならない
これは内部表現の隠蔽云々とは何の関係もない
そうしないと使いづらいからではなく、そうしないと恒等モナド以上の
機能を有し得ないから、だ
fromJustを使わない(データ構築子 Just のパターンマッチも使わない)、
というなら、コード全体がモナディックになってしまう
(もちろんnon-monadicなコードは恒等モナドによってまったく等価な
monadicなコードとして書けるが、普通はそんなことはしない)
はっきりいって、何が言いたいのか本当にわからない……
0470デフォルトの名無しさん
2015/09/09(水) 03:14:53.69ID:FLIFW6slこっちもすまん、>>466見る前に書き込んだから
0471デフォルトの名無しさん
2015/09/09(水) 03:20:21.85ID:15Wbqaqp>例えば、doの途中でrunして値を取り出して、その値で分岐して別のモナディックアクションにつなぐのは、計算量が無駄。
>それを避けるためにモナド(手続きの抽象)がある、と俺は理解している。
計算量(?)はほぼ変わらず、コードが見やすくなるだけだ
むしろ、コードの煩雑さを苦にしないならば
最初からモナドの実体を直接操作する方が余計な関数呼び出しと
そこでいう意味の「計算量」は減る
-- オーダー以外の意味で「計算量」を使われるのも違和感があるが
0472デフォルトの名無しさん
2015/09/09(水) 03:21:55.11ID:FLIFW6sl>例えば、doの途中でrunして値を取り出して、その値で分岐して
>別のモナディックアクションにつなぐのは、計算量が無駄。
>それを避けるためにモナド(手続きの抽象)がある、と俺は理解している。
別のモナディックアクションにつなぐのが計算量の無駄というのが、
わからんのだけど
よく言われるように、用途の文脈を明確にしたい場合に使ってる事が多いし
0473デフォルトの名無しさん
2015/09/09(水) 03:27:24.33ID:15WbqaqpReader モナドで、逐一runReaderを使い r->a 型関数に戻すのが手間だ、
くらいの意味だろう。そりゃモナドの中で計算を合成できる方がいいしが、
指摘の通り、手間や関数適用コストの僅かな定数的増大よりは、文脈を切らずに
連続させることの利益が目的でdo 記法を使うはずだ、と私も思う。
0474デフォルトの名無しさん
2015/09/09(水) 04:04:10.81ID:FLIFW6sl少し落ち着いて
>>473
それで意味がわかりましたが、自分も正に>>471と同じ事を思いました
モナド無くていいじゃん、と
0475デフォルトの名無しさん
2015/09/09(水) 05:16:14.00ID:k6Vctrbh「計算は論理の物質化である」
0476デフォルトの名無しさん
2015/09/09(水) 06:53:19.57ID:5v/OlT8AOOPがわかってもC++がさっぱりわからないのと同じ
C++がわかればstaticメンバが何の役に立つのかわかる
0477デフォルトの名無しさん
2015/09/09(水) 07:44:14.88ID:yxoakRA/0478デフォルトの名無しさん
2015/09/09(水) 11:27:05.24ID:Gx2jhnq10479デフォルトの名無しさん
2015/09/09(水) 11:44:28.09ID:15Wbqaqp持ってる有用なデータ型が多いことがHaskellでのプログラミングの進展に
よって後になってから判明したから
後付で用意されたんで、元からあるMonadの定義には手を付けなかった
0480デフォルトの名無しさん
2015/09/09(水) 15:58:18.64ID:Q+d8J0F/藁人形を殴るのやめろ
0481デフォルトの名無しさん
2015/09/09(水) 18:35:43.48ID:wpO/WxMyunboxedが最速かと思ったがもう一つ隠し玉があるのか
0482デフォルトの名無しさん
2015/09/09(水) 20:47:23.14ID:yxoakRA/0483デフォルトの名無しさん
2015/09/09(水) 20:48:31.78ID:15Wbqaqp0484デフォルトの名無しさん
2015/09/11(金) 17:09:38.98ID:yMgx5TOb0485デフォルトの名無しさん
2015/09/11(金) 18:51:03.18ID:KUqdYwfeStateは、状態をあとづけでつける場合に使われるからモナド変換子なのかなぁ。。。?
0486デフォルトの名無しさん
2015/09/11(金) 19:36:27.09ID:v/2h2RVh0487デフォルトの名無しさん
2015/09/11(金) 20:01:00.74ID:2FuYRHxlMaybe a = Either () a
Just x = Right x
Nothing = Left ()
みたいな話?
0488デフォルトの名無しさん
2015/09/11(金) 20:39:04.30ID:v/2h2RVh0489デフォルトの名無しさん
2015/09/12(土) 09:02:59.99ID:8GXyupq5大抵それは「前例のない規模で前例を踏襲する」ことだ
0490デフォルトの名無しさん
2015/09/12(土) 09:43:20.01ID:UPPQquvW「前例のある規模で前例を踏襲することができない」よりはいいんじゃね
0491デフォルトの名無しさん
2015/09/12(土) 20:12:10.06ID:XAqQ9sMD軽トラをCADで拡大して4tトラックになるんだったら仕事なくなる
実際には現実世界の各種係数があって、そっちはスケールしないので無理なわけだが
CAD内でデータを拡大しても、重力やら鉄の剛性やら法律やらetcの
現実世界まで一緒に拡大されるわけではないからな、不整合が起こる
0492デフォルトの名無しさん
2015/09/12(土) 22:59:42.17ID:8GXyupq5拡大できない現実が悪いか、拡大できると言う虚言癖が悪いかを判断できないバカが多い
0493デフォルトの名無しさん
2015/09/13(日) 13:03:42.57ID:kiB/x+KN0494デフォルトの名無しさん
2015/09/13(日) 14:50:26.51ID:mhOIQ8p/だから○○は止めろとグチを言って前へ進まないのはただの甘えです。
ところで、GCがゴミを回収するタイミングを制御する方法はあるでしょうか。
たとえば、ある関数を評価しようとしないとGCが動かないようにできる、みたいな。
ステージクリア型のゲームを作っていると、ステージプレイ中はGCを止めて、
クリアしたりミスしたタイミングで一気にゴミ回収したいことってありませんか?
他にも、3DCGツールを作っていて、レンダリング中ではなく完了後にゴミを回収したい、とか。
0495デフォルトの名無しさん
2015/09/13(日) 15:44:15.42ID:x1dh+v5mGC止めるのはできないはず
System.Mem以下の関数で明示的に起動することはできる
RTSオプションの -I フラグ辺りを見るといいのかもしれない
0496デフォルトの名無しさん
2015/09/13(日) 17:52:56.94ID:m/zohjMNあるある
入力待ちに入る瞬間に軽くGCしといて欲しいとか考える
0497デフォルトの名無しさん
2015/09/13(日) 22:09:38.34ID:mhOIQ8p/ユーザーガイドを見てみました。
なるほど、そのオプションでアイドルになってから
GCが自動起動するまでの時間を指定できるのですね。
この値を非現実的な大きな値にすれば、結果的にperformGC関数で
意図したタイミングでGCを起動できることにならないか、と。
試してみます。
ありがとうございました。
0498デフォルトの名無しさん
2015/09/17(木) 15:51:54.68ID:B1grEVzP0499デフォルトの名無しさん
2015/09/18(金) 01:29:26.35ID:wjuvkHJc0500デフォルトの名無しさん
2015/09/18(金) 13:33:55.01ID:YvxDAq3A0501デフォルトの名無しさん
2015/09/18(金) 15:57:30.16ID:hYbUwCNL0502デフォルトの名無しさん
2015/09/18(金) 17:03:07.30ID:4VBZsKU6騙されたというならもっとこう、嘘を絶対に許さない的な理念があるべきじゃないのか
人を分類して煽り合うだけでは嘘は無くならないだろう
0503デフォルトの名無しさん
2015/09/18(金) 19:10:38.07ID:YvxDAq3Aプログラミングの話をしてくれ
0504デフォルトの名無しさん
2015/09/18(金) 22:09:52.30ID:dOXUeH6Yうまい嘘をつくためにも使えちゃうか
0505デフォルトの名無しさん
2015/09/18(金) 23:39:24.36ID:hYbUwCNL0506デフォルトの名無しさん
2015/09/18(金) 23:58:08.05ID:bAzDgVJCその置換と同等な巡回置換のリストを得る関数 cperms :: ([a], [a]) -> [[a]] を作りたいのですが、泥臭くなってしまいます。
例えば、集合 {x, y, z, w} に対して置換 {x, y, z, w}-->{x, w, y, z} があるとします。
(本来ならば置換は上下に並べて表記したいところですが、これで勘弁してください)。
この置換は2つの巡回置換に分けられ、ひとつは x を x に置換するの巡回置換 [x]、
もうひとつは y を w に、 w を z に、z を y に置換する巡回置換 [y, w, z] です。
なので、cperms ([x, y, z, w], [x, w, y, z]) = [[x], [y, w, z]] となります。
私の考え方は下記のような単純なものです。
引数のタプルの第1要素を置換前リスト、第2要素を置換後リストとします。
置換前リストの先頭要素から次のように順にスキャンします。
0. 置換前リストの先頭要素を a1 とする。
1. 置換前リストの a1 と同じ位置にある置換後リストの要素を a2 とする。
2. 置換前リストの a2 と同じ位置にある置換後リストの要素を a3 とする。
・・・
n. 置換前リストの an と同じ位置にある置換後リストの要素を a[n+1] とする。
a1 == a[n+1] ならば [a1, a2, ..., an] を巡回置換のリストとする。
置換前・置換後の各リストから辿った要素を取り除いた新たな2つのリストを作りタプルにする。
そのタプルに対して再び cperms 関数を適用し、結果を先ほど作った巡回置換のリストと concat する。
泥臭く感じるのは2点。
ひとつは、a1 を覚えておいたり、構築中の巡回置換リストを保存するなどのために
いくつものアキュムレータを付けた再帰関数を作っている事。
もうひとつは、置換前リストや置換後リストから要素を探すときにいちいち先頭から順に探している事。
宣言的とはとても言えないコードになってしまうなですが、良い方法はないでしょうか。
0507デフォルトの名無しさん
2015/09/19(土) 03:37:04.08ID:ygsDvVju憲法守れ!検閲反対!憲法守れ!検閲反対!
検閲する側の人間を支持していてこれか
脳みそ入ってないでしょ
0508デフォルトの名無しさん
2015/09/19(土) 08:31:20.34ID:oTM0A26u0509デフォルトの名無しさん
2015/09/19(土) 09:58:08.46ID:UoEBemSSf :: Eq a => a -> [(a,b)] -> Maybe (b, [(a,b)])
f _ [] = Nothing
f x (y:ys) = if x == fst y then Just (snd y, ys) else fmap(id***(y:))(f x ys)
-- (***) a b (c, d) = (a c, b d)
0510デフォルトの名無しさん
2015/09/19(土) 11:38:35.20ID:9U4PsEMd右から順に書いてしまう (極端には filter even 書いてからその左に length . って書き加える)
んですが、これは慣れてもそういうもの?
それともそのうち「最終的に欲しいのはこれだから」みたいに左から書くようになる?
0511デフォルトの名無しさん
2015/09/19(土) 11:55:02.12ID:uMEyIMVB今はタイプするのが楽だから左から書いてるけど
一度右からの流れを思い浮かべてから逆順をたどるように書くみたいにしかできてない
左から考えられるようになるものなのか?そもそもなるべきなのか?どうなんだろう
0512デフォルトの名無しさん
2015/09/19(土) 12:03:35.61ID:dgpmJE92右から左に思考の順番通り書くので何の問題もない。
カーソルの戻りがイヤで左から右にしたいなら
(>>>) :関数合成演算子( . )の引数が逆になった演算子(Control.Category)
とか
(&) :関数適用演算子($)の引数が逆になった演算子(Data.Function)
とかを使えばいいよ。
簡単な短いものはボトムアップで考えて関数合成の連鎖で直接書いてしまうし、
複雑な関数は「欲しいのはこれだから」みたいにトップダウンで定義を考えて
(where節がどんどん入れ子になる感じで)書いていく。
0513デフォルトの名無しさん
2015/09/19(土) 12:36:41.64ID:UoEBemSS0514デフォルトの名無しさん
2015/09/20(日) 00:25:40.61ID:6c+MIwD/0515デフォルトの名無しさん
2015/09/20(日) 09:21:19.17ID:ZXXgaQ/Pレスが遅くなってすいません。
その関数 f の意図が今一分からないのですが、
例えば f 2 [(2, 4), (3, 2), (1, 1), (4, 3)] とやってみると結果は
Just (4, [(3, 2), (1, 1), (4, 4)]) となるのですが、
これは意図通りの結果でしょうか?
0516デフォルトの名無しさん
2015/09/20(日) 09:23:48.87ID:ZXXgaQ/P>>509
間違えました。
> 例えば f 2 [(2, 4), (3, 2), (1, 1), (4, 3)] とやってみると結果は
> Just (4, [(3, 2), (1, 1), (4, 4)]) となるのですが、
結果は Just (4, [(3, 2), (1, 1), (4, 3)]) になります。
0517デフォルトの名無しさん
2015/09/20(日) 10:33:01.14ID:nVyOckkY[(2, 4), (3, 2), (1, 1), (4, 3)]の先頭の(2, 4)はfを使わなくても処理できるので
そこでfを使う意図はありません
次の段階でf 4 [(3, 2), (1, 1), (4, 3)]のような使い方を意図しています
0518デフォルトの名無しさん
2015/09/20(日) 11:37:14.05ID:629ydc810519デフォルトの名無しさん
2015/09/20(日) 12:05:14.46ID:OSUmrGRkググればしっくりくる解き方があるんじゃないかな
0520デフォルトの名無しさん
2015/09/20(日) 12:24:31.09ID:oJTeEA6y0521デフォルトの名無しさん
2015/09/20(日) 12:40:33.83ID:629ydc810522デフォルトの名無しさん
2015/09/20(日) 13:13:36.11ID:ZXXgaQ/Pすいません、やはり意味がよく分かりません。
関数 f の各引数と戻り値の意味を教えていただけないでしょうか。
0523デフォルトの名無しさん
2015/09/20(日) 13:40:26.01ID:ZXXgaQ/P恥ずかしながら初めて聞いた名称だったので調べてみました。
確かに、置換を有向グラフとみなせば、強連結成分分解で解けますね。
今、そのアルゴリズムの詳細を調べているところです。
ただ、私の問題の方が制限がきついので、実際はもう少し特化した方法がとれると思います。
グラフと見なしたとき、全てのノードについて出る辺と入る辺はちょうど1つずつです。
なので極大もなにも一通りにしか分解できませんし、探索中に戻る必要もありません。
>>521
総当たりというのが具体的にどのような処理を指しているのか分かりませんが、
それは結局 >>506 になるのではありませんか?
0524デフォルトの名無しさん
2015/09/20(日) 16:52:06.13ID:KBlLbBcH多少は手続き的っぽくない感じで定義してみた
計算量のことなんも考えてないので泥臭さでは全く負けてないけどw
置換は[0..(n-1)]に対する任意の置換を[Int]で与えるものとする
import Data.List (nub, nubBy, sort, transpose)
cperms :: [Int] -> [[Int]]
cperms ns = nubBy unique . (map nub) . transpose . (take n)
$ iterate (map (ns!!)) [0..(n-1)]
where n = length ns
unique xs ys = (sort xs) == (sort ys)
-- cperms [0,3,1,2] => [[0], [1,3,2]]
長さnの一般の置換に対して、[0..(n-1)]の各要素をn回、順に置換していって、
軌道に分けて(transpose)、無駄な重複を削除して結果を得る
unique関数では「2つの巡回置換が本質的に等しい」を判定したいんだけど
毎回ソート2回やるより速い方法が絶対あると思う(メモ化するとか)
0525デフォルトの名無しさん
2015/09/20(日) 17:24:46.74ID:9hEz0Smr文芸誌「新潮」4千部増刷 筒井康隆さんの長編小説掲載
http://www.asahi.com/articles/ASH9K61F1H9KUCVL01X.html
新潮社は17日、文芸誌「新潮」10月号(初版8900部)の4千部の増刷を決めた。
同号には筒井康隆さんの長編小説「モナドの領域」が掲載され、本人がツイッターで「わが最高傑作にして、おそらくは最後の長篇(ちょうへん)」とつぶやくなど話題となっていた。
0526デフォルトの名無しさん
2015/09/21(月) 00:14:56.43ID:bf3bKAE/import Data.Tree (flatten)
cperms (a,b) = map flatten $ scc $ buildG (minimum a,maximum a) $ zip a b
cperms ([1,2,3,4],[1,4,2,3]) -> [[2,4,3],[1]]
0527デフォルトの名無しさん
2015/09/21(月) 00:49:50.78ID:jrn4ktsfg (x, ys) = maybe ([], ys) (((x:) *** id) . g) (f x ys)
h [] = []
h ((x,x'):ys) = uncurry (:) . ((x:) *** h) . g $ (x', ys)
cperms (xs, xs') = h (zip xs xs')
0528デフォルトの名無しさん
2015/09/21(月) 12:16:42.04ID:/2p4upNwグラフで言えば、n個の各ノードから1歩ずつ辿ってスタート地点に戻りn個の輪っかを作る。
最後に本質的に同じ輪っかを1つとみなして輪っかを集める感じですか。
分かりやすいですし、発想が面白いですね。
2つの巡回置換が本質的に等しいことを判定する部分(unique)は、
ys ++ ys の中に xs にマッチする部分があるかどうかを、
xs を先頭から1要素ずつずらしながら調べれば O(n) の計算量でいけますね。
しかしそれ以前に、O(n^2) の nub を n+1 回行っているので、
要素数が増えてくると焼け石に水かもしれませんが・・・
>>526
調べてみたのですが、強連結成分分解の計算量は O(|V| + |E|) なんですね。
(実際にこのライブラリの実装がそうなっているかは未調査のため分かりませんが)
巡回置換への分解が強連結成分分解の特殊バージョンだと分かっていれば、
このコードはとてもシンプルで、何をやっているかも一目で分かるので良いと思います。
ただ、>>524 も >>526 も、集合が整数の連続した列と一対一に対応できること前提なのですね。
まぁ、集合をリストで表現できる時点で要素に番号付けは可能なので、
テーブルか何かでも作っておけば、理論上は整数の巡回置換のリストから元の要素へ戻せますが、
手間と処理時間は少しだけ増えそうです。
0529デフォルトの名無しさん
2015/09/21(月) 12:18:24.09ID:/2p4upNwh (zip xs xs') の簡約をノートに書いていって、処理がやっと理解できました。
結果的に、ひとつの巡回置換の先頭 2 要素のうちの最初のひとつを h で、
次の要素を g で取り出しているのがやや気になります。
あと、1 要素から成る巡回置換を作ることになる場合、
(x, x) :: [...] というパターンから処理を始めますが、
最初の x を h で取り出して、次の x を g で取り出してから、
残りのリスト [...] から g で取り出した x があるかを調べますよね。
そこも少し気になるところです(そこには無いと分かっているから)。
以上の部分をもう少しシンプルにできそうな気がするので考えてみます。
みなさん、いろいろな方法でアドバイスくださり、ありがとうございました。
参考にします。
0530デフォルトの名無しさん
2015/09/21(月) 13:35:14.19ID:/2p4upNw冷静に考えてみれば、いろいろ最適化できそうですね。
たとえば、unique は >>528 よりもっとシンプルになります。
巡回置換リストは、元の集合(を表したリスト)を類別します。
つまり、巡回置換リストのある要素リスト内の任意の要素は、
巡回置換リストの他の要素リスト内には存在しません。
よって、unique xs ys は elem (head xs) ys と同値です。
map nub では、nub は要らないです。
この部分の nub で要素が消えるのは、要素が繰り返し循環している部分です。
たとえば、nub [2, 3, 2, 3] = [2, 3] という感じに。
これ以外にここの nub で要素が消えるパターンはありません。
なので nub xs は、ここに限れば takeWhile (/= head xs) xs と同値です。
これで、O(n^3) から O(n^2) になりました。
せっかくなので、ひとつ残った nub をどうにかしたいところですね・・・
0531デフォルトの名無しさん
2015/09/21(月) 13:40:59.32ID:/2p4upNwと思ったのですが、iterate (map (ns !!)) [0 .. n-1] の部分で O(n^3) でしたね。
連投失礼しました。
0532デフォルトの名無しさん
2015/09/21(月) 18:54:41.45ID:gEmyCLgu(´・_・`)自分が思ったことを素直に表明してるだけで、特段ネトウヨに加担してるつもりはないと思うよ
0533デフォルトの名無しさん
2015/09/22(火) 01:49:24.05ID:xlNSF2Nbレッテル張り
相手を馬鹿にした言動
完全に田中はネトウヨでしょ
0534デフォルトの名無しさん
2015/09/22(火) 06:06:26.79ID:3/1FxAoT同じことを何回も言うのはそれがレッテルであろうがなかろうが問題がある
レッテルを貼ることが問題だというのは多分嘘だろう
本当の問題は連呼すること
0535デフォルトの名無しさん
2015/09/22(火) 07:17:58.47ID:rRTVDkU90536デフォルトの名無しさん
2015/09/22(火) 15:24:02.83ID:cGE1lXHQ0537デフォルトの名無しさん
2015/09/22(火) 18:49:33.73ID:cCHjzu4f>他人の意見を鵜呑みにするより自分で考えてるだけでネトウヨ
いや、まさに他人の意見を鵜呑みにしてるだろw
0538デフォルトの名無しさん
2015/09/22(火) 20:56:50.42ID:ADm2wL+10539デフォルトの名無しさん
2015/09/22(火) 20:59:08.65ID:ADm2wL+10540デフォルトの名無しさん
2015/09/22(火) 21:29:48.50ID:cCHjzu4f0541デフォルトの名無しさん
2015/09/23(水) 13:39:43.66ID:18dgrDRGfmapとかnewtypeコンストラクタとかは最終的に欲しいものというよりむしろ
欲しくないものを検出するために書いてるだけだから
慣れないと感じるのは順序とは別の問題かもしれない
欲しいものの記述のみに集中できる言語があればいいんじゃないか
0542デフォルトの名無しさん
2015/09/23(水) 13:44:57.16ID:OAr0MdsU>欲しくないものを検出するために書いてるだけだから
0543デフォルトの名無しさん
2015/09/23(水) 23:08:22.19ID:mLvEhcU80544デフォルトの名無しさん
2015/09/24(木) 00:22:27.55ID:NkCijieZ反復関数系でフラクタル図形等に応用される
サンプルがあったので研究してみたのですが
値構築子の関数に固有の法則を持たせて
値構築子のタプルの値を使って演算する様ですが
構築子の値に関数をCONSで繋げるという手法が理解できず
何か参考になる文献を知っていましたら教えて下さい。
data Decision = (Int, Double) :-> DecFun
type DecFun = Int -> [Int]
d1 :: Decision
d1 = (1, 0.25) :-> \f -> []
dList = [d1,d2.....](このリストを処理する関数内でDecFunを匿名関数にして処理)
0545デフォルトの名無しさん
2015/09/24(木) 04:46:59.67ID:ZG5YRh3S0546デフォルトの名無しさん
2015/09/24(木) 05:50:31.24ID:eomUiX/2関係ない話は自分のブログでやってろボケ
0547デフォルトの名無しさん
2015/09/24(木) 08:34:06.00ID:Z+e1DhYA0548デフォルトの名無しさん
2015/09/24(木) 08:52:18.74ID:Uo3c7c9s元のサンプルplz
0549デフォルトの名無しさん
2015/09/24(木) 17:39:46.80ID:wr9fetd/色々やってんじゃん
0550デフォルトの名無しさん
2015/09/24(木) 18:00:44.34ID:t2o+8nOY0551デフォルトの名無しさん
2015/09/24(木) 19:16:38.77ID:9+DIf2hV0552デフォルトの名無しさん
2015/09/24(木) 20:30:38.41ID:NkCijieZすみません。反復関数系のソースは以下です。
import System.Random
type Length = Rational
data ABCTerm = A | B | C
data DP = DP {len :: Length, state :: State, key :: Int}
data State = S1 | S2 | S3 | S4
data Term a b = NnT (a,b) | Mod String (Sentence a b) (Sentence a b) | Par String
type Sentence a b = [Term a b]
type Prb = Double
data Direction a b = (a, Prb) :-> DirFunc a b
type DirFunc a b = b -> Sentence a b
--grammar
abcDir :: [Direction ABCTerm DP]
abcDir = [
(A, 0.5) :-> \p -> [NnT (A, p)],
(A, 0.5) :-> \p -> [NnT (A, h p), NnT (A, h p)],
(B, 0.5) :-> \p -> [NnT (B, p)],
(B, 0.5) :-> \p -> [NnT (B, h p), NnT (B, h p)],
(C, 0.5) :-> \p -> [NnT (C, p)],
(C, 0.5) :-> \p -> [NnT (C, h p), NnT (C, h p)]
]
rFact x p = p{len = len p * x}
h = rFact 0.5
q = rFact 0.25
applyDir :: (Eq a) => [Direction a b] -> StdGen -> (a,b) -> (StdGen, Sentence a b)
applyDir dirs g (c,d) =
let ds = filter (\((c',p) :-> df) -> c'==c) dirs
(p,g') = randomR (0.0::Double, 1.0) g
in (g, [NnT (c,d)])
0553デフォルトの名無しさん
2015/09/25(金) 05:08:31.79ID:LEPedfxV0554デフォルトの名無しさん
2015/09/25(金) 07:23:04.47ID:JLRSSQVwこうですか?わかりません
0555デフォルトの名無しさん
2015/09/25(金) 07:35:12.90ID:4M3b8xA3もう産経くらいしか見れるものがない
0556デフォルトの名無しさん
2015/09/25(金) 08:02:54.93ID:791H3qBg0557デフォルトの名無しさん
2015/09/25(金) 08:28:12.92ID:8yN1LKRy0558デフォルトの名無しさん
2015/09/25(金) 08:41:47.24ID:JLRSSQVw0559デフォルトの名無しさん
2015/09/25(金) 17:27:22.42ID:VsxADiNC合計値が非負であることが数学的に証明済みの計算結果が負になることもあります
困りました
0560デフォルトの名無しさん
2015/09/25(金) 19:08:14.22ID:8yN1LKRyHaskell関係ないよね。どっちかというと数値計算の話題だと思う。
0561デフォルトの名無しさん
2015/09/25(金) 19:28:04.32ID:VsxADiNCHaskellにそういの巧いことやってくれるライブラリありませんか?
0562552
2015/09/25(金) 21:21:39.52ID:1bSV3maEどうもありがとうございます。
もっとハスケル学習してから解読してみます。
パタンマッチ用に記号を鰓が出ない範囲で構成しただけなのかもしれません。
0563デフォルトの名無しさん
2015/09/25(金) 23:01:07.26ID:8yN1LKRyHaskell万能だと思いすぎじゃね?
0564デフォルトの名無しさん
2015/09/26(土) 00:37:50.07ID:wQKcUgTw0565デフォルトの名無しさん
2015/09/26(土) 06:29:16.50ID:b2xSHmqn彼女もできない
0566デフォルトの名無しさん
2015/09/26(土) 12:13:32.50ID:NeyxRrj3君がそのライブラリを作ればいい。(ドヤッ)
0567デフォルトの名無しさん
2015/09/26(土) 15:17:28.36ID:9aiso459浮動小数点使わずに計算を進めて最後の最後に浮動小数点にすればいい。
data Logarithm = Log Ratio
みたいな型と、Logarithmに関する計算法則を関数で定義してやればいいだけ。
後はインターフェースを使いやすくしてライブラリとして公開だ!
0568デフォルトの名無しさん
2015/09/26(土) 18:49:49.80ID:NeyxRrj3logsumexp みたいな問題ってそれだけで解決するんだろうか(疑問)
0569デフォルトの名無しさん
2015/09/27(日) 11:14:14.50ID:76rcq1HUここに、persistent-sqlite-2.2 をインストールしようしてもできません。
以下が cabal install persistent-sqlite コマンドの出力です。
Resolving dependencies...
In order, the following would be installed:
persistent-2.2 (reinstall) changes: aeson-0.9.0.1 -> 0.10.0.0
persistent-sqlite-2.2 (new package)
cabal: The following packages are likely to be broken by the reinstalls:
yesod-persistent-1.4.0.3
yesod-form-1.4.4.1
yesod-auth-1.4.6.1
yesod-1.4.2
persistent-template-2.1.3.4
Use --force-reinstalls if you want to install anyway.
試しに cabal install --force-reinstalls persistent-sqlite をしてみましたが、
警告通り yesod 関係のパッケージが壊れ、Yesod モジュールが import できなくなりました。
しかたがないので、今は yesod を --force-reinstalls して(表面上は)元の状態に戻しています。
どのようにすれば、yesod と persistent-sqlite が両立できるでしょうか。
0570デフォルトの名無しさん
2015/09/27(日) 13:42:31.02ID:A9loNygEライセンスファイルまで作ってくれるのはいいけど、テンプレートいじらないとBSD固定だし。
0571デフォルトの名無しさん
2015/09/27(日) 21:10:40.71ID:4V+mGekM0572デフォルトの名無しさん
2015/09/28(月) 20:50:38.43ID:7GFvCUeK一度全て綺麗さっぱりとアンインストールして stack を入れてみたところ、
yesod も persistent-sqlite も問題なくインストールできました。
しかし、今度はライブラリ ドキュメント関係で問題が発生しました。
まず ghc-7.10.2 をインストールし、それから stack(ArchLinux なので haskell-stack)をインストールしました。
stack を使って ghc をインストールしても良かったのですが、今回はこの順でやりました。
それから、stack haddock コマンドでライブラリ ドキュメントをインストールすると、
~/.stack/snapshots/x76_64-linux/lts-3.7/7.10.2/doc/index.html
からドキュメントが見られるのですが、stack で入れたライブラリのドキュメントしか一覧にありません。
初めに ghc をインストールした時に付随していたライブラリ、
例えば Data.List や System.IO などのモジュールのドキュメントが同じ所には見当たりません。
cabal install --enable-documentation コマンドでインストールした時は、
上記のモジュールも、新しく入れたモジュールも、全てのモジュールが、
ライブラリ ドキュメントのトップページに載っていました。
今の stack ではそのような事はしてくれないのでしょうか。
0573デフォルトの名無しさん
2015/09/28(月) 21:59:53.85ID:zeW+fSKN0574デフォルトの名無しさん
2015/09/28(月) 22:15:50.09ID:7GFvCUeK今の状態からはもう直せないのでしょうか。
0575デフォルトの名無しさん
2015/09/29(火) 03:02:05.70ID:EIRExeCg0576デフォルトの名無しさん
2015/09/29(火) 03:03:41.97ID:EIRExeCg0577デフォルトの名無しさん
2015/09/29(火) 04:11:33.49ID:2Slpmx/K[x,y] <- span (\i -> i < 3) [1 2 3 4 5]
print y
みたいに、spanの結果を束縛したいんだけど、型が合わない。
doの中で、モナドじゃない普通の関数の戻り値を束縛する方法を教えて下さい。
<$>とか<*>で頑張ればできるんでしょうか?
0578デフォルトの名無しさん
2015/09/29(火) 05:03:04.88ID:On1dpniqletを使えばよい
span :: (a -> Bool) -> [a] -> ([a], [a]) に注意
main = do
let (x, y) = span (\i -> i < 3) [1, 2, 3, 4, 5]
print y
0579デフォルトの名無しさん
2015/09/29(火) 05:17:34.09ID:Pz1/YzO9main = do
print y
where
(x, y) = span (\i -> i < 3) [1..5]
0580デフォルトの名無しさん
2015/09/29(火) 05:59:19.36ID:cx9spjlF0581デフォルトの名無しさん
2015/09/29(火) 15:10:52.01ID:2Slpmx/K> 579
そうか、無理にIO ([a],[a])にしようとしないでletを使えばよかったのか・・・。
早朝から回答ありがとうございました。
そして書き込み直後に寝落ちしてごめんなさい。
0582デフォルトの名無しさん
2015/09/29(火) 16:05:00.10ID:2Slpmx/Kの意味がやっとわかりました。
タプルだったんですね。
main = do
(x,y) <- (span (\i -> i < 3)) <$> return [1..5]
print y
でできました。
0583デフォルトの名無しさん
2015/09/29(火) 20:19:07.38ID:QEsaWW2p純粋な値をわざわざ return して <- で束縛(正確には違うけど)するのはよくない。
純粋な値の束縛にはlet を使おう(whereでもいい)。
あと、細かいことだが
¥i -> i < 3
とは書かずに
(< 3)
と書く(中置演算子のセクション記法による部分適用)。
0584デフォルトの名無しさん
2015/09/29(火) 21:47:48.05ID:7/IBEyg80585デフォルトの名無しさん
2015/09/29(火) 21:53:11.97ID:GFX2Obuddo 構文というものはそうだからとしか言いようがない。
Haskell Language Report とかちゃんと見てる?
0586デフォルトの名無しさん
2015/09/30(水) 00:13:44.19ID:lhq6Kj3alet ... in を使いたければ do 構文に先行して書く必要がある。
というか、do 構文中に出現するletは do構文に先行するlet ... in の糖衣構文。
なんでそうなってるのかというと、大雑把にはdo構文の解糖を簡単にするため。
# where派より
0587デフォルトの名無しさん
2015/09/30(水) 00:43:40.23ID:7+kRPL7SF#由来の |> 演算子もいいと思う。
0588デフォルトの名無しさん
2015/09/30(水) 01:54:07.34ID:VeSxtbXl0589デフォルトの名無しさん
2015/09/30(水) 11:12:27.89ID:YNt8mKMb0590デフォルトの名無しさん
2015/10/01(木) 03:27:55.14ID:tMJ2X2AQ0591デフォルトの名無しさん
2015/10/01(木) 15:39:45.50ID:avwvrY6P{-# LANGUAGE GADTs #-}
data Foo a where {
Foo :: (Integral a) => a -> Foo a
}
-- ↓これはエラーになる!
instance Functor Foo where {
fmap f (Foo x) = Foo (f x)
}
--- ↓これはOK
class IntegralFunctor f where {
ifmap :: (Integral a, Integral b) => (a->b) -> (f a) -> (f b);
}
instance IntegralFunctor Foo where {
ifmap f (Foo x) = Foo (f x)
}
しかし制約のついた型をファンクタやらモナドやらの枠組みで扱いたいことってあるんですけど、
どうにかしてうまいことすりぬける技とかってないですかね。
0592デフォルトの名無しさん
2015/10/01(木) 21:58:04.58ID:J0wqCUi10593デフォルトの名無しさん
2015/10/02(金) 04:55:22.76ID:UReGaTQgやっぱりなじまないから非推奨扱いなんですかね。
0594デフォルトの名無しさん
2015/10/02(金) 17:31:14.47ID:FPOS40TH人間ではなくシステムの工夫が足りないと言い出したらなんのための制約かわからない
0595デフォルトの名無しさん
2015/10/02(金) 21:11:53.24ID:xHUlQErn0596デフォルトの名無しさん
2015/10/03(土) 10:59:58.12ID:+dNnssqW0597デフォルトの名無しさん
2015/10/03(土) 11:00:27.88ID:+dNnssqW○gtk2hs
0598デフォルトの名無しさん
2015/10/04(日) 03:27:47.87ID:ToJIIXd8http://www.math.mcgill.ca/triples/Barr-Wells-ctcs.pdf
良い本ならタダだし読みたいんだけど
0599デフォルトの名無しさん
2015/10/04(日) 03:38:24.08ID:ToJIIXd8俺も以前はあるような気がしていたし、Haskellの設計者たちもそうだったんだろう
でもよく考えると、ありそうでないんだよなぁ。だから非推奨になった
データ型での制約は無意味、関数で制約をつければ十分
0600デフォルトの名無しさん
2015/10/04(日) 10:46:06.92ID:6Gez6s+Wアドホック多相は否定的な差別意識のようなものを助長する
0601デフォルトの名無しさん
2015/10/04(日) 10:46:25.50ID:7g0ECNdkしたいときがあります。(\x' -> [x']) x とか return x は気に入らないです。
この対策となる手短な演算子、関数あります?
0602デフォルトの名無しさん
2015/10/04(日) 10:49:06.91ID:2p1Fakm9return
0603デフォルトの名無しさん
2015/10/04(日) 10:50:45.65ID:2p1Fakm90604デフォルトの名無しさん
2015/10/04(日) 11:44:55.55ID:DjeWLfiE(:[]) x ダメ?
パクッと食べる感じで私は好きですが
0605デフォルトの名無しさん
2015/10/04(日) 12:05:49.96ID:6Gez6s+W0606デフォルトの名無しさん
2015/10/04(日) 14:15:53.93ID:fDLINyyRいいね。採用です。
>>605
(\x' -> [x']) x 見た目に冗長 (でも、ついさっきまで使っていた)
return は、多目的に利用されていて、
特に「IOモナドにいれる」という雰囲気が強い。
単要素リストのために使いたくないです。
0607デフォルトの名無しさん
2015/10/04(日) 18:32:08.45ID:6Gez6s+W演算子はいくらでも作れるから演算子オーバーロードの需要も少ない
0608デフォルトの名無しさん
2015/10/04(日) 22:02:02.06ID:ZUTIhruEこの目的なら>>604の書き方が一番クールに見える
0609デフォルトの名無しさん
2015/10/04(日) 22:44:20.33ID:Bf0N6nIe非決定性計算の話をしてる時はreturnに決まってるが
0610デフォルトの名無しさん
2015/10/05(月) 00:10:48.14ID:GrmouQHIそういう事は初めはなかなか気づけないものなんですよ。
慣れた人にとっては普通すぎて何故その発想が出てこないのか不思議なことでも、
本人にとってはその思考回路がまだできていないのだから仕方がない。
でも、大抵そういう事は一度教えれば納得してもらえるから、
クドクドと言わなくてもいいんじゃないでしょうか。
あと、このタイミングで「非決定性計算」という単語を出しても、
return に対して IO モナドと強く結びついた印象を持っている話し相手には、
たぶん何のことだか分からないと思いますよ。
この単語を出すのなら、もう少し噛み砕いて言わないと。
0611デフォルトの名無しさん
2015/10/05(月) 00:43:59.72ID:kDxLTVRe0612デフォルトの名無しさん
2015/10/05(月) 06:37:18.73ID:07AYgejNArrowとして扱わないから使わないなんてもったいない
0613デフォルトの名無しさん
2015/10/05(月) 09:45:35.34ID:yzUqWBwX0614デフォルトの名無しさん
2015/10/05(月) 11:28:48.81ID:pbV8Etyeただ賢くなりたいってためにやってるんだと思うよ
筋トレと同じ
目的がなくただプログラミングが詳しくなりたいって人がやってるだけ
だから使えない知識なんだよ
0615デフォルトの名無しさん
2015/10/05(月) 13:21:54.61ID:07AYgejNこれを知らない人は同調圧力をかけて計画経済をやろうとするので
そういう意味でとても重要な知識だよ
0616デフォルトの名無しさん
2015/10/09(金) 07:42:19.60ID:FkJ7bVyJ>純粋な値をわざわざ return して <- で束縛(正確には違うけど)するのはよくない。
>純粋な値の束縛にはlet を使おう(whereでもいい)。
これはコンパイルエラーのメッセージが分かりづらくなるから?
それとも遅くなる?
正直Haskellのコードがどういうアセンブラにコンパイルされるのか全然イメージできてない。
0617デフォルトの名無しさん
2015/10/09(金) 12:11:11.69ID:sh3xoE2Aモナドじゃないものをわざわざモナドの中に突っ込むとわかりにくくなる。
0618デフォルトの名無しさん
2015/10/09(金) 12:13:09.65ID:sh3xoE2Aだが、コストの問題よりは意味の問題。
0619デフォルトの名無しさん
2015/10/09(金) 13:39:19.70ID:kuWdcal82. なんか純粋な計算をして
3. モナドに戻す
これらを疎結合的に書けるのに、純粋な値をreturnでラップして繋げちゃうと
密結合になっちゃってよくない、という話だと理解していた
0620デフォルトの名無しさん
2015/10/09(金) 15:51:18.91ID:SHMAXyUq低バグ、3ヶ月後に読んでうんざりしないコードが書きたくてHaskellを使うのだろう?
0621デフォルトの名無しさん
2015/10/09(金) 22:08:25.16ID:9aZeSACJ意外と冗長なほうが読みやすいこともある
0622デフォルトの名無しさん
2015/10/09(金) 22:44:34.08ID:uiMXim+Rこれはウォーターフォール的なやり方
どんな言語が与えられてもまあまあ読めるような書き方を覚えてから言語を適当に選ぶ
というやり方があってもいいと思う
0623デフォルトの名無しさん
2015/10/09(金) 23:13:43.06ID:sJZRLwqr言語拡張なんていうクソほども信用できないものを使った自業自得だが、これには参ったです
0624デフォルトの名無しさん
2015/10/10(土) 09:00:52.54ID:k6/3wbQ30625デフォルトの名無しさん
2015/10/14(水) 10:07:56.26ID:6zz3+ZrR定期的に番号変えても行動パターンが同じだったら結局同定されてしまう問題って
関手から隠されているはずの対象の性質がわかっちゃうんだよって
圏論的に秘匿性に限界があるってことを指摘できちゃうんじゃないの?
役人馬鹿なの?
0626デフォルトの名無しさん
2015/10/14(水) 11:04:49.72ID:HE0NXWt00627デフォルトの名無しさん
2015/10/15(木) 16:45:01.88ID:UdQzikyH>Tカードやマイナンバーの定期的に番号変えても行動パターンが同じだったら
>結局同定されてしまう問題って
行動パターン?
公開鍵暗号方式で公開鍵を規則的に変えると秘密鍵も同じ規則でかわるの?
0628デフォルトの名無しさん
2015/10/15(木) 18:00:22.88ID:8y87T4ny0629デフォルトの名無しさん
2015/10/17(土) 13:50:41.43ID:oxF0LCT10630デフォルトの名無しさん
2015/10/18(日) 17:32:04.94ID:IQSF+r4cWeb アプリにおけるストリーム レスポンスがどのように働くのか調べているのですが、
挙動がいまいちよく分かりません。
import Blaze.ByteString.Builder (Builder, fromByteString)
import Control.Concurrent (threadDelay)
import Network.HTTP.Types (status200)
import Network.Wai (Application, responseStream)
import Network.Wai.Handler.Warp (run)
main = run 3000 app
app _ sendResponce = sendResponse $ responseStream
status200
[("content-Type", "text/plain")]
content
content = send frush = do
send $ fromByteString "A\n"
flush
threadDelay 5000000
send $ fromByteString "B\n"
これを runhaskell で実行して firefox でアクセスしてみました。
私の期待通りなら、ブラウザ画面に A が表示されてから 5 秒後に B が表示されるはずですが、
実際は画面が空白のまま 5 描画が経過した後に A と B が表示されます。
この挙動を見てストリーミングの意味がよく分からなくなったのですが、こういうものですか?
0631デフォルトの名無しさん
2015/10/18(日) 17:43:42.05ID:IQSF+r4cすいません、コードが変で、余計なものもありました。
import Blaze.ByteString.Builder (fromByteString)
import Control.Concurrent (threadDelay)
import Network.HTTP.Types (status200)
import Network.Wai (responseStream)
import Network.Wai.Handler.Warp (run)
main = run 3000 app
app _ sendResponce = sendResponse $ responseStream
status200
[("content-Type", "text/plain")]
content
content send frush = do
send $ fromByteString "A\n"
flush
threadDelay 5000000
send $ fromByteString "B\n"
これが >>630 のように期待通りになりません。
「期待」の方が間違っているでしょうか?
0632デフォルトの名無しさん
2015/10/19(月) 18:31:35.21ID:D0TieV9y0633デフォルトの名無しさん
2015/10/22(木) 01:58:37.48ID:7Ovl9dzN・Repaをfull importする -> map,zipWithが衝突する
・Repaをqualifiedにする -> :. も修飾しろと言われる
両方qualifiedにするしか回避方法がないのでしょうか?
0634デフォルトの名無しさん
2015/10/22(木) 02:12:31.41ID:kknqMtK3import qualified Data.Array.Repa as R
0635デフォルトの名無しさん
2015/10/22(木) 02:15:03.82ID:kknqMtK3import Data.Array.Repa as R
とRepaをqualifiedせずにいったんフルに開いてしまい、
衝突するmapやzipWith は R.map R.zipWith とする。
0636デフォルトの名無しさん
2015/10/28(水) 01:22:53.11ID:JEFLc7P8同じモジュールを2回importしてもいいんですね
import Data.Array.Repa ((:.)(..))
import qualified Data.Array.Repa as R
これで思っていた感じになりました
ありがとうございました
0637デフォルトの名無しさん
2015/10/29(木) 21:24:47.10ID:DfqrGTRwf :: T1 a => T2 a
g :: forall a. T1 a => T2 a
関数 f と g の違いって何?
0638デフォルトの名無しさん
2015/10/29(木) 21:31:26.31ID:MKBh71hJjsのコールバック地獄と何一つ変わらない気がするんだけど
0639デフォルトの名無しさん
2015/10/29(木) 23:35:31.17ID:e9INJKYUなにも違わない
0640デフォルトの名無しさん
2015/10/30(金) 01:13:23.74ID:FTBRryE0=> は型制約?
それとも -> という関数型データ構築子の誤記?
data ShowAny = forall a. Show a => SA a
みたいなデータ型を定義すると、この型を使って
heteroList :: [ShowAny]
heteroList = [SA 7, SA "Hello!", SA [1,2,3], SA ()]
みたいなリストを作って、
map show heteroList
メソッドディスパッチ的な多相みたいなことができるようになる。
forall を書くことでデータ型宣言の右側に量化を及ぼせるようになるのが
forall(とExistentialQuantification拡張)の意義だよ。
0641デフォルトの名無しさん
2015/10/30(金) 21:13:55.52ID:F94K7ptG>>640
誤記じゃないよ。
いや、Wikibooks の「Hskell/存在量化された型」などを見て forall の基本は理解したつもりになっていたけど、
書籍「Developing Web Apps with Haskell and Yesod」に、
type ChatHandler a =
forall master. YesodChat master =>
HandlerT Chat (HandlerT master IO) a
という型シノニムが載っていて、よく分からなくなった。
(これ、ライブラリが用意した型じゃなく、こういうのを自作しましょうと言ってる)
わざわざ forall を付てるのはどういう意図なんだろ。
>>639 の言うように特に意味はないの?
意図はともかく、この場合の forall の役割も記事の文脈が分からないと何とも言えないかな。
0642デフォルトの名無しさん
2015/10/31(土) 10:46:17.74ID:dbQDbY0RHaskellが今どうなってるか知らないが一般的にトップレベルのforallは省略できる
局所的なforallは省略できない
例 (forall a. (b -> a) -> a) -> b
0643デフォルトの名無しさん
2015/10/31(土) 11:22:59.89ID:v6Gqs4tJ既存のモナドと混ざらないようにしたいです。
具体的には、Writerモナドを特化したいと考えています。
WriterT のエラーログ専用版、 ErrorLogTを作り、
エラーログは関数tellではなく、専用関数tellErrorを使うようにしたいです。
同様に、警告ログ用はWarningLogTとtellWarningとしたいです。
作る方法あります?
0644デフォルトの名無しさん
2015/10/31(土) 13:00:33.74ID:VBW/ZV1Eそれはmasterが局所的な量化になってるんじゃないの?
ChatHandlerの型にはmasterがどういう型かが現れてないでしょ
0645デフォルトの名無しさん
2015/10/31(土) 13:04:49.04ID:VBW/ZV1Enewtype MyMonad a = MyMonad { runMyMonad :: SomeMonad SomeType a }
deriving (Functor, Applicative, Monad)
とかすれば?
0646デフォルトの名無しさん
2015/10/31(土) 14:02:44.15ID:mkYHJB27モナド変換子の扱いが厄介だと思ったが、あっさり成功しました。
まだ使ってない・・。
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
newtype ErrorLogT m a = ErrorLogT { runErrorLogT :: WriterT [String] m a }
deriving (Functor, Applicative, Monad)
0647デフォルトの名無しさん
2015/10/31(土) 14:45:40.36ID:+eMHagJM>>644
試しに forall master. をコメントアウトしてコンパイルしてみたら、下記の warning が出た。
Variable ‘master’ is implicitly quantified due to a context
Use explicit forall syntax instead.
This will become an error in GHC 7.12.
In the type ‘YesodChat master => HandlerT Chat (HandlerT master IO) a’
In the declaration for type synonym ‘ChatHandler’
出たのは warning だけで、コンパイル自体はできる。
ということは、局所的な forall ではないよね。
もしそうならエラーでコンパイルできないはず。
つまり、今のところは「この場合の forall の有無による意味の違いは無い」と解釈して問題ない、よね? まずいかな?
書籍ではたぶん、将来エラー扱いになる(し、今でも警告が出る)から今のうちに forall を明示的に書いておいたのだと思う。
だが、なんで将来エラー扱いになるのかが分からんな。
明示しないとどんな不都合が起こるんだろ。
0648デフォルトの名無しさん
2015/10/31(土) 15:08:37.45ID:VBW/ZV1Eんー、確かめたら局所量化じゃなさそうだね。
= の右に左に出てこない型変数をforallなしで書くなってことなんだろうけど
でもこれデータ型宣言じゃなくて型シノニムだもんね。
0649デフォルトの名無しさん
2015/10/31(土) 20:13:28.97ID:VBW/ZV1E>ライブラリのサンプルでラムダ式の4重ネストとか見かけるけどそういう書き方って普通なの?
>jsのコールバック地獄と何一つ変わらない気がするんだけど
よくわからん。
¥x1 x2 x3 -> zzzzzzz と書くのを律儀に
¥x1 -> ¥x2 -> ¥x3 -> zzzzzzzzz と書いてたって話じゃないのか?
それなら単に複数引数のλを周りくどい表記で書いてるってだけだ。
或いはdo構文をdesugarした形で明示的に書いてるとかかな。
いずれにせよ関数定義内で局所的に変数を定義するのと同じなんで地獄とも思えない。
0650デフォルトの名無しさん
2015/10/31(土) 20:39:17.39ID:fFBIHpK6うろ覚えだけどabcマシン?なるマシン語を下地になんか作る本があったきがするんだけど
何の本かわかります?
0651デフォルトの名無しさん
2015/11/01(日) 02:39:58.12ID:35r9qLcLintellijにhaskforceプラグイン入れて
winghci向けにテキストエディタで作っていた物を実行した所
cabalのhackageライブラリへの接続設定が上手くいかないみたいで
エラー連発となったのですが
どなたかintellij活用していて解る方いましたら教えて下さい。
参考URL
https://carymrobbins.github.io/intellij-haskforce/
0652651
2015/11/01(日) 11:32:51.24ID:35r9qLcLbuild-depends設定が必要でした。
お騒がせしました。
0653デフォルトの名無しさん
2015/11/02(月) 00:08:37.14ID:BuossX5Pわからん。
Haskellはcmmで書かれてるらしい。
0654デフォルトの名無しさん
2015/11/02(月) 00:55:43.62ID:+TdI2Qwjhttp://d.hatena.ne.jp/lethevert/20060424/p2
0655デフォルトの名無しさん
2015/11/02(月) 01:05:24.39ID:+TdI2Qwj0656デフォルトの名無しさん
2015/11/02(月) 01:17:27.14ID:+TdI2Qwjhttp://d.hatena.ne.jp/quox/20080809/p4
0657デフォルトの名無しさん
2015/11/02(月) 02:19:27.64ID:3aJacJQZ0658デフォルトの名無しさん
2015/11/02(月) 20:29:53.84ID:iqlL+d1Ghaskellじゃなかったのね、ありがとう
0659デフォルトの名無しさん
2015/11/02(月) 20:33:46.97ID:6V7frwcRimport Data.Map
f :: Array Int Int -> Int -> Int
f a i = a ! i
これ、(!) がどっちのモジュール由来かわからんってエラーが出るんだが、
なんで推論しないんだろうな。
もし (!) が、Array と Map がともにインスタンスになっている共通のクラスのメソッドなら、
ちゃんとどっちの型のものか推論してくれるのに。
0660デフォルトの名無しさん
2015/11/02(月) 22:03:07.66ID:3aJacJQZ>これ、(!) がどっちのモジュール由来かわからんってエラーが出るんだが、
>なんで推論しないんだろうな。
>
>もし (!) が、Array と Map がともにインスタンスになっている共通のクラスのメソッドなら、
>ちゃんとどっちの型のものか推論してくれるのに。
まさに殆ど自分で答えを書いてると思うが、(!)は多相関数じゃないから
推論もヘッタクレもなく、単純に名前が衝突する。
ほぼ同じ状況のレコードのフィールドは
列多相にする拡張がGHC 8.0でついに入るようだ。
0661デフォルトの名無しさん
2015/11/02(月) 22:29:42.30ID:BI35UJR00662デフォルトの名無しさん
2015/11/02(月) 23:30:27.13ID:6V7frwcR名前が衝突してたって、a と i の型で (!) がどっちのものか特定できるじゃん。
なんで分からないなんて言うの、って話。
クラスメソッドなら同じく a と i の型から推測するわけだから、
同じように推測すればいいのに。
0663デフォルトの名無しさん
2015/11/02(月) 23:36:48.35ID:3aJacJQZ多相性抜きだと (!) に型がつかないから。
あと、同じ型シグネチャを持った複数の(!)があったらいずれにせよ解決できない。
おとなしく最初からモジュール名で修飾して特定できるようにしとけ、というのは理にかなった方針。
0664デフォルトの名無しさん
2015/11/03(火) 09:06:22.82ID:6b9tjAllうーん、正直なところまだ納得できん。
これだけ教えてくれ。
>>659 の状況で (!) が Data.Array モジュールで定義されたものだと特定するのは、理論的に不可能なのか?
それとも、たまたま今の ghc に特定する仕組みが備わっていないだけなのか?
0665デフォルトの名無しさん
2015/11/03(火) 09:43:56.42ID:9Nk73qdO理屈としては可能なんじゃないかな。効率がわるいから
やらんだけで。
0666デフォルトの名無しさん
2015/11/03(火) 12:15:21.68ID:47MAD1yd観点による。現在の環境にある(!)という名前の全部をテーブルから探してきて、
引数位置の型に合うヴァージョンを同定するということ自体はもちろんできる。
だが、(!)を多相にする仕組みを用意しないと(!)に型が付かないので
型安全性の観点からは不可能だということになる。
試しに自分が期待するように振る舞う(!)の型を書いてみればいい。
察するに構造的部分型が欲しいのかもしれないが、Haskellにはない(OCamlにはある)。
0667デフォルトの名無しさん
2015/11/04(水) 11:53:03.71ID:8WRcFuaFx の型が一意に決まらないとき show x はどうなるかとか
0668デフォルトの名無しさん
2015/11/04(水) 20:49:16.04ID:YGBxZpF/どうなるの?
0669デフォルトの名無しさん
2015/11/05(木) 12:04:56.34ID:327W9Rc/x :: AB a => a
show :: Show a => a -> String
show x :: (AB a, Show a) => String
形式上ABクラスとShowクラスの関係は宣言していない (できない) から両者は無関係
だがABクラスがなくなればAとShowの関係やBとShowの関係を無視できない
0670デフォルトの名無しさん
2015/11/07(土) 05:01:31.73ID:e/JIsCJ0〜21:00
チャンネル 関数型ストリーム処理勉強会
lv241026970
0671デフォルトの名無しさん
2015/11/08(日) 15:12:58.87ID:ZXpAyz0G自由とか解放とか、鉛フリーとかのフリー?
monad以外にも何とかフリーってあるの?
0672デフォルトの名無しさん
2015/11/08(日) 23:09:18.21ID:/x5r6R9h由来は数学だね。数学のなかで、なんかの理論(たとえば群論や線形空間論)があったとして、
「なんでもない集合S」を土台にして「群」や「線型空間」を作りたい場合があるわけ。
普通の群はなんか色々元同士に絡みあった複雑な関係があったりするけど、Sから簡単に作った
群はそういう「複雑な関係から自由」だと思えるわけ。そんなわけで、そうやって作ったのを「Sの
上の自由群」と呼んだりする。
線形空間もそう。Sの元をベクトル空間の基底だと思って、無理にベクトル空間にするわけ。
S={きゅうり、なす、みかん} だとすると、これらを基底とするベクトルは
αきゅうり+βなす+γみかん
みたいになる、、、とか言うと大理不尽パンチを食らった感じがするかもしれんけど、
学習理論で言う特徴空間なんてそんな感じだよ。
α特徴1+β特徴2 + γ特徴3
みたいに表して、その空間がどうなってるかを調べたりするわけ。そういう意味で、一見
理不尽というか、「数学的な対象はコネコネして作れない」という神話的プラトニズムからは
受け入れがたいだろうけど、こうして作った空間は「数学」と「現実」を結んで議論するのに役に立つよ。
「現実と数学」の理論を結んでくれるこのような働きそのものを圏論ではシミュレートできるわけ。
「なんたら」という理論に対して「自由なんたら」を考えることができる。こういうとゆるっとしてふわっとした
話のようだけど、一般性という意味でのゆるさを保ちつつ、議論が宙に浮かない程度にはリゴラスな
議論ができるのが圏論の旨味です。
気分的な解説をこれ以上続けても仕方ないので、興味があったら圏論の本の「随伴」あたりを勉強されたし。
たまに「Wikipedia見てもわからなかった」とか言ってる人がいるけど、Wikipediaは記事によって記述の濃淡が
ばらつき過ぎていて、あれで勉強するというのは全くオススメしないよ。
0673デフォルトの名無しさん
2015/11/09(月) 00:46:28.67ID:hXrsgMsbありがと。
圏論 原著第2版 の第9章のタイトルが随伴だそうだから読んでみるわ。
圏論入門者がそこまで到達(理解)するのにどれだけ時間がかかるか分からんが。
0674デフォルトの名無しさん
2015/11/10(火) 15:18:42.59ID:GBT1w9xC0675デフォルトの名無しさん
2015/11/10(火) 20:05:26.23ID:ZeRtqP7q0676デフォルトの名無しさん
2015/11/11(水) 00:04:10.91ID:CaB3I9+U床下配線でどうたら、という解説から想像をたくましくしてはいけない
0677デフォルトの名無しさん
2015/11/11(水) 07:01:19.07ID:ECN7vnC1「モナドは文脈」という考え方が私はわかりやすかった。
ある関数を使うときに文脈によって意味 (戻り値) がかわることもあるし、
文脈にそぐわない関数を使うことは出来ないように型で制約されている感じは、
まさに文脈って感じがする。
0678デフォルトの名無しさん
2015/11/11(水) 08:45:56.58ID:+7UgY0Lp多相型は文脈によって意味がかわる
0679デフォルトの名無しさん
2015/11/11(水) 22:41:55.01ID:CaB3I9+Uそういう意味での文脈、じゃないよ。
たとえばMaybeは「中に何も入ってないかも知んない文脈」だし
リストは「なんか値が複数にバラけてるっぽい(し何もないかもしれない)文脈」なんだよ。
具体的にはFunctorでラップされてる型ならなんでもそのFunctorに応じた文脈だと言える。
Functorを考えるとき、
X -> F Y と Y -> F Z を合成したい場合がある。
(しなくても済む場合もありますが)
そういう「合成」がうまくいくためには FY と Y->FZ を受け取ってFZを
返してくれる演算があると便利だなぁということになる。それが (>>=)だね。
そういう演算が「うまく行く」ことを保証するのがモナド則。
0680デフォルトの名無しさん
2015/11/12(木) 06:44:47.02ID:169dDeUZ非モナディックな値を単純にreturnでモナドに投入するだけでは作れないような
モナディックな値がその計算効果の意味を表現している
MaybeならNothingだし、Listならシングルトン以外の全てのリスト、
IOなら実行しても定数しか返さないようなもの以外の全てのIOアクション
そういう計算効果を、do構文の中にいるときのようにある種自然に
取り扱えるようにするのが、モナドの持つ構造つまりモナド則。
0681デフォルトの名無しさん
2015/11/12(木) 12:19:12.19ID:92MD0hMhモナドがなくてもListの計算効果はあります
Listを知らない人にモナドを教えるのは早すぎるし
知っている人に計算効果を教えるのは遅すぎる
0682デフォルトの名無しさん
2015/11/12(木) 19:03:08.30ID:UTL+VBaFダックタイピングすれば継承がなくてもポリモーフィズムがあると気付いて
継承を理解するには静的型付けを知るべきだと思った
モナドも同じだと思う
静的型付けを知らなければモナドの本当の意味は分からない
0683デフォルトの名無しさん
2015/11/12(木) 19:15:06.84ID:169dDeUZ>昔、継承がなければポリモーフィズムもないと思ってたんだが
>ダックタイピングすれば継承がなくてもポリモーフィズムがあると気付いて
>継承を理解するには静的型付けを知るべきだと思った
意味がわからん。
継承と多相が関係ないのはそりゃ当然だが
ダックタイピングがどうというのも関係がない
>モナドも同じだと思う
>静的型付けを知らなければモナドの本当の意味は分からない
いや普通にリストモナドとかLispで実装して使うから。
そういうLisperは既に静的型付けを知っている!みたいな話なのかもしれんけど。
0684デフォルトの名無しさん
2015/11/12(木) 21:24:49.38ID:UTL+VBaFリストモナドというけど、Haskellと全く同じ仕様をLispで実装したとは思えないから
モナドの定義が微妙に違うんだろうな
オブジェクト指向の定義が何通りもあるのと同じようにね
0685デフォルトの名無しさん
2015/11/12(木) 21:50:28.93ID:169dDeUZふつうにreturn, fmap, bind (or join) を用意して
do構文に似せたマクロにするだけなんだが……
0686デフォルトの名無しさん
2015/11/12(木) 23:18:40.23ID:HSTzSi/o0687デフォルトの名無しさん
2015/11/13(金) 00:16:45.89ID:S1si1Bvfまあどんな小さなリスクも見逃さない努力が必要ってことか
0688デフォルトの名無しさん
2015/11/13(金) 07:28:57.94ID:z10Svt7pID:UTL+VBaF (>>687もかな?) の言ってることは尽く意味不明。
0689デフォルトの名無しさん
2015/11/14(土) 16:08:25.00ID:eusaGjJ0(>>=)のような組み合わせ方法を議論のビルディングブロックに
もってきたのがHaskellの(というかワドラーの)偉さなんだけど、
この「偉さ」は静的な型がしっかりした世界でのみ意味を持つのであって
そういう意味では他の言語では(所謂関数型言語の仲間であっても)
モナドを論じる意味は全くない。
0690デフォルトの名無しさん
2015/11/14(土) 16:32:22.06ID:99hLr/Ur>この「偉さ」は静的な型がしっかりした世界でのみ意味を持つのであって
まったく勘違いしてる
計算効果は型付けの静的動的とはなんの関係もない
0691デフォルトの名無しさん
2015/11/14(土) 17:06:11.27ID:naUAJjzLぱっと見これは宣言的じゃないなと感じるコードってあるよね。
俺は自分で無計画に思いつくままにプログラミングしてて、
let や where でやたら数珠繋ぎに値が加工されているときに、
こりゃアカンわと思うんだが。
where
(x, y) = f a
z = g x
w = h y z
おまえらはどう?
どういうコードを見たときに非宣言的だと感じる?
0692デフォルトの名無しさん
2015/11/14(土) 20:09:24.23ID:e1nh6RLI分からないことは宣言できない
余計な変数を作らないようにして分からないことを目立たなくすることはできる
0693デフォルトの名無しさん
2015/11/14(土) 23:38:38.09ID:99hLr/Ur>分からないことは宣言できない
>余計な変数を作らないようにして分からないことを目立たなくすることはできる
意味不明過ぎる。
局所定義でなくトップレベルに書いたらいいとでも?
0694デフォルトの名無しさん
2015/11/15(日) 00:16:27.42ID:1MD+X9xB0695デフォルトの名無しさん
2015/11/15(日) 06:56:56.90ID:QRVxROzt0696デフォルトの名無しさん
2015/11/15(日) 09:11:10.12ID:5yN0loUPボードのデータ構造は Haskell でもやはり Data.Array 系でしょうか。
0697デフォルトの名無しさん
2015/11/15(日) 10:02:09.42ID:rgLL3QSnimmutableでやるんならData.Mapでもさほど問題はないよ。数百要素程度だし。
mutableで行くとシンプルに割りきってMArrayを使ってもいいんじゃないかな。
もし盤面を行列と見た計算が必要ならRepaを使う。
0698デフォルトの名無しさん
2015/11/15(日) 14:07:14.87ID:0IQFXnOJ0699デフォルトの名無しさん
2015/11/15(日) 20:49:33.73ID:5yN0loUPありがとうございます。
参考にさせていただきます。
0700デフォルトの名無しさん
2015/11/15(日) 21:30:51.67ID:mV2QWUyr私が言ったのは (>>=)を議論のビルディングブロックに持ってくることが
ピンと来るのは静的な型がしっかりしているからだ、と言うことだ。
別にLispやJavascriptやらJavaで (>>=)に該当するものを作っても構わんが
Haskellが受けるのと同じ恩恵は受けられない。
ホゲホゲという言語でモナド作ってみたとかいう記事は腐るほど出てくるが
Haskellっぽい言語以外では「作ってみた」以上の進展はない。
考えることは出来ても(>>=)を議論のビルディングブロックにする旨味が
その導入コストを下回るからだ。
0701デフォルトの名無しさん
2015/11/15(日) 22:40:50.94ID:vt2WrPRjA: https://paiza.io/projects/PJqKw4d6Bm6slQXPq2bZ0A
B: https://paiza.io/projects/3G2kGBhaUdr9AgLqz9WQMA
C: https://paiza.io/projects/lGZzjjrbxOuGjF60NgMpzQ
D: https://paiza.io/projects/MW0pDwWuXHb0G_P0jDrx_w
E: https://paiza.io/projects/46HCc6YRllxPA3_fhOA5aQ
F: https://paiza.io/projects/UM0hOXFZUbPnzUX_rTEx7A
0702デフォルトの名無しさん
2015/11/16(月) 01:03:44.62ID:86x+5+3M宣言的/式志向的
を区別したいなら
https://wiki.haskell.org/Declaration_vs._expression_style
を読むだろJK
0703デフォルトの名無しさん
2015/11/16(月) 01:27:31.81ID:Dn8++f15・宣言的/非宣言的に分けられるという信念はだれに吹きこまれたのか
・宣言的/非宣言的を判定する基準は存在すると思うか。思うとしたら何故か
・そもそも宣言的(ry
0704デフォルトの名無しさん
2015/11/16(月) 01:52:39.28ID:O5zwBLaM対比させてる人が多いけど
0705デフォルトの名無しさん
2015/11/16(月) 19:26:37.79ID:sTC4qthO手続き的な宣言が存在しないとは言っていない
0706デフォルトの名無しさん
2015/11/17(火) 02:43:27.80ID:f2IMGMZY0707デフォルトの名無しさん
2015/11/17(火) 07:00:14.09ID:qSlbRl0Vというかそれでいいんだよ。
純粋な関数型の枠組みの内部で手続き的な構造をもたらすことが
モナドを導入する意図の重要なひとつなんだから。
0708デフォルトの名無しさん
2015/11/17(火) 21:08:21.39ID:a/8UTPX3ソースが見苦しくなる。
手続き的な構造の構築機能としては、
Haskell の do 構文は C 言語などに比べて遥かに不自由なのだから。
0709デフォルトの名無しさん
2015/11/18(水) 08:39:48.41ID:yhwFYSiS値を一つのリテラルで書くのが難しい場合に手続き的に do で
構成するような使い方にとどめておいたほうが良いのであって
手続き的にかけるぞやったーとか言ってると全体がIOモナドに
なちゃーうよ。
0710デフォルトの名無しさん
2015/11/18(水) 12:46:08.66ID:CKQsS/J8> 純粋な関数型の枠組みの内部で手続き的な構造をもたらすことが
> モナドを導入する意図の重要なひとつ
それってどのくらい信用していい?
それじゃあ、モナドを導入する意図のうち重要なものをすべて挙げることができる?
あるいは、モナドを導入する意図全体を簡潔に言える?
0711デフォルトの名無しさん
2015/11/18(水) 18:32:33.28ID:yhwFYSiS重要な理由の一つを挙げただけの人にどうして
「モナドを導入する意図のうち重要なものをすべて挙げることができる?」
と聞くのかさっぱりわからん。
というか「信じるかどうか」気にする前に君が読むべき論文は
Wadler Monad
でググれば一発目に出てくると思うんだが。あとはその論文でも
引用されてる Moggi 1989 とか。 Moggi 1989 はアイデアの宝庫だよ。
状態や継続が「モナドで表現した計算効果」とみなせることは
Moggiのアイデアだよ。
0712デフォルトの名無しさん
2015/11/18(水) 19:17:44.11ID:YqJaO+rH発売日 2015/12/14
こんなの今日見つけたんだけど、圏論、今年、流行ってるの?
日本人が書いてるから、言葉的に読みやすいと嬉しいけど。
0713デフォルトの名無しさん
2015/11/18(水) 20:53:20.61ID:CKQsS/J8> 重要な理由の一つを挙げただけの人にどうして
> 「モナドを導入する意図のうち重要なものをすべて挙げることができる?」
> と聞くのかさっぱりわからん。
めんどくさい人だね。一つ挙げた人が残りすべてを挙げることができるかもしらんし、
できんかもしらんじゃないか。なんで「と聞くのかさっぱりわからん」のかさっぱりわからん。
出来ないはずだがね、あなたにも
> Wadler Monad
> Moggi 1989 はアイデアの宝庫だよ
それはあなたたちの買いかぶりだよ
0714デフォルトの名無しさん
2015/11/18(水) 22:39:23.99ID:yhwFYSiS0715デフォルトの名無しさん
2015/11/18(水) 22:54:25.73ID:ELCanc9cよく分からんのだが、その構造というのは表現と同義?
単に手続き型言語のプログラムと似たような見た目にできるよって話なのか、
それとももっと深い意味(意義)があるのか。
0716デフォルトの名無しさん
2015/11/18(水) 22:57:14.04ID:r+WUaKBgしかもこういうのに限ってまともに勉強したことない感じなんだよなあ
Moggi1989をきちんと読んで理解した人間人が
>>710みたいな間抜けな質問をするはずもなく。
0717デフォルトの名無しさん
2015/11/18(水) 23:01:07.01ID:r+WUaKBgモナドを使って計算効果の表示意味論を与えようという話なんで、
見た目がどうとかじゃなくて、まさに「意味」の話よ。
0718デフォルトの名無しさん
2015/11/18(水) 23:26:13.39ID:CKQsS/J8腐るほど居る単なる文献学習生の一人(二人?)なのね?w
しかも今や相当古い文献
0719デフォルトの名無しさん
2015/11/18(水) 23:32:09.39ID:r+WUaKBg0720デフォルトの名無しさん
2015/11/19(木) 07:29:01.58ID:lSpyFHbj計算効果の表示的意味論を「何に対して」与えるの?
手続き的な構造をもたらす対象は「何」?
両者の「何」は同じもの?
つまり、その「何か」はモナドによって計算効果の表示的意味論を与えられると、
構造が手続き的になるの?
構造の意味もいまいち分からんが・・・
0721デフォルトの名無しさん
2015/11/19(木) 10:52:43.27ID:zQxckC7Sおそらく質問の答えを知りたいのではなく論破して否定したいだけ
それなら単刀直入に否定から入る方が早い
否定から入るのを避けるのは非効率
明らかに生産性が下がっている
0722デフォルトの名無しさん
2015/11/19(木) 13:45:26.51ID:0swJqKqT0723デフォルトの名無しさん
2015/11/19(木) 14:24:16.18ID:/zyx7Wn80724デフォルトの名無しさん
2015/11/19(木) 14:25:14.25ID:zQxckC7S0725デフォルトの名無しさん
2015/11/19(木) 17:36:15.14ID:vkUnAwZU0726デフォルトの名無しさん
2015/11/19(木) 20:54:12.06ID:0e/5E7Hfマスターする、という意味なら一般にそんな時間の見積もりは不可能だろ。
0727デフォルトの名無しさん
2015/11/19(木) 22:18:31.37ID:sCZhhvVwもっとちゃんと答えられんのか
0728デフォルトの名無しさん
2015/11/19(木) 22:33:37.20ID:0e/5E7Hf「ちゃんと」答えてるじゃないか。
むしろ根拠もないのにこれ以上に具体的な答えを返す方がおかしいわ。
0729デフォルトの名無しさん
2015/11/19(木) 23:05:29.68ID:sCZhhvVwそれは無能ってことよ
0730デフォルトの名無しさん
2015/11/19(木) 23:06:28.90ID:NCXIzrQp0731デフォルトの名無しさん
2015/11/19(木) 23:15:10.43ID:uB3RBNvPきみ、このスレに頻繁に書き込んでるけど、なんでHaskellに執着してるの?
親でも殺されたの?
0732デフォルトの名無しさん
2015/11/19(木) 23:15:42.54ID:0e/5E7Hfはいはい。お前さんが答えてやりゃよかろ。無能じゃないんだったらな。
0733デフォルトの名無しさん
2015/11/20(金) 17:56:29.77ID:hD02raLH0734デフォルトの名無しさん
2015/11/20(金) 19:48:44.22ID:Ub4YKJzuあれ、返事待ってたんだけどな…
ほらー有能なんでしょ君? 早く答えてくれないと!
かなり待ってるんだけどなぁ。俺が
死ぬまでにちゃんと答えてくれるんだよね?
ねー早くスマートでクールな答えをよろしく頼むよ!
0735デフォルトの名無しさん
2015/11/21(土) 11:05:00.50ID:74J1zl0I0736デフォルトの名無しさん
2015/11/22(日) 13:17:23.26ID:lKqXG5SAbindings-gsl じゃだめですか
0737デフォルトの名無しさん
2015/11/25(水) 00:31:18.47ID:4BagtNs6base_foo-1.0.0を利用するプログラムは、base_fooがsemantic versioningを満たす限り、
base_fooのバージョンが2未満ならバイナリレベルで互換性があると言えるはず。
0738デフォルトの名無しさん
2015/11/25(水) 00:46:08.37ID:mSSfxExm維持しているつもりが維持できてないってこともよくある話で、
そんなのをアテにするのが土台無理なんだってば。
0739デフォルトの名無しさん
2015/11/25(水) 00:54:14.39ID:tNxrewhG0740デフォルトの名無しさん
2015/11/25(水) 21:52:40.53ID:8QEKlgDl0741デフォルトの名無しさん
2015/11/26(木) 00:48:29.77ID:EiQ95VPh0742デフォルトの名無しさん
2015/11/26(木) 23:00:17.77ID:caXSzhxT?どういう意味だろう
0743デフォルトの名無しさん
2015/11/27(金) 20:05:24.18ID:eLJXztJb0744デフォルトの名無しさん
2015/11/28(土) 11:22:10.44ID:ADrw5NIB0745デフォルトの名無しさん
2015/11/29(日) 09:37:17.49ID:9VwKMKndまたおまえか
0746デフォルトの名無しさん
2015/11/29(日) 10:55:13.94ID:DI7OadCE「persistを使って」データベースへデータを挿入する Sink を作るとする。
次のようにコネクションプールを使って簡単な例を作ってみたんだが、
この方法はやっぱりスジが悪いかな?
連携方法について他に良い案があれば教えてほしい。
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
Ingredient
name String
|]
sinkInsertion :: Sink String (ResourceT IO) ()
sinkInsertion = bracketP createPool deletePool insertRecord
createPool :: IO ConnectionPool
createPool = runNoLoggingT $ createMySQLPool 省略 1
deletePool :: ConnectionPool -> IO ()
deletePool = destroyAllResources
insertRecord :: ConnectionPool -> Sink String (ResourceT IO) ()
insertRecord pool = do
liftIO $ runResourceT $ runSqlPool (runMigration migrateAll) pool
let loop = do
mname <- await
case mname of
Nothing -> return ()
Just name -> (liftIO $ runResourceT $ runSqlPool (insert_ (Ingredient name)) pool) >> loop
loop
main = runResourceT $ sourceList ["nasu", "tomato"] $$ sinkInsertion
0747デフォルトの名無しさん
2015/12/01(火) 00:26:02.77ID:XiHhDJLB0748デフォルトの名無しさん
2015/12/01(火) 10:17:37.88ID:pLCJABYC実用だと使うよね?yesod某とかfile-embedとか
>>746
むしろpersistとconduitの連携とか勉強になった
すっきりしていいと思う
0749デフォルトの名無しさん
2015/12/02(水) 02:05:09.83ID:sE+ivAhGまあでもlensでお目にかかってるはずだとは思うけど。
0750デフォルトの名無しさん
2015/12/02(水) 12:18:37.59ID:8wtTORdbわからなくて使ってない
0751デフォルトの名無しさん
2015/12/02(水) 17:37:47.86ID:PbTtaUvu0752デフォルトの名無しさん
2015/12/02(水) 22:51:45.37ID:sE+ivAhG0753デフォルトの名無しさん
2015/12/04(金) 22:59:21.91ID:Jt34pK2Iこれ読んでみるわ、サンキューモッギ
0754デフォルトの名無しさん
2015/12/05(土) 15:12:50.94ID:r040mJaZそのインスタンスだけでほぼ何でもできる、という方向に行かないのは何故なのかな
そうすれば苦労してMonadクラスを理解する必要もなくなるのに
0755592
2015/12/05(土) 17:54:28.20ID:e0mSV6nDきみがMonadクラスを理解するのに苦労した原因は
それぞれのインスタンスが個々の機能に特化ているからなの?
インスタンスが特化しているとクラスが理解しにくいのは何で?
意味が分からん
0756デフォルトの名無しさん
2015/12/05(土) 19:18:42.16ID:r040mJaZ例えばアフリカのある国でしか使えない通貨とか
0758デフォルトの名無しさん
2015/12/05(土) 20:15:13.38ID:xnZtirmK0759デフォルトの名無しさん
2015/12/05(土) 20:17:20.10ID:xnZtirmK0760デフォルトの名無しさん
2015/12/05(土) 21:06:41.94ID:GqrmhMyi>Monadクラスの中で特に汎用性の高いインスタンスを一つ選び
>そのインスタンスだけでほぼ何でもできる、という方向に行かないのは何故なのかな
なんでわざわざそんなモジュール性がクソになるようなことしなきゃいかんのw
0761デフォルトの名無しさん
2015/12/05(土) 21:17:53.90ID:fWHJ2v3Jthe next element will be delivered once it really has to be, and along with
it, the promise of the element after it.
読めないので翻訳お願いします
0762デフォルトの名無しさん
2015/12/05(土) 21:37:47.93ID:r040mJaZ特化してもモジュールが単純化される保証はない
ポイントカードのように特化して複雑化したモジュールが大量に作られる可能性がある
0763デフォルトの名無しさん
2015/12/05(土) 22:04:23.53ID:/HX/hq4Y0764761
2015/12/06(日) 08:58:48.47ID:d9uqm994205ページに日本語訳が載ってると思います
お願いします
0765デフォルトの名無しさん
2015/12/06(日) 15:02:16.24ID:lk97yytv0766デフォルトの名無しさん
2015/12/06(日) 15:05:47.98ID:B69NHvUF一般に与えられた2つの値の等価性を決定する手段がないから(たとえば関数)
0767デフォルトの名無しさん
2015/12/06(日) 15:16:43.60ID:43TPMysj0768デフォルトの名無しさん
2015/12/06(日) 16:24:47.53ID:rl6X8EeV既存のに制約を加えただけのインスタンスも証明不要
0769デフォルトの名無しさん
2015/12/06(日) 19:05:15.11ID:43TPMysj0770デフォルトの名無しさん
2015/12/09(水) 16:23:41.49ID:KCuPtV0t0771デフォルトの名無しさん
2015/12/10(木) 10:04:31.34ID:be8IS9Hr[ANNOUNCE] Glasgow Haskell Compiler version 7.10.3
https://mail.haskell.org/pipermail/ghc-devs/2015-December/010736.html
次は 8.0.1?
0772デフォルトの名無しさん
2015/12/10(木) 10:15:13.66ID:qPm1t7acCのクソ品質の乱数だって誰も責任とっとらんがな
0773デフォルトの名無しさん
2015/12/10(木) 10:39:08.93ID:bjguJgYh0774デフォルトの名無しさん
2015/12/10(木) 11:53:32.15ID:b8dKvTYk作者が何も言ってない値札もついてないものは質が低くても別にいいんじゃないか
0775デフォルトの名無しさん
2015/12/10(木) 15:50:49.33ID:C4TvgIE00776デフォルトの名無しさん
2015/12/10(木) 17:03:21.77ID:HOydu8dt0777デフォルトの名無しさん
2015/12/10(木) 17:11:09.97ID:C4TvgIE00778デフォルトの名無しさん
2015/12/10(木) 19:10:58.97ID:97YX12O0それもできないなら黙ってる事をお勧めする
0779デフォルトの名無しさん
2015/12/10(木) 19:37:06.78ID:pF20NpG5それは言い得て妙だな。俺も使わせてもらおう。
0780デフォルトの名無しさん
2015/12/10(木) 20:07:15.77ID:HRHtpj0XIOモナドは型を合わせるパズルさえ解けたらそのご褒美に
純粋性を保ちながら入出力を許してくれる仕組みだと思え
って言ってる。
合わせ慣れるとほっといても意味がわかってくるんだよね
0781デフォルトの名無しさん
2015/12/10(木) 20:22:42.52ID:IZmXUGd+0782デフォルトの名無しさん
2015/12/10(木) 22:44:48.71ID:KZYbcLbEどうも理解が全く違ったようだな。撤回するわ。やめとく。
0783デフォルトの名無しさん
2015/12/11(金) 10:18:36.36ID:r5Q1R4hd0784デフォルトの名無しさん
2015/12/11(金) 19:58:31.12ID:sot30U5t0785デフォルトの名無しさん
2015/12/11(金) 22:20:30.68ID:85l8vb8h0786デフォルトの名無しさん
2015/12/11(金) 22:24:19.25ID:GOodMDFm0787デフォルトの名無しさん
2015/12/12(土) 13:37:18.60ID:ujGm9ePq>>784
これらの喩えは初心者に分かりやすいのですか?
それとも熟練者に分かりやすいのですか?
私には意味が分からないです。
0788デフォルトの名無しさん
2015/12/13(日) 00:08:50.71ID:3pFOKkOt間を取って初心者にも熟練者にも意味不明な喩えにしてみました。
どちらにも「同じくらい」納得していただくことを目指した結果なので
何卒ご了承ください。
0789デフォルトの名無しさん
2015/12/13(日) 11:41:19.28ID:Osvw0E0t省略しても何も分かりやすくならない
ただ短くなるだけ
0790デフォルトの名無しさん
2015/12/15(火) 13:09:03.38ID:iFi41cdeH本にfoldlが無限リストに対して動作しないと書いてあるのですがfoldrで扱えてfoldlで扱えないとはどういうことですか
0791デフォルトの名無しさん
2015/12/15(火) 13:16:24.90ID:sAET7hcQ0792デフォルトの名無しさん
2015/12/15(火) 15:12:58.62ID:HsnKelNC遅延評価だから
0793デフォルトの名無しさん
2015/12/15(火) 18:57:39.98ID:QE2M/7jx0794デフォルトの名無しさん
2015/12/15(火) 20:24:17.53ID:lBHgLkLX続き読みました
foldl(&&)True(repeat False)だと((&&) ((&&) ((&&) True False)False)False)のように展開され、
foldr(&&)True(repeat False)だと((&&)False ((&&)False ((&&) False True)))のように展開されるので
(&&)の実装通り、"False _ = False"ということでfoldrではFalseが得られるということでした
頭から適用するかケツから適用するかで展開方法が違うからこんなことになってるんですね
ありがとうございました。
0795デフォルトの名無しさん
2015/12/15(火) 21:33:39.05ID:X5Kj7v40原発事故の風評被害wをうけて業績超悪化したのを「チャレンジ」で
切り抜けようとしてドブに沈んでいるけど、ハイリスク・ハイリターンてのは
そういうことだよね。
おつかれさん
0796デフォルトの名無しさん
2015/12/18(金) 23:30:03.19ID:CNI5JGVGhttp://hayabusa3.2ch.net/test/read.cgi/news/1450395043
0797デフォルトの名無しさん
2015/12/19(土) 08:03:47.30ID:ZJ0XzZ1Z静的型でリスクが減ることはあっても増えることはないってのは本当か?という話
0798デフォルトの名無しさん
2015/12/19(土) 18:37:13.41ID:154W1WqLを買ってみたのですが、これ読むとHaskell力増しますかね?
0799デフォルトの名無しさん
2015/12/19(土) 18:55:01.79ID:+WfqJ81yHaskell力の低い人と高い人で決定的に違うのは何でしょうか。
0800デフォルトの名無しさん
2015/12/20(日) 00:59:06.94ID:nJz8/sCp0801デフォルトの名無しさん
2015/12/20(日) 01:13:13.68ID:AMk4fv310802デフォルトの名無しさん
2015/12/20(日) 03:44:49.47ID:PpeZ7QXnHaskell力が低い人
「読んだ方が良いか?」
Haskell力が高い人
「『ママッ子』なんだよ>>798!
ビビったんだ…。甘ったれてんだ! わかるか? え?オレの言ってる事。
『型』のせいじゃあねえ。心の奥のところでオメーにはビビリがあんだよ!
オレたち強いHaskellerはな!
そこら辺のナンパJavascripterや仲よしクラブで『読んだ方が良いか?』『読んだ方が良いか?』
って訊いて回って仲間と心をなぐさめあってるような負け犬どもとはわけが違うんだからな。
『読んだ方が良いか?』…そんな言葉は使う必要がねーんだ。
なぜならオレや、オレたちの仲間はその言葉を頭に思い浮かべた時には!
実際に本を読んじまってもうすでに 終わってるからだッ!
だから 使った事がねェ〜〜〜ッ。
>>798
オマエもそうなるよなァ〜〜〜〜〜〜〜〜
オレたちの仲間なら…わかるか? オレの言ってる事… え?
『読み終わった』なら 使ってもいいッ!」
0803デフォルトの名無しさん
2015/12/20(日) 12:57:25.53ID:NTC3UnWcほんこれ
0804デフォルトの名無しさん
2015/12/21(月) 08:53:41.20ID:p6vwDy5Q0805デフォルトの名無しさん
2015/12/21(月) 13:59:05.21ID:UYX3g1H/0806デフォルトの名無しさん
2015/12/21(月) 15:13:18.71ID:Nh3sqEqI積の単位元unit
0807デフォルトの名無しさん
2015/12/21(月) 21:20:25.06ID:p/vkOJl0たとえば Haskell ですべての要素に 1 を足して
足された配列を C に返すってのをやりたいんだけど
いいサンプル知らない?
配列じゃなくて単独の int とか double とかはできるんだけどな
0808デフォルトの名無しさん
2015/12/21(月) 21:48:27.29ID:ppP3iBcM0809デフォルトの名無しさん
2015/12/21(月) 22:48:06.17ID:p/vkOJl0できたら楽しいなって、それだけだよ
0810デフォルトの名無しさん
2015/12/22(火) 21:04:57.45ID:RcXN8h3PFFIしたいということですか
0811デフォルトの名無しさん
2015/12/22(火) 22:08:30.28ID:JyKdzAuM第58回 Cの配列をHaskellで利用する 2013/08/07
http://itpro.nikkeibp.co.jp/article/COLUMN/20130806/496825/
0812デフォルトの名無しさん
2015/12/22(火) 22:44:22.74ID:rB+vmYENそういうことですね
>>811
情報ありがとうです
とりあえず力技ではできたけど、あんまりスマートじゃないなー
俺の Haskell レベルだと、どうやってリストにすればいいか解らないw
http://pastebin.com/v9q509Pr
0813デフォルトの名無しさん
2015/12/23(水) 15:44:56.86ID:2+dP2nJGPrelude> let x = 1
Prelude> :sprint x
x = _
Prelude> x
1
Prelude> :sprint x
x = _
こうなるんだが、これが正常なの?
最後、x = 1 と表示されるのを期待したんだが。
0814デフォルトの名無しさん
2015/12/23(水) 20:34:05.51ID:ar8RTNkNhttp://d.hatena.ne.jp/kazu-yamamoto/20151217
0815デフォルトの名無しさん
2015/12/23(水) 20:49:10.99ID:2+dP2nJGなるほど
ありがと、助かったよ
0817デフォルトの名無しさん
2015/12/29(火) 00:17:50.09ID:9ZoBZ5vT0818デフォルトの名無しさん
2015/12/29(火) 10:01:45.65ID:RBH4v58Jすっこんでろ
0819デフォルトの名無しさん
2015/12/29(火) 10:07:19.04ID:zZSzcFIybracketとbracketOnErrorの使い分けどうやってますか?
onerrorの方が効率は良さそうですが。
0820デフォルトの名無しさん
2015/12/29(火) 10:39:50.46ID:xUoFMoAl0821デフォルトの名無しさん
2015/12/29(火) 11:02:31.87ID:zZSzcFIyあなたがわからないだけでしょ
0822デフォルトの名無しさん
2015/12/29(火) 11:05:25.98ID:xUoFMoAl0823デフォルトの名無しさん
2015/12/29(火) 11:21:31.50ID:zZSzcFIyあんたキチガイだからNGしとくわw
さいならー
0824デフォルトの名無しさん
2015/12/29(火) 11:24:08.59ID:xUoFMoAl>H本でbracketOnErrorのとこまで読みました。
>bracketとbracketOnErrorの使い分けどうやってますか?
>onerrorの方が効率は良さそうですが。
どっちがキチガイなんだろうかwwww
0825デフォルトの名無しさん
2015/12/29(火) 11:39:12.45ID:X0OP3kiAその本でどのように説明されているのか私は知りませんので、
的外れなレスでしたらごめんなさい。
bracket と bracketOnError はそもそも役割が異なり、
その処理効率によって比較するものではありません。
bracket は第3引数のIOアクションの実行時に例外が発生しようがしまいが、
第2引数のIOアクションは実行されます。
一方、bracketOnError は第3引数のIOアクション実行時に例外が発生した場合のみ、
第2引数のIOアクションが実行されます。
(どちらの説明もライブラリドキュメントに書かれています)
なので、確保したリソースの第3引数のIOアクション後の解放を保証したいのならば、
bracketOnError は使えません。
例外が発生しなければ第2引数のIOアクションは実行されないので。
ちなみに、この2つの関数、中身はほとんど同じです。
http://hackage.haskell.org/package/base-4.8.1.0/docs/Control-Exception.html
ここの各関数のシグネチャの右端にソースへのリンク(Sourse)があるので、見てみてください。
どうでしょう、効率に差があるように見えるでしょうか。
0826デフォルトの名無しさん
2015/12/29(火) 12:10:34.40ID:zZSzcFIyありがとうございます。
すみません。まだ初歩の学習中でbracketのソースは読めそうにないです…
bracketOnErrorでも第三引数に第二引数と同等のリソース開放のコードを書くことでこの2つの関数は代替可能だと思ったのですが間違っているでしょうか?
onerrorの方が効率が良いと思ったのは例外が発生しない場合第二引数の関数を呼び出すコストがかからないからと考えましたが大したコストじゃなさそうですね
0827デフォルトの名無しさん
2015/12/29(火) 13:40:10.25ID:X0OP3kiAたしかに bracketOnError の第2引数は、第3引数で例外が発生しない限り実行されません。
その意味では「例外の無い通常運転では第2引数を実行するコストはかからない」のでその分効率的でしょうね。
ただ問題は、そのような処理の流れで本当に大丈夫なの? と言うことです。
あなたが実現させたい処理の流れに合っているかどうか、それが最も大事です。
bracket と bracketOnError のどちらを使っても実現させたい処理に適合するのなら、
より効率的な方を選ぶのも手です(効率の他に、ソースがより読みやすい方を選ぶのも手)。
効率よりもまずは合っているかどうかを考えた方が良いと思います。
>>825 で「役割が違う、効率で比較するものではない」と言ったのはそういう意味です。
合わないものを工夫して合わせるのはバグの元なので、
そういう工夫はそれしか手段がない場合のみやるべきだと私は思います。
もし bracketOnError の第3引数にリソース解法処理を「必ず行うように」書くのなら、
あなたがメリットだと感じている「例外がなければ第2引数を実行するコストがかからない」
というのは無くなり、処理的には bracket と「ほぼ」同等になりますが、
それなら bracket を使うべきだと私は思います。
同じ処理を実現するなら、手間がかかる bracketOnError より楽に bracket です。
0828デフォルトの名無しさん
2015/12/30(水) 04:17:15.91ID:P/Z2Doribracket AB共通後始末 $ bracketOnError planBwith後始末forB\AB共通後始末 planAwith後始末forA\AB共通後始末
こう書けばいいです?
0829デフォルトの名無しさん
2015/12/30(水) 12:39:36.95ID:5ugZQDQL0830デフォルトの名無しさん
2015/12/30(水) 17:44:17.38ID:SM7sbKvEbracketOnError の第1引数で例外が発生すれば、
その例外はそのまま bracketOnError の外に伝わります。
このことは、>>825 で挙げたソースが読めなくても、
自分で実験して確認できます。
実際に第1引数で適当なが例外を発生させてみれば良いです。
「こう書けばいいです?」の部分は何を言いたいのかよく分かりません。
まずは落ち着いてください。
全角のバックスラッシュは何を意味するのわかりませんし、
そもそも btrcket や bracketInError の第1引数は第3引数よりも先に実行されます。
そこに後始末処理を書いてはいけません。
何を言いたいのかは分かりませんが、しかしこれも実験で簡単に確認できるはずです。
どちらの関数も引数はすべて IO モナドなので、print を適当に挟んで実行順などを調べられます。
質問の前に、まずは自分でやってみてください。
0831デフォルトの名無しさん
2015/12/31(木) 07:48:53.39ID:qqIJWikB結論としてbracketOnErrorとbracketは代替可能ですよね。
ちなみ>>828は私じゃないのでw
0832デフォルトの名無しさん
2015/12/31(木) 10:26:45.78ID:W7OP38Muおそらく、あなたの期待している処理に関してだけ言えば、両者は代替可能だと言ってしまっても、
実用上それほど間違っていはないと思われます。
歯切れが悪い言い方で申し訳ないです。
というのも、正確に言えば両者は代替できない(と思う)からです。
>>827 でも同等性に関して「ほぼ」と断りました。
私が今ぱっと思いつく限りでは2つの異なる点があります。
ひとつは、bracketOnError の第3引数に(わざわざ)書いた開放処理の中で例外が起きれば、
その時点で bracketOnError の第2引数が実行されます。
第2引数でも開放処理が書かれていれば中途半端に二重に実行されます。
どう代替しますか?
もうひとつは外部例外への対処の仕方です(以後、簡単のため正確さは犠牲にします)。
両者の第1引数と第2引数では、外部例外がマスクされます。
一方、第3引数では外部例外のマスクが一時的に開放されます。
外部例外というのは他スレッドから現スレッドに投げられる例外の事だと今は思ってください。
これがマスクされているという事は、外部例外が投げられても処理を最後までやり切る、という事です。
したがって、bracket の第2引数に書いた開放処理と、bracketOnError の第3引数に書いた開放処理は、
外部例外への対応という点に関して異なります。
mask_ という関数を使って外部例外をマスクできますが、それで開放処理を書くのなら、
もうほとんど bracket の第2引数で開放処理を書くのと同義で、代替できると呼べるかどうか。
そもそも、代替できるかどうかに拘る理由が分かりません。
普通、bracketOnError を見たプログラマは、例外が発生しなければ第2引数は実行されない、
という前提でプログラムソースを読むはずです(ドキュメントにそう書かれているので)。
なので、第3引数に開放処理が書かれていれば混乱を生むだけだと思うのですが・・・
0833デフォルトの名無しさん
2015/12/31(木) 10:32:03.79ID:W7OP38Muすいません、>>832 で外部例外と言いましたが、言葉が間違っていました。
正しくは「非同期例外」です。
0834デフォルトの名無しさん
2016/01/02(土) 10:40:11.71ID:GEI8yUNiデータベース名にURIが使えないんだが、なんで?
たとえば、withSqliteConn "file:test.db?mode=memory" とやっても、
この名前そのままのファイルがカレントディレクトリに作られてしまう。
withSqliteConn "file:///tmp/test.db" とやったらオープンできないと言われる。
ちなみに、sqlite-simple パッケージの接続用関数を試してみたら、
こちらではちゃんと前者はインメモリで名前付きデータベースが作られたし、
後者もちゃんと /tmp/test.db が作られた。
これは、persistent-sqlite パッケージのバグか仕様? それとも俺のやり方が悪い?
[環境]
OS : ArchLinux
ghc : 7.10.3
persistent-sqlite-2.2
0835デフォルトの名無しさん
2016/01/02(土) 13:02:28.28ID:qABI05dXバグだからお前は悪くないか、仕様だからお前が悪いの二択
0836デフォルトの名無しさん
2016/01/02(土) 14:01:08.40ID:yZAYApNA0837デフォルトの名無しさん
2016/01/02(土) 14:10:02.21ID:3O/U03wsURIを解釈せずにそのままファイル名にする、というのは
きちんと意味のある方針
0838デフォルトの名無しさん
2016/01/02(土) 14:32:31.40ID:GEI8yUNiSqliteのC言語ライブラリでも、それをラップした他言語ライブラリでも、
Haskell の sqluie-simple でも問題なく仕様通りの使い方ができる。
だから、persistent-sqlite で使えないのが不思議なんだよ。
で、単に persistent-sqlite のバグなのか、
このライブラリに限りSqliteの仕様に反することが明文化されているのか、
それとも俺の使い方が悪い(どこかで設定できる?)のか、
と質問したんだが、どうだろうか。
>>837
それがドキュメントに書かれていれば、なるほどと思う。
一応俺なりにドキュメントを精読したつもりなんだが、見当たらない。
0839デフォルトの名無しさん
2016/01/02(土) 14:47:45.97ID:Z1J/2moe0840デフォルトの名無しさん
2016/01/02(土) 15:28:52.47ID:3O/U03wspersistentのバックエンドのひとつとしてsqliteが使えるというだけで、
sqliteの機能をまるのまま提供する義理があるわけじゃないからな
sqlite特有の仕様は全部切り捨ててるんじゃね
0841デフォルトの名無しさん
2016/01/02(土) 15:48:49.70ID:GEI8yUNiwithSqliteConn ":memory:" は普通に使えてるんだが。
0842デフォルトの名無しさん
2016/01/02(土) 15:51:15.87ID:uD+WV8wT0843デフォルトの名無しさん
2016/01/02(土) 16:02:15.60ID:QMorx62m0844デフォルトの名無しさん
2016/01/02(土) 17:45:42.15ID:qABI05dXこれ質問されてんじゃなくてURI使わせろって命令されてるだけだから
命令を無視されても冷たいとはいえない
0845デフォルトの名無しさん
2016/01/02(土) 23:33:46.23ID:GEI8yUNi0846デフォルトの名無しさん
2016/01/03(日) 18:32:26.80ID:6l5P920yって書いてあるね
0847デフォルトの名無しさん
2016/01/03(日) 20:43:59.44ID:LkkfiKGZそう、俺も GitHub の issues に投稿してから気づいた。
自分で Sqlite のサイトのリンクまで載せておきながらね。
すぐにゴメンナサイをしたけど、かなり恥ずかしいヤツになってしまった。
みんなにもゴメン、完全に俺の早とちりだった。
ただ、URI解釈機能の追加には作者も乗ってくれたみたい。
0848デフォルトの名無しさん
2016/01/03(日) 20:52:19.95ID:6l5P920ydirect-sqlite.cabal の cc-options の所には -DSQLITE_USE_URI と書いてある
persistent-sqlite.cabal の cc-options にはそれがない
0849デフォルトの名無しさん
2016/01/04(月) 01:57:02.65ID:sSvUYJHWstylish haskellをインストールしてみたのですが
IDEの表示動作には何ら変化が無く
これを導入する事によって何が嬉しいのか解りません。
もし解説してるサイト等を知ってましたら教えて下さい。
0850デフォルトの名無しさん
2016/01/04(月) 13:18:37.61ID:FL15/iqU0851デフォルトの名無しさん
2016/01/04(月) 19:09:54.69ID:26vt+6G2前Vimから使ってたけど単なるコードの整形ツールだよ?そういうことではなく?
0852849
2016/01/04(月) 22:46:13.38ID:sSvUYJHWありがとうございます。
単なるコードの整形ツールねのですね。
ハスケルはlet式の中で改行された名前の先頭位置によって
鰓が出たりするので重宝できるかもしれません。
0853デフォルトの名無しさん
2016/01/05(火) 01:43:11.91ID:e1QBvQbcこのスレに質問しにくる奴は総じてどこかおかしいな
まあ、まともな人間ならStack OverflowやTwitterで答えてもらってるからそれもそうか
0854デフォルトの名無しさん
2016/01/05(火) 05:45:19.85ID:cUqgoqn10855デフォルトの名無しさん
2016/01/05(火) 08:41:47.32ID:ikPXVG/Y0856デフォルトの名無しさん
2016/01/05(火) 08:45:29.10ID:DJzEWfiC0857デフォルトの名無しさん
2016/01/05(火) 09:27:48.52ID:YDRwEOS9批判は自由だが、隔離は自由ではないぞ
0858デフォルトの名無しさん
2016/01/05(火) 09:51:31.49ID:tl8m+k9cビビったんだ…。甘ったれてんだ! わかるか? え?オレの言ってる事。
0859デフォルトの名無しさん
2016/01/05(火) 11:57:12.00ID:4ajyxAFrもう一度正しい文章構成で書いてもらえますか
0860デフォルトの名無しさん
2016/01/05(火) 17:46:40.11ID:e1QBvQbc意思疎通する気があるなら安価ぐらい付けたらどうかな
0861デフォルトの名無しさん
2016/01/05(火) 18:05:51.34ID:4ajyxAFr意思疎通する気は全くありませんでした
謹んでお詫び申し上げます
0862デフォルトの名無しさん
2016/01/05(火) 19:32:18.30ID:e1QBvQbc年始早々お邪魔しにきたわけだ、なるほど
0863デフォルトの名無しさん
2016/01/05(火) 20:11:41.05ID:55Fn/q1S正解は『離せば分かつ』
毛の壁
朦朧健
0864デフォルトの名無しさん
2016/01/05(火) 21:26:43.07ID:4ajyxAFrこちらの意図も伝わっていなかったようですが
それも含めて意思疎通する気が無い故仕方がないことと考えております
年始の戯れにお付き合いいただきありがとうございます
0865デフォルトの名無しさん
2016/01/05(火) 21:45:24.66ID:HIgjIRNU総ストック数はそこそこあったのに
0866デフォルトの名無しさん
2016/01/05(火) 22:44:55.92ID:+VJkCmAJ後ろの方の文が役に立った人っている?
たとえば、適当なファイルに次の2行を書いて、
import Control.Exception
main = try (return 0) >>= print
ghc-7.10.3 でコンパイルすると、エラーが2つ出る。
ひとつは try 関数のところで Exception e0 の e0 の型が曖昧だというエラー。
もうひとつは print のところでその型 e0 が Show のインスタンスではないというエラー。
どちらも、エラーの本質はエラー文の初めの2行で分かる。
その直後の Note: there are several potential instances: の提案が
極希に役立ったことがあったかもしれん。
だけど、最後の In the first argument of ‘(>>=)’, namely ‘try undefined’
の辺りが役に立ったことなんて一度もない。
型が合わないタイプのエラーも同じ。
expected な型と actual な型の情報は重要だけど、残りの情報は役に立たん。
でも、ghc の作者はそういった情報も役に立つと思ってるから出力してるんだと思う。
が、俺にはさっぱりわからん、どういう意図なんだろ。
0867デフォルトの名無しさん
2016/01/06(水) 05:13:36.20ID:HV2EpPIp>>819と同じ奴っぽいけど一瞬でサイコパスだと見ぬいた>>820何者なんだ…
0868デフォルトの名無しさん
2016/01/06(水) 07:55:50.59ID:GReAeoH6まあとりあえず言葉通りの意味がわかれば十分じゃないか
逆に何を言われても物足りないと思えば、言葉が何の役にも立たないのは当然だ
0869デフォルトの名無しさん
2016/01/09(土) 08:12:25.88ID:nN+q48Tl0870デフォルトの名無しさん
2016/01/09(土) 09:51:25.24ID:j1jPLBvu0871デフォルトの名無しさん
2016/01/09(土) 10:19:50.09ID:BmIw5AdJ似たような型の関数を長大に連鎖してる箇所でそれがなかったら手間もいいとこ
0872デフォルトの名無しさん
2016/01/09(土) 10:22:14.19ID:BmIw5AdJ型推論が最終的に失敗した箇所とエンバグした箇所が違うことはわりとある
0873デフォルトの名無しさん
2016/01/09(土) 17:15:15.57ID:CcDze1VMまともかどうかは分からんが、
確かに似たような型の関数を長大に連鎖するのは意図的に避けてる。
やっぱ、そこから逃げてちゃマズいか。
それがなかったらの「それ」が何を指しているのか曖昧だが、
最後の In the first argument of の件か?
それなら、エラーが検出された場所(行と列)が最初に示されるだろ。
それで分かるよね。
0874デフォルトの名無しさん
2016/01/10(日) 11:57:12.49ID:wsJCRVkv役に立たないコードを探すことではない
役に立つなんて下手に断言して辻褄が合わなくなるより何も言わない方がましだ
0875デフォルトの名無しさん
2016/01/11(月) 22:38:48.37ID:SN+G+m/40876デフォルトの名無しさん
2016/01/12(火) 00:48:54.32ID:cUmJzvMy0877デフォルトの名無しさん
2016/01/12(火) 01:06:03.30ID:KMQpPdRt要ります
CコンパイラがCで書かれてるのと一緒です
0878デフォルトの名無しさん
2016/01/12(火) 08:27:15.11ID:9LHzGZEP0879デフォルトの名無しさん
2016/01/12(火) 11:56:28.50ID:j0Q/nFNr0880デフォルトの名無しさん
2016/01/12(火) 12:09:55.19ID:ifvCKaAg0881デフォルトの名無しさん
2016/01/12(火) 19:29:52.54ID:gQfF03pT従ってバグを持つghcは原理的に存在しません。
0882デフォルトの名無しさん
2016/01/12(火) 20:54:15.23ID:+sXl4caOそこで埋め込まれた可能性がある
0883デフォルトの名無しさん
2016/01/12(火) 20:58:13.20ID:RBb1nE9O0884デフォルトの名無しさん
2016/01/12(火) 22:04:04.84ID:KMQpPdRt大抵は新規の拡張とか高度な最適化に関するエンバグなので
それを用いていないGHCを-O1程度でコンパイルするぶんには無問題
0885デフォルトの名無しさん
2016/01/12(火) 22:05:51.78ID:KMQpPdRtだが、まあ別にGHC自身を普通にセルフコンパイルするのに支障はない。
0886デフォルトの名無しさん
2016/01/12(火) 22:11:51.98ID:KMQpPdRtLazy MLという純粋かつ遅延評価なML方言で
GHCのプロトタイプが書かれて、それを使って
ブートストラップしたということらしい。
0887デフォルトの名無しさん
2016/01/13(水) 07:57:01.82ID:oCkaPOn/0888デフォルトの名無しさん
2016/01/13(水) 20:45:24.32ID:w9GbZ+Jwメニーコアの時代には全てのソフトウェアがHaskellで書かれるでしょう。
0889デフォルトの名無しさん
2016/01/13(水) 21:08:44.44ID:3fMyO6UP0890デフォルトの名無しさん
2016/01/13(水) 21:26:21.50ID:4r91zTEFHaskell は強力な原語だけど万能でもなんでもない
0891デフォルトの名無しさん
2016/01/13(水) 22:42:46.22ID:0P99nKsmrtsがcmmみたいなクソ言語つこうとる間は移植性皆無だし
Haskellがメニーコア時代を制するとか全くの寝言。
0892デフォルトの名無しさん
2016/01/13(水) 23:17:52.63ID:J+RphLvPなんでも反対する人に未来を予想させたらメニーコア単一言語になる
0893デフォルトの名無しさん
2016/01/14(木) 08:43:44.75ID:PREROaaLともあれもうLLVM化がほぼ完了してるんでなあ
0894デフォルトの名無しさん
2016/01/14(木) 21:36:49.38ID:lc/juWNa従って移植性は必要ありません。
また、Haskellに対して最大の最適化がかけられるので、ただでさえ世界最高速のHaskellが
更に速くなります。
0895デフォルトの名無しさん
2016/01/14(木) 21:41:27.88ID:lc/juWNaあまりにも遅く実力を発揮できなかったそうです。
たまたまHaskellで書かれたコードを実行したところ素直にスケールし、同等のCプログラムに比べて
一万倍以上の速度をたたき出したそうです。
今では、京で実行されるプログラムの8割以上がHaskellで書かれるそうです。
この話を聞いた時、私はメニーコア時代にはHaskell以外すべて淘汰されると確信しました。
0896デフォルトの名無しさん
2016/01/14(木) 22:16:56.74ID:cBi4ATG+0897デフォルトの名無しさん
2016/01/14(木) 22:54:04.38ID:o0uc+UVB0898デフォルトの名無しさん
2016/01/16(土) 11:31:35.21ID:uAWxWNtS0899デフォルトの名無しさん
2016/01/16(土) 13:52:30.64ID:B2ptzm1e0900デフォルトの名無しさん
2016/01/16(土) 17:47:04.65ID:KeKHWyn2つくればあるよ
0901デフォルトの名無しさん
2016/01/16(土) 17:58:15.76ID:0llXe6dZ0902デフォルトの名無しさん
2016/01/16(土) 18:02:56.95ID:KeKHWyn2こういうしょうもないレスを期待されてたとしか思えないんだよね。
0903デフォルトの名無しさん
2016/01/16(土) 19:20:11.46ID:pNi7JFmY0904デフォルトの名無しさん
2016/01/16(土) 19:28:23.40ID:o1tKgFaF10年前なら公式サイト or SFにないなら諦める、だったけど今はどこで作られてるか分かったもんじゃない
0905デフォルトの名無しさん
2016/01/16(土) 20:48:22.43ID:0sqpR6Ox0906デフォルトの名無しさん
2016/01/16(土) 20:58:56.01ID:0llXe6dZ0907デフォルトの名無しさん
2016/01/16(土) 21:06:56.91ID:0C9LAeXO0908デフォルトの名無しさん
2016/01/16(土) 21:07:38.08ID:xP+g/trL0909デフォルトの名無しさん
2016/01/17(日) 13:57:54.88ID:po5BkGJ70910デフォルトの名無しさん
2016/01/17(日) 14:35:14.34ID:Nzqff/kH元の話だが、sparcクロスコンパイルもダメなんだけか?
今どき少ないがWSの並列のためにありそうなもんだが
0911デフォルトの名無しさん
2016/01/17(日) 16:43:00.23ID:snuCDPAE0912デフォルトの名無しさん
2016/01/17(日) 16:47:33.31ID:8TKcXYcp0913デフォルトの名無しさん
2016/01/17(日) 18:30:04.29ID:6Xbfm/TMあれはもう死んだでしょ
0914デフォルトの名無しさん
2016/01/17(日) 19:17:09.30ID:EUfsW/B2質問の契機が思いの外しょうもなかった
HaskellでもFortranでもどっちでも良いが京では数学者が最適化しやすい方が良いんだろうな
どっちがいいかはプログラマ上がりじゃわかんねーや
0915デフォルトの名無しさん
2016/01/18(月) 07:26:30.97ID:lC5RiWYz別に死んでないよ
ajhcがコンパイルできなくなってるのは
単にApplicativeがMonadの上に追加されたのに
追従してないだけなんで簡単に直せるよ
0916デフォルトの名無しさん
2016/01/18(月) 08:10:47.49ID:z+08kDV+0917デフォルトの名無しさん
2016/01/18(月) 08:26:38.17ID:20Rww3ua0918デフォルトの名無しさん
2016/01/18(月) 08:38:12.76ID:lC5RiWYz0919デフォルトの名無しさん
2016/01/18(月) 09:44:26.78ID:2kgu3Wem0920デフォルトの名無しさん
2016/01/18(月) 11:20:01.95ID:8cTkl+Hb0921デフォルトの名無しさん
2016/01/18(月) 12:55:40.37ID:tos9CkFO練習もせずにぶっつけ本番なんてとんでもない
0922デフォルトの名無しさん
2016/01/18(月) 21:36:05.75ID:JZfdalHfMonadがどうこう以前に、GCに関連した処理がどこか
おかしくて、しかもMさんが見てもFixできなかったアレ。
(Mさんも本業の片手間だったかもしれないので
本当はがんばればFixできる可能性はあるけど、
どうも boxing - unboxing の処理が非常に込み入ってるらしく
jhcにちょろっとスケッチしてある程度の事だけを
ヒントにやらないといけないらしく、結局中断してる)
0923デフォルトの名無しさん
2016/01/19(火) 00:53:18.74ID:57+hGCwq純粋関数の可能性を追求したり、副作用のない環境での理論証明ツールだったり
そんな学術以外への転用がベストではない言語、普通のPGには使う意味ないもの
0924デフォルトの名無しさん
2016/01/19(火) 02:31:06.01ID:unNXfSBy0925デフォルトの名無しさん
2016/01/19(火) 08:54:34.98ID:PSMgNBFb0926デフォルトの名無しさん
2016/01/19(火) 09:41:41.72ID:N1YYkuEv0927デフォルトの名無しさん
2016/01/19(火) 09:45:48.91ID:n8RJjF560928デフォルトの名無しさん
2016/01/19(火) 10:42:59.62ID:n/8vNsiZ0929デフォルトの名無しさん
2016/01/19(火) 15:53:22.93ID:2890i3Ni静的型付けとかデザインパターンとか
デザインパターンはたとえば非決定性やイテレータやモナドや非同期のようなもの
0930デフォルトの名無しさん
2016/01/19(火) 16:10:57.67ID:u5xt7rMo0931デフォルトの名無しさん
2016/01/19(火) 18:57:29.11ID:utvSG+ku0932デフォルトの名無しさん
2016/01/19(火) 19:44:38.35ID:2890i3Niそのうち一つは玩具といわれても腹の立たない言語
C++, Java, Haskellから二つ選ぶなら重複の少ないものがよいからJavaは選ばない
0933デフォルトの名無しさん
2016/01/19(火) 19:47:55.74ID:n8RJjF56誰か日本語で訳してくれい
0934デフォルトの名無しさん
2016/01/19(火) 20:35:11.06ID:56LgXKla0935デフォルトの名無しさん
2016/01/19(火) 20:43:40.58ID:9Sv9SZsiHaskellを初めとする関数型言語は数学者にとって超絶便利。
しかしながら数学がわからない者にとっては難解なだけです。
まあ言ってみれば馬鹿には無理ってことなんですよ。
選ばれた天才が使ってこそ意味のある言語なんです。
0936デフォルトの名無しさん
2016/01/19(火) 20:49:29.88ID:1uIbW5OB0937デフォルトの名無しさん
2016/01/19(火) 21:02:43.49ID:2890i3Ni明記しないから正式名称が統一されている保証もない
0938デフォルトの名無しさん
2016/01/19(火) 21:34:03.32ID:n8RJjF56なるー、翻訳thx
0939デフォルトの名無しさん
2016/01/20(水) 07:09:49.67ID:xfIx1JoD0940デフォルトの名無しさん
2016/01/20(水) 22:33:36.75ID:zBNmSvu8makiが馬鹿にしてる「安倍首相」って現世にいる安倍首相とは別の人間なんじゃないか、って思うときがある。
なんか自分が妄想してる間抜けの具現した影を殴り倒してはしゃいでる、みたいな。
奴が書き込んでるコメントを見てると根本的な事すら理解してないことが結構ある。
0941デフォルトの名無しさん
2016/01/20(水) 22:35:37.60ID:zBNmSvu80942デフォルトの名無しさん
2016/01/21(木) 20:24:13.58ID:+cVcyY3w0943デフォルトの名無しさん
2016/01/24(日) 22:23:49.70ID:1M5wgVFfStatement.hsの34行目に型宣言は見つかったのですが、実態が見つかりません。
よろしくお願いします!
0944デフォルトの名無しさん
2016/01/24(日) 22:40:42.90ID:1M5wgVFfo実体
0945デフォルトの名無しさん
2016/01/24(日) 22:42:43.90ID:zJPsJxlDHaskellは停止の必要無しにネットワークのむこう側にでさえコードを移動できるのです。
計算の途中で性能の不足を感じたら、性能の高いマシンへイメージを転送し、実行を継続します。
ですから、実装がどこにあるかは問題ではないのです。
Haskellであること、そしてHaskellを使えることが重要なのです。
Haskell使いであることに誇りを持ちましょう。
0946943
2016/01/24(日) 23:37:58.35ID:1M5wgVFf僕が知りたいのはどのソースのどの行にexecuteの実装があるかです。
よろしくお願いします。
0947デフォルトの名無しさん
2016/01/25(月) 00:25:15.56ID:+Q+z/Jp3Javaで言うところのInterfaceみたいなもんだから
各データベース管理システムごとに実装が作られてる
sqlite3ならHDBC-sqlite3に
PostgreSQLならHDBC-postgresqlに
0948デフォルトの名無しさん
2016/01/25(月) 01:35:24.48ID:PuP3t03Qこんなのに騙される奴がいるのか?
前向きな事を言っているから建設的な議論なんだろうみたいな考えの奴しか騙せないだろ
Haskellはおもちゃという批判の方がまだマシだ
0949デフォルトの名無しさん
2016/01/25(月) 07:13:34.86ID:UErqEOmxOCamlスレに帰りたまへ
0950943
2016/01/25(月) 15:13:40.10ID:jwcC6CKdなるほど!ありがとうございます!
0951デフォルトの名無しさん
2016/01/25(月) 20:55:40.98ID:bhSAv5/D0952デフォルトの名無しさん
2016/01/25(月) 21:32:23.89ID:FKcC8XYP0953デフォルトの名無しさん
2016/01/25(月) 22:47:29.59ID:mYLsxkwY0954デフォルトの名無しさん
2016/01/26(火) 01:28:52.09ID:fLwBjkWJ得手不得手含めて、どれが好きか勝手に選べみたいな感じ。
って、書いてて全く意味が分からないが。
0955デフォルトの名無しさん
2016/01/26(火) 01:30:15.26ID:fLwBjkWJ0956デフォルトの名無しさん
2016/01/26(火) 08:56:48.33ID:9z2oQ6YSこマ?
0957デフォルトの名無しさん
2016/01/26(火) 09:22:36.05ID:hH8elJ+8ざっくりしすぎだけどまあ、気持ちとしては近いんじゃね
0958デフォルトの名無しさん
2016/01/27(水) 20:33:39.13ID:tY0EzgE50959デフォルトの名無しさん
2016/01/28(木) 03:10:29.57ID:s/n+KVu90960デフォルトの名無しさん
2016/01/28(木) 10:55:25.89ID:oB3jszBn0961デフォルトの名無しさん
2016/01/28(木) 11:11:40.25ID:tTuOSjjQ言語違うんだから完全一致の概念にはならんだろ
ざっくりした気持ちで受け止めとけ
0962デフォルトの名無しさん
2016/01/28(木) 19:20:31.31ID:V4rb6WtO0963デフォルトの名無しさん
2016/01/29(金) 22:37:12.50ID:V8UIRHzxこんな痰壺のぞきに来ないやろ彡(゚)(゚)
0964デフォルトの名無しさん
2016/01/30(土) 08:45:57.67ID:vmtmT3H6若者に嫉妬されるのも仕方ない
0965デフォルトの名無しさん
2016/01/31(日) 04:05:38.74ID:1wXDLlpgできる人はあれ一日でおkなん?
0966デフォルトの名無しさん
2016/01/31(日) 09:28:31.71ID:AEzrRz3r読み切るだけなら1日か、長くても数日でできるでしょう。
でも、理解して、納得して、自分の言葉で説明できるまでには
そうとう時間かかると思います。
1ヶ月やそこらでは無理な人は多いです。
がんばってください。
0967デフォルトの名無しさん
2016/01/31(日) 10:25:52.63ID:XFfzw+ki批判を封じると無駄が増えていく
0968デフォルトの名無しさん
2016/02/01(月) 06:10:51.64ID:zz5N12rG0969デフォルトの名無しさん
2016/02/01(月) 09:59:54.71ID:CiTgPvzPコードをさらせ
0970デフォルトの名無しさん
2016/02/01(月) 21:19:05.11ID:yGV1+rav聞いてくれ、さっき遅延評価の凄さを目の当たりにしたんだ。
無限リスト [[a], [a,a], [a,a,a], ・・・] を作る関数
stepup x = iterate (x:) [x]
リストから最左の指定要素を取り除く関数
remove xs x = xs \\ [x]
ここまで準備したところで、下記の計算をしてみる。
let xs = repeat 'a'
in head $ foldl remove (stepup 'a') [xs, xs, xs]
結果は、無限ループに陥ることなく "a" だ。
すごくね?
0971デフォルトの名無しさん
2016/02/01(月) 21:26:58.60ID:TMgHKDk0うんそうだね。
でも遅延評価ってのが何物なのかわかってくるとあんま驚かない。
0972デフォルトの名無しさん
2016/02/01(月) 23:05:53.20ID:t43chpFCそれをリスト構造として扱えるって点では便利かもね
0973デフォルトの名無しさん
2016/02/01(月) 23:14:58.61ID:Ciri+Qiy0974デフォルトの名無しさん
2016/02/01(月) 23:47:41.92ID:WxMLgo2+タスクを遅延している
もしプリエンプティブならタスクが勝手に動き出すので無限ループを止められない
メニーコアとかも無限ループを止められない
0975デフォルトの名無しさん
2016/02/02(火) 02:33:42.54ID:Dqi7KAqT0976デフォルトの名無しさん
2016/02/02(火) 04:43:44.40ID:xJAws4GV0977デフォルトの名無しさん
2016/02/02(火) 05:59:03.44ID:JJLoMZIDコーディングする人間の質が悪ければ何の意味も価値もなさない
http://ideone.com/880zvK
0978デフォルトの名無しさん
2016/02/02(火) 10:15:13.59ID:lBmePa6tまあこの程度のものを>>977みたいに書かれたらそりゃたまらんよな
0979デフォルトの名無しさん
2016/02/02(火) 18:57:44.79ID:PRq2IyAN悪いわけじゃないが、他者の可読性ってどうなんだ?
0980デフォルトの名無しさん
2016/02/02(火) 19:35:18.50ID:uTTEQY4N酷すぎて乾いた笑いが出るな
Sラン級糞コーダーに解答例書かせるとかPaiza大丈夫か
0981デフォルトの名無しさん
2016/02/02(火) 19:43:13.89ID:24ytvjJTそれに比べたら書いてあることの可読性がどうなろうと透視するのは簡単だろ
0982デフォルトの名無しさん
2016/02/02(火) 19:49:12.70ID:uTTEQY4N流石に一般人晒すのはマズイよ
0983デフォルトの名無しさん
2016/02/02(火) 20:19:13.66ID:qoaDQoLBfmap f EmptyTree = EmptyTree
fmap f (Node x left right) = Node (f x) (fmap f left) (fmap f right)
このコードで最初は(f x)なのに、あとの2つは(fmap f left)とfmapが先頭につくのはどうしてですか?
0984デフォルトの名無しさん
2016/02/02(火) 20:29:25.29ID:lBmePa6t1.つかないと型が合わないだろ
2.そもそも再帰的定義
「ある木に fmap f した結果は、根にfを適用し、葉の部分木にfmap fした木である」
が理解出来てるか?
0985デフォルトの名無しさん
2016/02/02(火) 20:44:20.82ID:qoaDQoLB>2.そもそも再帰的定義
>
>「ある木に fmap f した結果は、根にfを適用し、葉の部分木にfmap fした木である」
>
>が理解出来てるか?
すみません、理解できていないです。
なぜ葉は直接fを適用できないのでしょうか?
0986デフォルトの名無しさん
2016/02/02(火) 21:14:43.83ID:lBmePa6tたとえば整数の二分木(Tree Int)に
整数の偶奇性を判定する関数 even を fmap して
同じ形をしたブール値の二分木(Tree Bool)を得る場合を考えろ。
整数の(空でない)二分木は、根に値 x が収納され葉として部分木 left と right を持つので
Node x left right
という形をしている。
x の型は整数 Int で、 left と right の型は整数の二分木 Tree Int だ。
他方で、even の型は Int -> Bool なのだから、
even left とか even right という式は意味を成さない。
0987デフォルトの名無しさん
2016/02/02(火) 22:42:19.59ID:x3VaMdqQだからこそコンパイルが通ればバグが無いことを保証できるのです。
0988デフォルトの名無しさん
2016/02/03(水) 00:23:47.55ID:eYCB0y5I0989デフォルトの名無しさん
2016/02/03(水) 01:05:28.09ID:pvHSiWBf1. fが受け取るのは[xの型] (xは[Tree型]じゃない)
2. left と rightは[Tree型]
3. [Tree型]とfの仲介がfmap
おわかり?
0990デフォルトの名無しさん
2016/02/03(水) 03:37:57.16ID:mzFRVKkI0991デフォルトの名無しさん
2016/02/03(水) 04:12:58.04ID:OD3iNzjF0992985
2016/02/03(水) 11:15:50.69ID:B67PXnHg理解できました!
わかりやすい説明ありがとうございます!
0993デフォルトの名無しさん
2016/02/03(水) 13:15:08.68ID:KiXDjJxB0994デフォルトの名無しさん
2016/02/03(水) 13:41:55.87ID:vZagwsW/と言ってみる
0995デフォルトの名無しさん
2016/02/03(水) 13:47:52.96ID:WaqhOfMDそのGHCでGHC自体をARM向けにコンパイルすれば
ARM計算機上でHaskell使った開発ができるはず
0996デフォルトの名無しさん
2016/02/03(水) 14:04:22.91ID:uEOUJl1K0997デフォルトの名無しさん
2016/02/03(水) 17:44:14.30ID:vZagwsW/Androidなら誰か暇人が作ってそうだけど、あっても古くてメンテされてないかな
>>996
そのコメントは流石に的が外れすぎてる
0998デフォルトの名無しさん
2016/02/03(水) 20:41:29.18ID:WaqhOfMD0999デフォルトの名無しさん
2016/02/03(水) 20:54:22.37ID:jdFVwRiRキッズが空き時間にスマホにBluetoothキーボード繋いでCodeForcesやるだろ
1000デフォルトの名無しさん
2016/02/03(水) 22:28:22.77ID:SRrG8qzq10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
10021002
Over 1000Thread運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 2ちゃんねる専用ブラウザからの広告除去
★ 2ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
http://premium.2ch.net/
http://pink-chan-store.myshopify.com/
レス数が1000を超えています。これ以上書き込みはできません。