関数型プログラミング言語Haskell Part29 [転載禁止]©5ch.io
■ このスレッドは過去ログ倉庫に格納されています
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+空でないデータ構造に対して、その中のある(現在注目している)要素を特に指し示す
ある種のポインターを持った構造として使う、というのがよく知られた例ではないかと。
ストリームをチューリングマシンのテープに見立てた時のヘッドの現在位置とか。
■ このスレッドは過去ログ倉庫に格納されています