トップページtech
1002コメント372KB

関数型プログラミング言語Haskell Part29 [転載禁止]©5ch.io

レス数が1000を超えています。これ以上書き込みはできません。
0001岡部メモリリーク健2015/07/14(火) 19:27:09.01ID:jJ1YDtNe
関数型プログラミング言語 Haskell について語るスレです。

         ,.-―: ̄`ー::::::::::、
       /::::::::::::.::::::::::::::::::::::::::::`::、、
      /::::::::::::::::::::::::::::::::::::::::::::::::::::::`、
      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:jJ1YDtNe
過去スレ一覧
27) 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:jJ1YDtNe
20) http://toro.2ch.net/test/read.cgi/tech/1350428908/
19) 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:i6nYqHOg
AIZU ONLINE JUDGE 競技プログラミング
http://judge.u-aizu.ac.jp/onlinejudge/index.jsp

Haskellで書けるようになった
0007デフォルトの名無しさん2015/07/14(火) 21:59:12.35ID:rJOXcg+a
>>6
うおおお!!朗報だありがとう!!!
0008デフォルトの名無しさん2015/07/14(火) 22:54:43.45ID:zZLZaIbg
このスレが本スレだな。例のAAが無いと盛り上がらん。
0009デフォルトの名無しさん2015/07/14(火) 23:45:50.85ID:9bHYU59E
>>6
うおおお!やったぜ。
0010デフォルトの名無しさん2015/07/15(水) 08:14:27.60ID:4Hwk0PWM
命令型でないとrangeもmapも書けないのは海外では常識。
そのことは海外のサイト見れば明らか。権威のある人物ならみんな知ってる
0011デフォルトの名無しさん2015/07/15(水) 10:03:03.19ID:YlUThGkU
>>10
それはわからんのよ。
バイオコンピュータによって可能になるかもしれんしな。

ただ、今目の前にあるのはバイオコンピュータではないってことが大事なんだろうな。

バイオコンピュータが目の前に来てからHaskellを使おうと考えるのが普通の人だわな。
まあその時には、Haskellは無くなってるだろけどな。
0012デフォルトの名無しさん2015/07/15(水) 10:12:30.07ID:7IHYvImg
http://web.archive.org/web/20150715011113/http://qiita.com/nonstarter/items/2763f5d85f2b8df3b18b
0013デフォルトの名無しさん2015/07/15(水) 10:14:47.29ID:FLOJGmtq
関数型言語におけるmapの定義:

https://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:xvlXRMcz
UCLA卒業と、岡部健(kenokabe・毛の壁)を語ろう [転載禁止]©2ch.net
http://hello.2ch.net/test/read.cgi/joke/1436928203/
0015デフォルトの名無しさん2015/07/15(水) 12:19:15.92ID:K1aSLVoR
>>14
もう許してやれよ
0016デフォルトの名無しさん2015/07/15(水) 15:43:52.14ID:D9jiOfI+
岡部健がQiitaのコメント欄に出没してるぞ〜(歓喜)

http://qiita.com/nonstarter/items/2763f5d85f2b8df3b18b#comment-7d7a978d53ad17b911c5

今度の名前はqiitapostの模様
0017デフォルトの名無しさん2015/07/15(水) 15:53:29.88ID:LpfZNZ91
とうとう荒らしに墜ちたか
0018デフォルトの名無しさん2015/07/15(水) 19:19:40.86ID:UBeVoT4I
教育者の端くれなのに、やることが小さいね
0019デフォルトの名無しさん2015/07/15(水) 22:55:42.93ID:d/UN4JRs
>>1にこんな品のないAAを貼り付けるのはよくない
こんなスレ、僕は認めないからな
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:GJpPkx9w
mapは命令型でしか書けない。
0022デフォルトの名無しさん2015/07/16(木) 20:22:23.87ID:r83nWszG
おい、Codepadのようなものを「エミュレーター」と解釈できる、なんらかの要素があるとしたらどのあたりなんだ?
0023デフォルトの名無しさん2015/07/17(金) 09:35:07.66ID:tmwhQ/Tf
モナドって一言で言うとなんなん?
0024デフォルトの名無しさん2015/07/17(金) 10:24:36.36ID:F5MI8UaQ
世界線
0025デフォルトの名無しさん2015/07/17(金) 10:36:26.09ID:MFPhKAxg
>>23
class Monad m where
(>>=) :: m a -> (a -> m b) -> m b
return :: a -> m a

っていう関数が定義されていてモナド則を満たすもの
0026デフォルトの名無しさん2015/07/17(金) 11:26:02.98ID:6p5xRLuM
>>25
なるほど
やっぱり岡部健の間違いか。
0027デフォルトの名無しさん2015/07/17(金) 13:59:02.04ID:ZQ7d1iCZ
foldでmapは書けるが、岡部健はその事と間違えてたんだろうな
0028デフォルトの名無しさん2015/07/17(金) 18:24:18.12ID:xMYrjQca
>>25
一言で言うとなんなん?言うてるやん
それともほんとは分かってないから言えないとか?
0029デフォルトの名無しさん2015/07/17(金) 20:05:48.09ID:OMUEmUCh
なんやこら調子乗んなしばくど
0030デフォルトの名無しさん2015/07/17(金) 22:36:24.63ID:5l1JDgrx
>>28
「一言」って、どれくらいの長さまで認めてくれるの?
0031デフォルトの名無しさん2015/07/17(金) 23:01:29.55ID:MFPhKAxg
>>28
自己関手の圏におけるモノイド対象
0032デフォルトの名無しさん2015/07/18(土) 00:36:23.29ID:74tlor8C
>>23,28
順次、反復、分岐のうち分岐を可能にする構造[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
>>32
その説明、ずっと分からなかったんだけど、反復を実現するのはApplicativeなの?
単に関数を再帰的に定義すればいいんじゃないの?
0035デフォルトの名無しさん2015/07/18(土) 09:51:48.04ID:H0ZPg8aJ
>>31 じゃなくて
>>32
そうそうこういうのがいいんだが、
モナドって、命令型でふつうにできてることを関数型の中でもやりたいってことでOK?
そうすると、IOはいいけどMaybeやListが置いてけぼりになるんじゃないの?
0036デフォルトの名無しさん2015/07/18(土) 11:55:58.35ID:wQVOOXnd
Maybe/Eitherならエラー時の処理、リストならリスト内包表記におけるフィルター処理が分岐にあたる
他のモナドだと直感的に「分岐」とはみなせないような例もあるかもしれないけど
そのモナドなりの意味で分岐を解釈できるはず

Functorを箱とみなすか文脈とみなすかみたいな話と同じで
一言で言おうとしたときに具体例を選べばどうしたって他で無理のある解釈が出てくるわけで
そこを突っ込みたかったら結局「定義にもどれ」ということになる
0037デフォルトの名無しさん2015/07/18(土) 12:31:05.33ID:H0ZPg8aJ
>>36
ああそう、やっぱり>>32はあくまで初心者向けの通俗的解釈に過ぎないわけね。
また振り出しにもどったわw
> そこを突っ込みたかったら結局「定義にもどれ」ということになる
突っ込みたいわけじゃないんだが。。。
「定義にもどれ」ってのは、一見もっともに聞こえるがダメダメよw
「なんでそんな定義なの?」というのが大事なわけで。
それに定義というなら、『Monad は、単なる型クラスの一つで、それ以上でも
それ以下でもありません』でほんとおしまいなんだし
0038デフォルトの名無しさん2015/07/18(土) 12:36:02.25ID:v0EKlLM2
皆様方
以降、スルーでよろしくおながいします
0039デフォルトの名無しさん2015/07/18(土) 13:51:37.96ID:0Oe5sxAP
モナド変換子が絡むと一気にむずかしくなるなぁ
StateTとIOの複合は頻出っぽいから頑張って身につけたい
なにか参考になるサンプルとかないでしょうか
0040デフォルトの名無しさん2015/07/18(土) 14:56:48.04ID:BTDuC5lZ
https://gist.github.com/anonymous/1944f34703bcb63131d8


これはどちらが正しいんだ?
0041 ◆Ww2pZaKGaW0T 2015/07/18(土) 15:17:02.40ID:UfuhnolG
最初に無があった
無は有を生んだ
これが全ての真理
0042デフォルトの名無しさん2015/07/18(土) 19:49:11.57ID:sxZpdZw2
>>40
ちゃんと見て無いけど、
どっちもどっちな感じ…
0043デフォルトの名無しさん2015/07/18(土) 20:30:55.47ID:8uXNBMZf
>・他方、worldcomponentライブラリを用いてunmount処理を書こうにも、ライブラリ自体が対応していないので、
>状態を完全にリセットしてしまうか、ライブラリの実装の内部に立ち入らない限り、書けません。
>(これは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
>>37
うんじゃぁ これも通俗的な話だけど
(>>=) :: m a -> (a -> m b) -> m b
って関数が凄い便利なんだよ scalaだとflatMapなんていったりするけど
monadの力って (>>=) って関数が定義されてる mっていうデータ構造(文脈だの箱だの言われるが)
これをhaskellは副作用を扱うのに使ってるけど
副作用を普通に扱える言語でもmaybeやfutureみたいにエラー時の処理や非同期計算に便利なんだ
もちろん上は全然正確な話ではない
0045デフォルトの名無しさん2015/07/18(土) 22:45:41.76ID:obUySxxZ
>>43
これに関してはメモリリークの件でコード改竄を指摘されて
「お前らだってコード改竄してるじゃないか!」
って言いたいんだろうなぁと思う。

事実関係よりも心の平安を保てるかどうかで発言してるっぽいし。
0046デフォルトの名無しさん2015/07/19(日) 00:11:41.45ID:g7CK7gj2
main = do
print "Hello"

これをghc hello.hsすると生成された実行ファイルのサイズが1MB超えるんですが
こんなものですか?
もっと大量のコードが書けるほどのレベルではないんですが、500行ぐらい書いたらサイズが1GB言っちゃうんじゃないかと心配になりました
0047デフォルトの名無しさん2015/07/19(日) 00:36:25.80ID:Nq0FmX+u
ランタイムの分がでかいからな、なんで線形に増加すると思ったのか
0048デフォルトの名無しさん2015/07/19(日) 01:43:02.12ID:csGsF3Kw
qtライブラリを使えば、1mbぐらい気にならなくなるじゃろ。
0049デフォルトの名無しさん2015/07/19(日) 07:26:20.64ID:au0Vcvuj
>>46
jhcを使うとランタイムがないぶんそれだけ小さくなるというのを
岡部究(master_q)さんが一時期熱心に調べてたな。
0050デフォルトの名無しさん2015/07/19(日) 08:05:11.94ID:BgJ/88od
>>44 はかなり良い説明だと感じた。
一面を捉えた正確な説明だと思いますよ。
0051デフォルトの名無しさん2015/07/19(日) 10:16:27.53ID:ZQ+VxBJa
>>44
> (>>=) :: 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+dCI5P
取り敢えず初心者にモナドってなんなの?って訊かれたら、オレオレDSLのフレームワークって言っときゃ良いんでしょ?
0053デフォルトの名無しさん2015/07/19(日) 13:47:54.47ID:I4MCl2HA
モノイド大将がボス
0054デフォルトの名無しさん2015/07/19(日) 15:46:09.62ID:I1Wicbx/
>>52 その説明いつも全然意味不明
0055デフォルトの名無しさん2015/07/19(日) 16:48:46.04ID:OqblcV5w
>>51
まず最初に、モナドと全く関係のない言語が、副作用を無節操に広く適用した
そうして無節操に広がったIOの適用範囲の一部をIOではなくMaybe等で書き直している
Maybeが広くなった分だけIOが狭くなるのでモナド全体の広さは変わらない
0056デフォルトの名無しさん2015/07/19(日) 17:14:36.93ID:kvcDaKH1
>>48
QtでもさすがにHello出力だけで1MB超えは無い。
0057デフォルトの名無しさん2015/07/19(日) 18:26:20.48ID:ZQ+VxBJa
>>55
> まず最初に、・・・副作用を無節操に広く適用した
> IOの適用範囲の一部をIOではなくMaybe等で書き直している
> Maybeが広くなった分だけIOが狭くなる
上の3行の一つ一つが意味分からん。
もう少し補足してくれんか
0058デフォルトの名無しさん2015/07/19(日) 19:00:07.54ID:OqblcV5w
>>57
分からんなら後回しにして比較的分かりやすいところを先に解決すればいいと思う
分からんところに拘るのは効率が悪い
0059デフォルトの名無しさん2015/07/19(日) 19:13:47.34ID:ZQ+VxBJa
>>58
例えば教科書に出てくるなにかの概念が分からんというようなことじゃなて、
あなたが>>55に書いている文が、あれじゃ意味不明と言ってるんだが。
副作用を無節操に広く適用ってどういうこと?
そしてIOとMaybeしか出てこんがモナドはこの二つだけじゃないし
0060デフォルトの名無しさん2015/07/19(日) 19:32:23.42ID:OqblcV5w
>>59
対案を出せばいいと思う
0061デフォルトの名無しさん2015/07/19(日) 21:26:06.98ID:BgJ/88od
>>51 のような疑問は、Applicative と Monad のパワーの違いとは?ということであり、
それについてはすごいHaskell に平易な解説があったと思う。

要するに>>= があるおかげで、 モナドから取り出した値を見て、次に行う副作用を作れるってことだ。
0062デフォルトの名無しさん2015/07/19(日) 23:30:44.39ID:ZQ+VxBJa
>>60
対案出せと言われましても意味分からんからできません、なんよw わからへん?

>>61
> 要するに>>= があるおかげで、 モナドから取り出した値を見て、次に行う副作用を作れる
それって、 (>>=) :: m a -> (a -> m b) -> m b  言うてるだけやし
0063デフォルトの名無しさん2015/07/19(日) 23:34:09.77ID:bed99W+w
実際monadとapplicativeどっちも使える状況なら
applicative使ったほうがいいよって言われてね?
0064デフォルトの名無しさん2015/07/20(月) 00:20:18.66ID:0TG+/+/W
和書のどれかに載ってた床下配線が一言だと一番分かりやすいと思った
0065デフォルトの名無しさん2015/07/20(月) 00:27:41.08ID:wg3sT89+
>>61
取り出すところまでは同じだが、取り出した後でできることが違う
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
つか正直>>51が何言ってるかわからん

>>63
mapでできることをfoldや再帰でやらないってのと同じ発想だね
0067デフォルトの名無しさん2015/07/20(月) 09:29:20.00ID:c+ACSEXZ
>>64
箱やコンテナもそうだがそういう物理的比喩は所詮本物じゃない

>>65
超えられないのか?
0068デフォルトの名無しさん2015/07/20(月) 09:57:42.74ID:wg3sT89+
>>67
IOが超えられない
モナドクラスというのはIOと同じクラスになりたいやつが集まってるから
0069デフォルトの名無しさん2015/07/20(月) 21:32:15.43ID:tLpP/4eq
data DataType = DataI [Int] | DataF [Float] | DataD [Double]
deriving (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:WnNA5LDR
そりゃ型あわないんだから出来ないよそんなこと
0071デフォルトの名無しさん2015/07/20(月) 22:03:47.04ID:l2CykBu3
クソアマ死ね


まさかとは思うが kenokabe先生(a.k.a qiitapost, chimetorch) は React.js を使いさえすればプログラムが FRP になると考えているのだろうか。
https://twitter.com/bolero_MURAKAMI/status/623057115456733184
0072692015/07/20(月) 22:10:25.52ID:tLpP/4eq
>>70
関数のオーバーロードみたいの使ってできるようにないませんかね??
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+
>>69
>getData :: DataType -> a

なんでこの型付けがおかしいかわかれば
getDataが作れないことの諦めがつくよ。
0075デフォルトの名無しさん2015/07/20(月) 23:52:10.07ID:WnNA5LDR
>>72
Haskellに関数のオーバーロードはない
型クラスを変に絡めればあるにはあるけど

どういう状況を想定してその関数がほしいと思ったのかを教えてもらえれば、アドバイスできるかもしれない
基本的にHaskellではそういう関数を必要とすることはないはず
0076デフォルトの名無しさん2015/07/21(火) 00:28:11.79ID:2lFdT9I+
>>69
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
>>76
確かに記述上できる事になるけど
意味ないなあー
0078デフォルトの名無しさん2015/07/21(火) 01:37:31.91ID:XB/uoEzx
むしろ

Num a => DataType a
getData :: DataType a -> [a]

みたいにしたらいけない理由が見当たらない。
0079デフォルトの名無しさん2015/07/21(火) 01:57:25.58ID:iDhKY9Vq
>>69
欲しいのは (Num a) => [a] のような型か
fromIntegralとかrealToFracのような
具体型をジェネリックな数に変換する関数だったりしないだろうか
0080デフォルトの名無しさん2015/07/21(火) 13:15:45.21ID:Dco/MENI
モナドは一度使えば最後までついて回るしがらみ
0081デフォルトの名無しさん2015/07/21(火) 13:21:44.03ID:/2Z49al6
なんだかんだ言っても、モナドって、結局、低級言語のデザインパターンなんだな
一言で言えばそういうことだった
0082デフォルトの名無しさん2015/07/21(火) 13:22:20.40ID:B0LBt+ac
岡部健がQiitaで発狂続けてて大草原
0083デフォルトの名無しさん2015/07/21(火) 13:32:51.80ID:aaCdXzrq
http://yomogi.2ch.net/test/read.cgi/net/1437302243/
GitHub/Qiita/StackOverflowの臭い奴を観察1
0084デフォルトの名無しさん2015/07/21(火) 19:49:21.60ID:LwXUVlfX
https://gist.github.com/anonymous/10622bea0d37cdd0f59f
0085デフォルトの名無しさん2015/07/21(火) 22:58:37.09ID:eRnXfzMM
毛の壁の記事を探索するbotコンテストでも開催しろ
0086デフォルトの名無しさん2015/07/23(木) 08:07:45.47ID:Hd8z6Qav
>>82
Qiita荒らしにしか見えない。
0087デフォルトの名無しさん2015/07/23(木) 09:38:20.27ID:UOPnVIxG
Monadでは
>>= :: ma -> (a -> mb) -> mb
となっているですが、これは、どうして
>>= :: ma -> (ma -> mb) -> mb(つまり普通のapply)
ではだめなのでしょうか?
0088デフォルトの名無しさん2015/07/23(木) 10:23:45.67ID:9NQb4Eqn
>>87

X -> 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
>>87

ついで。 IO () みたいに、「中身がない」というか、文脈を持ってるという以外に
意味がないモナド値ってのもある。もっと広く言うと状態系のモナドね。

そういう場合、

f :: X -> m ()
g :: Y -> m ()
h :: Z -> m ()

みたいなのを「つなげたい」場合がある。これは入り口が違うので (>>=) は使えない。
だもんで、(>>) なんてのがある。
0090デフォルトの名無しさん2015/07/23(木) 10:46:01.13ID:UOPnVIxG
>>88
>>= :: ma -> (a -> mb) -> mb
を用意する代わりに、
extract :: ma -> a
みたいなのがあれば、普通の関数適用だけでも同じことができるのではないのですか?
0091デフォルトの名無しさん2015/07/23(木) 11:47:48.09ID:9NQb4Eqn
>>90
「そういうのが作れるならば」あなたのおっしゃるとおり。

具体的に考えてみましょう。 m が Maybe の場合、 extract Nothing は何になりますか
0092デフォルトの名無しさん2015/07/23(木) 11:59:35.34ID:9NQb4Eqn
>>90
よくいろいろなところで、(>>=) は「モナドから値を取り出して関数に適用する」
と言われたりするけど、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
>>91
> extract Nothing は何になりますか
なるひどこれは困った。。。

>>92
たしかに、fmap と join を基礎にすれば、 >>= はその一手ですね

>>= :: ma -> (a -> mb) -> mb の中では、特に、
a -> mb の部分がモナドにとって本質的なんだなと思えてきました
0094デフォルトの名無しさん2015/07/23(木) 13:35:05.00ID:UOPnVIxG
>>92
> そういううまいルールをどうやって設定するかみたいな話をするために圏論を借りてきてる。
「そういううまいルール」とは、どこの事でしょうか?
0095デフォルトの名無しさん2015/07/23(木) 13:41:38.62ID:UOPnVIxG
>>92
extract :: ma -> a
は存在しない場合があるようですが、
いつも存在しないのですか?
また、join :: m(ma) -> ma
は必ず存在するのですか?
0096デフォルトの名無しさん2015/07/23(木) 14:03:17.98ID:9NQb4Eqn
>>94
そういう上手いルール、はモナド則です。(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:KEVSaEFA
日本語でおすすめの入門サイトってありますか?
0098デフォルトの名無しさん2015/07/23(木) 21:02:13.38ID:hAeb0KoI
Haskellの型システムは入門用ではない
静的型と動的型の高度な煽り合いの成果物だ
0099デフォルトの名無しさん2015/07/23(木) 21:31:05.23ID:UOPnVIxG
>>96 :デフォルトの名無しさん:2015/07/23(木) 14:03:17.98 ID:9NQb4Eqn
> そういう上手いルール、はモナド則です。
うまいというより、ふつうに定義すればモナド則は満たされるのではないですか?

> join :: M(M a) -> M a
> の存在は、モナドの構成要件の一つだと言って差し支えないと思います。
joinがそうであるのにextractがそうでないのはなぜでしょうか?
まあ、oinは不可欠だが、extractはなくても代わりがあるからだということなのでしょうが
0100デフォルトの名無しさん2015/07/23(木) 21:46:55.16ID:9NQb4Eqn
>>99
たとえば 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+
>>100
空でないデータ構造に対して、その中のある(現在注目している)要素を特に指し示す
ある種のポインターを持った構造として使う、というのがよく知られた例ではないかと。

ストリームをチューリングマシンのテープに見立てた時のヘッドの現在位置とか。
0102デフォルトの名無しさん2015/07/23(木) 22:28:56.93ID:ul3W6A8M
extract を要求しなくてもいろんなことができる、という程度におれは考えてるなぁ
0103デフォルトの名無しさん2015/07/23(木) 23:19:05.16ID:UOPnVIxG
> たとえば http://d.hatena.ne.jp/itto100pen/20090710 に、モナド則の一部が満たされない例があります。
ページ紹介ありがとうござます。
そこの return x = [x x] は、(私の思うw)「ふつうの」定義ではないので、
それがモナド則を満たさないのも尤もかなと思いました
0104デフォルトの名無しさん2015/07/23(木) 23:32:47.82ID:GSXYPmA+
>>103
逆に言えば、あなたが直観的に思う「ふつう」を保証してくれるのがモナド則なのですわ。
0105デフォルトの名無しさん2015/07/23(木) 23:45:33.49ID:UOPnVIxG
>>104
モナド則というのがそういうものだという説明ははじめて聞きました。本当ですか?
0106デフォルトの名無しさん2015/07/24(金) 00:04:12.32ID:E+4NqHJH
まあ要はそれらは「自然」な振る舞いをするようにできているのです。
0107デフォルトの名無しさん2015/07/24(金) 06:20:03.70ID:SOLi30hJ
そんな希望的観測は法則を知らなくてもできるから法則の意味がない
法則はもっと不吉な意味を持つべきなんだよ

「不自然にならないよう自然を保証してくれるので復旧シナリオは考えていない」
まさかこのパターンの意味がわからない難聴系主人公はいないよね
0108デフォルトの名無しさん2015/07/24(金) 08:17:51.80ID:ZflfUkEE
>>107
> 「不自然にならないよう自然を保証してくれるので復旧シナリオは考えていない」
> まさかこのパターンの意味がわからない難聴系主人公はいないよね
ここよくわからない。少し説明を加えてくれませんか
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:qo8KZeeD
>>110
ZipList
理由はこれ http://www.mail-archive.com/[email protected]/msg57217.html
0112デフォルトの名無しさん2015/07/24(金) 12:24:32.99ID:mRGyPSzK
>>109
確かにロボットが困った顔してるように見える
0113デフォルトの名無しさん2015/07/24(金) 16:30:09.13ID:sUR4TL+C
>>110
間違ってるかもしらんけど
関数はFunctorやApplicative Functorだけどmonadではなかったような
0114デフォルトの名無しさん2015/07/24(金) 18:21:56.53ID:ZflfUkEE
>>113
関数は恒等モナドなのでしょう?
0115デフォルトの名無しさん2015/07/24(金) 20:30:46.83ID:ZflfUkEE
とにかくモナド則ってモナドの本質とは全然関係ないですよね。
そのネーミングがよくないなw
0116デフォルトの名無しさん2015/07/24(金) 22:02:00.45ID:UUB1Rdtf
>>115
モナドの本質とは、Kleisli射が「合成できる」ことであって、モナド則は
そのような合成が well-defined であることを保証しているという意味では本質と
関係している。
0117デフォルトの名無しさん2015/07/24(金) 22:15:15.51ID:E+4NqHJH
>>113
(->)型はモナド。
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
>>111
なるほどZipListか
まだちゃんと読めてないんだけど、
> (可算無限も含めて)長さが固定のベクトルだったらその定義で上手く行くんだけどね、
> でも一般のリストに対する上手い定義ももしかしたらあるかもね
って感じの結論か
return (= pure) が無限リストを返すから
確かにモナド則を満たすのは容易ではなさそう

>>115
Haskellでは型さえ合っていればコンパイルできてしまうだけで
モナドがモナド則を満たすのはむしろ定義だと思う
0120デフォルトの名無しさん2015/07/24(金) 22:52:20.29ID:jOlzxqLq
まあMonadLikeクラスでも作ってモナド則無しでやってみろよ
辛くなったら帰って来い
0121デフォルトの名無しさん2015/07/24(金) 23:04:31.56ID:ZflfUkEE
>>116
> モナド則は...合成が well-defined であることを保証している
>>118
> モナド則は情報量保存則のようなものだと思ってもよい
>>119
> モナドがモナド則を満たすのはむしろ定義だと思う

えっ? モナド則って単位元の存在と結合則ですから、モナドに限らないおよそ代数演算に
課される最低限の規則に過ぎないでしょう?
0122デフォルトの名無しさん2015/07/24(金) 23:18:40.52ID:UUB1Rdtf
>>121
その最低限の規則だって明示的に指定して置かなければ混乱するでしょ。
あなたにとって最低限のことは隣の誰かにとっては最低限の常識ではない。
0123デフォルトの名無しさん2015/07/24(金) 23:40:04.07ID:XFwmWe1A
結合法則 (x + y) + z = x + (y + z)
交換法則 (+ z) . (x +) = (x +) . (+ z)
これらは数学的に同じ意味だから
結合法則は最低限だとか、交換法則は最低限じゃないとかいうのは
数学じゃなくて言葉遊びだよね
0124デフォルトの名無しさん2015/07/25(土) 07:47:47.08ID:6zkZTkly
結合法則を満たせば半群
群は交換法則を満たさなくてもよい,満たすものを特に可換群とよぶ

十分に数学的だ
0125デフォルトの名無しさん2015/07/25(土) 07:57:27.29ID:Jr3WK49j
非可換群なんかいくらでもあるのにね。
0126デフォルトの名無しさん2015/07/25(土) 08:09:08.78ID:Jr3WK49j
Z上でのある演算(+)の結合法則から構成される構造を
別の台集合(+z)(x+)と合成(.)で構成される構造に等価だといったところで
もとの演算(+)の可換性について何も言ったことにはならないというだけのことよね
01271212015/07/25(土) 08:44:38.00ID:Bvjhkxqq
>>122 >>123
強調点は「最低限」のところではなく「およそ(ふつうの)代数演算に共通」
というところにありました
01281212015/07/25(土) 08:46:08.24ID:Bvjhkxqq
だから、モナドの特質を表すものじゃないと
0129デフォルトの名無しさん2015/07/25(土) 08:55:06.98ID:gZG0Y+YD
>>126
嘘を言ったのではなく何も言ってないのか
チャレンジよりゼロリスクを選んだ人間がどのような評価を受けるかという意味で面白い
0130デフォルトの名無しさん2015/07/25(土) 09:14:59.38ID:bPfkCbEC
数学の話はいいからHaskellの話を
0131デフォルトの名無しさん2015/07/25(土) 09:34:33.91ID:Bvjhkxqq
trace :: ((B, D) -> (C, D)) -> B -> C
trace 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
HackageDBである特定のパッケージに依存しているパッケージの一覧を得る
検索方法はないでしょうか。

たとえば、yesod が必要なパッケージの一覧など。
0134デフォルトの名無しさん2015/07/26(日) 14:06:20.87ID:ihM0rggd
>>132
その「選択と集中」というカルト宗教流行ってるの? 根拠もなんもないくせに
耳あたりだけいい言葉に騙されてない?

選択と集中でおもいっきり原子炉にぶっこんだ東芝はどうなった? 
0135デフォルトの名無しさん2015/07/26(日) 20:37:01.68ID:vJ1KGCO5
さすがにそこで原発でてくんのは謎
0136デフォルトの名無しさん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:vJ1KGCO5
モナド則満たしてないモナドインスタンスなんて欲しくないもの買わされたって状態だよ
0139デフォルトの名無しさん2015/07/26(日) 21:02:55.04ID:PdaEJy2y
モナド則を満たしていることをコンパイル時に証明する機構がHaskellに望まれる
0140デフォルトの名無しさん2015/07/26(日) 23:01:02.42ID:ooP+OwHf
完全な保証は無理でもQuickCheckあたりでなんとかならんかな
0141デフォルトの名無しさん2015/07/27(月) 03:43:19.54ID:+mQx9Q9E
選択と集中というのは、経済学の用語で比較優位の話だ。

なんでこんな所で選択と集中の話が出てくるの?
0142デフォルトの名無しさん2015/07/27(月) 06:11:57.70ID:3edBlaSG
よくわからないけどモジュールは疎結合が正義って話しかな?
0143デフォルトの名無しさん2015/07/27(月) 11:31:50.70ID:pQHi2myk
exportは天国、importは地獄
特に、間接的なimportを強制されたら最悪
0144デフォルトの名無しさん2015/07/27(月) 22:21:38.16ID:+pmDbRz6
>>137
ジャック・ウェルチが言ってる「選択と集中」とは何の関係もないな
0145デフォルトの名無しさん2015/07/28(火) 05:08:55.87ID:XoUEQPXj
なるほど
ジョブズのようなものがいるんだ
0146デフォルトの名無しさん2015/07/28(火) 11:57:02.42ID:RBpFIWq5
プログラマも経営センスを求められるというお話?
0147デフォルトの名無しさん2015/07/28(火) 13:39:01.53ID:d4M8qnVV
>>132
ジャック・ウェルチの「選択と集中」でもってあなたが何を言わんとしてるか
さっぱりわからないし、「型に特質がある」という言い方も意味不明。
モナド則は値の特質ではなくモナドでラップされた型がどのように振る舞うか
を決めてるのであって、このルールがあるからこそ do 記法を
安心して使える。とにかく地道に勉強しよう。
0148coolio2015/07/28(火) 16:34:52.05ID:n3cGSoaV
Haskellってオワコンなんでは?
なんでJavaScript使わないのみなさん?
普及率も需要もこっちの方が上だし、国際的潮流かとおもうけど
0149デフォルトの名無しさん2015/07/28(火) 17:47:57.77ID:d4M8qnVV
>>148
じゃあまずお前が国際的潮流に合わせて英語か中国語で書き込めよ
0150デフォルトの名無しさん2015/07/28(火) 17:50:36.54ID:Ni9zj/4A
Javascriptやってればいいじゃん
人のことはどーだってよくね?
0151デフォルトの名無しさん2015/07/28(火) 21:05:55.89ID:ROVV0dd8
まるで何でスタバ行かないのって聞かれたような気分
0152デフォルトの名無しさん2015/07/28(火) 21:40:55.38ID:UXOcgM9+
>>149
哦,可以用國語嗎?你看得到呢?
0153デフォルトの名無しさん2015/07/28(火) 21:54:20.49ID:d4M8qnVV
>>152
日本語でOK
0154デフォルトの名無しさん2015/07/28(火) 22:15:38.33ID:uKnSRdVu
我想喝啤酒!
0155デフォルトの名無しさん2015/07/28(火) 22:49:30.17ID:MQ4Zq0Y1
Haskellは無料で遊べちまうけど需要のあるJSは徹底的に課金するべき
0156デフォルトの名無しさん2015/07/28(火) 23:02:16.25ID:2DleteTo
ビールといえば、資源ごみ捨てないと…
0157デフォルトの名無しさん2015/07/30(木) 13:15:34.02ID:XKVzkpKt
ghcの新型出るんですか?
0158デフォルトの名無しさん2015/07/31(金) 14:52:35.97ID:gTceL3gJ
毛の壁また来てるの?
さっさと2chから消えろ
0159デフォルトの名無しさん2015/07/31(金) 21:02:27.62ID:SPFFmEBo
無理だよ、毛は10年前からナンパ書き込みしたりしてるから
0160デフォルトの名無しさん2015/07/31(金) 22:59:33.38ID:Tuqyf3gY
いつどこに誰が来たのかさっぱりわからないし意味不明。
0161デフォルトの名無しさん2015/08/01(土) 01:31:31.22ID:CYsajC4S
ヤングアニマル No.15
アンダーメンバー全員集合 16ページ お祭り騒ぎ

ベルセルク連載開始 + 別冊付録 直近4話分


皆、短パン・ランニングシャツ姿
堀・らりんのお股
ひめたんの胸
0162デフォルトの名無しさん2015/08/01(土) 05:22:40.82ID:494SgxRt
そういや原発の長文書き込む荒らしがなりを潜めたと思ったら、入れ替わるように毛の壁ブームが起こったな
0163デフォルトの名無しさん2015/08/01(土) 10:47:10.94ID:jD/MwJWz
1人しか敵視しない1bit脳が基本だから
客観的に1人いようが2人いようが主観的には1人しか視えない
0164デフォルトの名無しさん2015/08/02(日) 20:21:12.98ID:htkPKsn5
モナドの合成って難しいことなの?
0165デフォルトの名無しさん2015/08/02(日) 20:36:45.90ID:SLv/zRdd
>>162
原発長文君は効率的な情報収集という意味では有用であった復活を拒絶しない
0166デフォルトの名無しさん2015/08/02(日) 20:39:24.29ID:Iy0keT5I
きーたぽすととかいうけのかべが抹消されたようだ
0167デフォルトの名無しさん2015/08/02(日) 21:10:57.21ID:jhqklPYl
cabal-installでドキュメントも一緒にインストールする際のhtmlのリンクの質問です。

パッケージをインストールするとドキュメントも一緒にインストールされるように設定しましたが、
ドキュメントのルートの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
>>167
>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:PjsL8G7T
あ、 ....../$pkgid/html/index.html かな。パスの途中に "html" 入れ忘れた。
0170デフォルトの名無しさん2015/08/02(日) 21:27:13.13ID:PjsL8G7T
ごめん見当違いだったわ。
総インデックスファイルは確かにそこになきゃダメだ。
0171デフォルトの名無しさん2015/08/02(日) 22:14:50.22ID:5gB+ySz/
>>164
モナドは自己関手なんで、関手を合成することができるが、
そうしてできた合成関手は一般にはモナドにならない。
0172デフォルトの名無しさん2015/08/02(日) 23:43:12.86ID:htkPKsn5
>>171
合成関手はモナドになり得ると思うが。。。
モナドの合成は一般にはモナドにならないということね?
なぜそうなのか、まだよく分かってないのだが、
そもそも合成できないっていうのはモナドが圏的でないということね?
それって結構困ったことなのでは?
0173デフォルトの名無しさん2015/08/03(月) 01:17:03.15ID:kH5++B+D
>> 167
見当違いかもしれないけど、俺の手元の~/.cabal/configは
htmldir: $docdir/html
になってた。貴方のは
htmldir: $dicdir/html
0174デフォルトの名無しさん2015/08/03(月) 07:24:39.84ID:UJ5SIf4H
>>173
すいません、ただの書き間違えです。
私の方でも正しくは

htmldir: $docdir/html

です。
0175デフォルトの名無しさん2015/08/03(月) 11:59:33.09ID:C3iL4RK8
>>172
モナド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+
>>175
了解。
モナドが合成できないということは、代数的議論としてはそうだと言ってればいいんだろうが、
プログラミングとしては、致命的なのではないの?
0179デフォルトの名無しさん2015/08/04(火) 18:16:37.45ID:Qc8p5PG4
>>178
代数的な議論とか言ったって簡単に情報系の議論に移せるよ。

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:8q1xh6ui
代入とか束縛とか関係ない

int func(int x) {
. return func(x-1);
}

int x = func(100);

Cでこう書いたって無限再帰
0182デフォルトの名無しさん2015/08/04(火) 21:03:02.69ID:Jii/ZMO+
>>179
可換でないといけないとは言っていない。
合成ができないのが致命的と言ったのだが
0183デフォルトの名無しさん2015/08/05(水) 08:30:57.49ID:XaoKQAnn
素数と素数の積が素数でないのは致命的じゃないが
モナドとモナドの合成がモナドでないのは致命的か?
0184デフォルトの名無しさん2015/08/05(水) 08:31:02.84ID:8IuY4/EZ
>>180 それは
x = x - 1
とかの場合の話じゃない?
0185デフォルトの名無しさん2015/08/05(水) 09:20:55.44ID:PKbBdrRV
>>182
なぜ致命的なのかさっぱりわからない
0186デフォルトの名無しさん2015/08/05(水) 11:55:37.34ID:6JvEd9Ae
>>183 >>185
> 素数と素数の積が素数でないのは致命的じゃないが
それは素数の本質からの帰結だが、モナドの場合はそうではない。
もし整数と整数の積が整数にならないとすると、それは整数概念にとってかなり致命的。
群とまでいわなくても圏すらなさない概念はふつう使い物にならない
0187デフォルトの名無しさん2015/08/05(水) 12:21:47.56ID:/t+jhWZx
>>178
>モナドが合成できないということは、代数的議論としてはそうだと言ってればいいんだろうが、
>プログラミングとしては、致命的なのではないの?

そりゃモナドでプログラミングしたことなきゃわかんないよな
0188デフォルトの名無しさん2015/08/05(水) 13:35:33.66ID:WyZxE69I
>>186
よくわからんが仮に「モナド」が使い物にならないなら
「素関手」みたいな、素数に似た名前の新しい概念を提案すればいいんだろ?
0189デフォルトの名無しさん2015/08/05(水) 14:44:47.74ID:6JvEd9Ae
>>188
今は、素でないといけないと言ってるわけじゃないし(むしろ素しかないのは変だなと言ってる)
名前を問題にしてるわけでもないんだが
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
>>191
やったらいいじゃん
01931802015/08/05(水) 20:35:53.33ID:++LOioZG
>>181 >>184
すいません代入束縛関係なく無限再帰の構文でした。

無限再帰途中で停止するため基底部を
パターンマイッチングの設定で止めてみました。

func' :: Int -> Int
func' 0 = 0
func' x = func' (x - 1)

x = x - 1でもやってみます。
0194デフォルトの名無しさん2015/08/05(水) 23:13:16.26ID:/t+jhWZx
x = x-1

は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
>>187
ほんとこれ。 モナドの積がモナドにならないことがなぜ致命的なのか、全然言えないんだよねこの人。
0196デフォルトの名無しさん2015/08/06(木) 16:19:38.61ID:hE+0lNLB
あれこれ空論には饒舌でも結局コード書かない奴は何をやってもダメ
0197デフォルトの名無しさん2015/08/06(木) 20:09:37.57ID:QVat9e3X
でもまあ何をやってもダメな奴は
自分は何もやらず安く買って高く売るだけの能力に全振りしてるんじゃないか
01981802015/08/06(木) 20:35:31.96ID:9HWheWsA
>>194
ありがとうございます。
試してみて止まらないのを確認しました。
xが無限ループに束縛される様な感じです。
0199デフォルトの名無しさん2015/08/07(金) 09:35:35.60ID:qqVIQMo+
>>188
素関手ってのは、あらゆる関手がそれらから合成できるときに使う言葉だ。
モナドは全然そんなものじゃないだろ?

>>195 >>196 >>197
モナドっていうのは、ごく限られた単純局面でのみ使えるプログラミング技法だっていう自覚はないの?
その意味で、関手はもちろんメジャーだが、モナドはニッチなんだよ。
もっと実用の「コード書いて」いくとそれがわかってくると思うが
0200デフォルトの名無しさん2015/08/07(金) 10:39:25.62ID:aKStrfm+
>>199
御託はいいんだよ。モナドってのは自己関手が作り出す「文脈」を引き継いで
どんどん計算してく、そういう発想をカタチにしたものなわけ。そういう具体的な
思想と具体的な実装を持っていて、Wadlerが示したように do 記法を通じて
参照透明性を壊さずに命令型のプログラミングができることは示された。

んで君は、「モナドは合成できないじゃないか」と言ってるわけ。んなこたあ誰だって
知ってるんで、たとえばモナドをパラメトリックにして、モナドトランスフォーマなんかを
考えたらいいんじゃね?いや、それ一見いいように思えてモナドがタワー状に積み重なって
保守しづらいんだけどとかいろんな人がまだあれこれやってる最中。

なんか便利なものができたら、その「便利なもの」が切り開いた地平の先に新しい岩があるの。
それは「問題の解決がもたらした新しい問題」なので頭が痛いところだけど、そうやって新しい問題の
解決のために挑むのが「知性ある人間」のしごとなの。

「馬車は不便」を内燃機関による自動車が解決したけど、今度はその馬力と速度を人間が
制御しそこねて「走る棺桶」だと言われたり、自動車による死者が多すぎて「交通戦争」と
言われたりすることに対して、シートベルトが知性ある人間によって発明されたの。
シートベルトは中途半端な解決策だね、ということでエアバッグを発明したの。

なんかのアイデアが副次的にもたらす頭の痛い問題をとりあげる、それは大事。
でも、「こんな致命的な欠陥があるから問題外」という考えは知性の放棄なの。

「自動車事故で人がたくさん死ぬから自動車禁止な」←知性の放棄です。

経済的工学的制約があるから、自動車事故の問題だってまだ解決してない。でもそれを
解決しようと続けることが知性なの。

モナドの合成の話は頭が痛い問題で、まだ十分な解決策をだれも見いだせてない。でも
それで喚き散らして「欠陥品」と罵ってるのはバカでもできる。知性がある人間は君が喚き散らしてる
間も圏論の本を読みながら「いくらかマシなアイデア」をひねり出そうとしてるの。
0201デフォルトの名無しさん2015/08/07(金) 13:10:20.13ID:qqVIQMo+
>>200
力のこもったコメントありがとう
> 御託はいいんだよ。
もっと冷静にw
> 参照透明性を壊さずに命令型のプログラミングができることは示された。
それは関数型にとって宿命的課題。だが、モナドはそのためのものでもないし、モナドだから解決できるわけでもない
> んなこたあ誰だって知ってるんで
もっと冷静に。合成できないことは知っててもその意味が分かっていない
>「馬車は不便」を内燃機関による自動車が解決した
その場合の自動車は、限界はあっても、本質的技術進歩なんだよ。
その他あまたのそもそも成立しない技術とは区別しないとな。
合成できないというのは成立し得ない兆候なのよ。
> でも、「こんな致命的な欠陥があるから問題外」という考えは知性の放棄なの。
いやいや、致命的な欠陥があればそれはもうそれでだめなのよw
> モナドの合成の話は頭が痛い問題で、まだ十分な解決策をだれも見いだせてない。
それが分かっているなら、少し救いだが
> 君が喚き散らしてる間も圏論の本を読みながら「いくらかマシなアイデア」をひねり出そうとしてるの。
圏論の本を読みながらw
そもそもモナドが圏論から形式的にひねり出したアイデアだから、プログラミングでは使えないんじゃないのかい?
0202デフォルトの名無しさん2015/08/07(金) 20:18:30.98ID:/Xr5U2Jc
あれこれ空論には饒舌でも結局コード書かない奴は何をやってもダメ
0203デフォルトの名無しさん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
>>204
意味不明w
自然言語だからか?w
0206デフォルトの名無しさん2015/08/08(土) 10:03:20.67ID:OWyBYzJT
都合が悪いようだな
自然言語を理想とする理想主義が否定されれば高級言語や人工知能の大部分が崩れるから
0207デフォルトの名無しさん2015/08/08(土) 10:56:41.88ID:fC37rrhT
>>206
逆だよ。ラッセルのような論理主義は自然言語が曖昧性を持ち、真理を記述するのに不適格だと
考えて記号論理を推進した。そのラッセルが生み出した型理論を(大幅に)修正したものが
強い型を持つ言語の基盤になっている。

自然言語による真理記述に興味を持ち続けた学者もいるけど、少数派(間違いだといいたいわけじゃない)
で、今日のプログラミング言語には全く影響を与えていない。
0208デフォルトの名無しさん2015/08/08(土) 14:05:14.68ID:OWyBYzJT
低級言語に曖昧性はない
高級言語は曖昧性がないことに加えて更に別の理想を追求している
おそらく一度あきらめた理想を取り戻そうとしている
0209デフォルトの名無しさん2015/08/08(土) 15:28:39.84ID:TgCfkrij
毛の壁みたいなこと言ってないでコード書けよ
0210デフォルトの名無しさん2015/08/08(土) 15:52:47.27ID:mk1m6mga
Haskellでまともなコードが書ける日本人なんていないでしょ
0211デフォルトの名無しさん2015/08/08(土) 16:16:44.90ID:TgCfkrij
あっそう(ハナホジー
0212デフォルトの名無しさん2015/08/08(土) 17:24:31.84ID:CVdJzgpn
都合のいいサンプルを出してるだけだ
0213デフォルトの名無しさん2015/08/08(土) 17:25:05.09ID:CVdJzgpn
>>200みたいな評論のことね
0214デフォルトの名無しさん2015/08/08(土) 17:31:44.38ID:9n35IarN
ガラパゴスなおまえらには無理
0215デフォルトの名無しさん2015/08/08(土) 18:46:17.01ID:i6VMh23W
haskell なんて簡単だよ
ひたすら型を複雑にすれば勝手に精密なプログラムになってくれるんだぜ?
あんな楽な言語、他に無いよ
0216デフォルトの名無しさん2015/08/09(日) 09:57:54.75ID:Goie4Pfe
仕事でも趣味でも普通に世界でバリバリHaskell書いてる日本人たくさんいるけどな
0217デフォルトの名無しさん2015/08/09(日) 10:15:53.22ID:z+nEtG9u
理想の言語を選べ
1 自然言語 ←コード書かない
2 型を書くだけ ←コード書かない
3 短い (一行とか) ←コード書く
0218デフォルトの名無しさん2015/08/09(日) 10:19:57.32ID:yc5ubK7v
>>216
日本人が普通に世界でバリバリHaskellで書いたアプリケーションをたくさん紹介してくれ
0219デフォルトの名無しさん2015/08/09(日) 11:07:30.63ID:uWrNjf8R
>>217
この3つの中では
1しかないかな?
2と3は論理的にありえない
0220デフォルトの名無しさん2015/08/09(日) 12:47:58.32ID:fLWMExWl
>>218 外資金融系とか。
0221デフォルトの名無しさん2015/08/09(日) 15:46:05.53ID:IcT2pazV
>>220
金融屋だけどHaskellは実務ではあんまり使わないよ
金融業界で使われている有名なライブラリがOcamlで書かれてるから、Ocamlが多い
あとは、F#だっけ?なんか、Ocaml互換のプログラミング言語
0222デフォルトの名無しさん2015/08/09(日) 16:06:00.55ID:q2cZe2Ik
>>221 知らないんだったら黙っててね
0223デフォルトの名無しさん2015/08/09(日) 16:07:28.11ID:t8Adpj37
言語名間違えてる時点で完全にモグリ。
0224デフォルトの名無しさん2015/08/09(日) 17:14:22.35ID:IcT2pazV
>>222
普通に現職の俺より詳しいというなら、なにかそれらしい反論してみろって

>>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
Hskellは金融で使われているよ
まぁ下請けだったけどね
元受の会社は誰でも知ってる大会社
ヒントだけ書くと、ソー○ネク○ト
0228デフォルトの名無しさん2015/08/09(日) 21:19:45.38ID:0nk6UHsv
金融ってMATLABで数値計算ガリガリというイメージだがな。
0229デフォルトの名無しさん2015/08/09(日) 21:22:35.31ID:bxjvjJcB
cabal replのCtrl-Pがshellと違って連続で同じコマンド使ってても1つ前のコマンド出すから
間違える→Ctrl-Pの連打数が増える→間違えるの繰り返し辛い
0230デフォルトの名無しさん2015/08/09(日) 22:57:12.53ID:PuCXERZp
>>228
数値計算につかうわけじゃない
ADTで金融商品の記述のDSL作って使う
0231デフォルトの名無しさん2015/08/10(月) 08:18:32.34ID:5dby/keT
おまえらは「机上の空論」の世界でしか生きられない、ガラパゴスエアコーダー。言語の一つも作ってみろ、卑怯者
0232デフォルトの名無しさん2015/08/10(月) 10:22:50.55ID:6CToalvR
この場がいいのかどうか分かりませんが、もし分かれば教えてください。

Wadlerの"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:h0Losqum
ヘア告訴しか出来ない卑怯者がブンブンうるさいね
0234デフォルトの名無しさん2015/08/10(月) 10:32:54.55ID:mZ18nlaN
>>232 rの型が違う
0235デフォルトの名無しさん2015/08/10(月) 10:45:40.66ID:6CToalvR
>>234
> rの型が違う
どう違うのでしょうか? 気が付きません
0236デフォルトの名無しさん2015/08/10(月) 11:02:23.74ID:dDBl8Ksv
>>235 HaskellかMLのプログラム書いたことある?
0237デフォルトの名無しさん2015/08/10(月) 11:20:23.87ID:6CToalvR
どこが違うかを直接指摘してくれるとありがたいです
0238デフォルトの名無しさん2015/08/10(月) 13:39:27.85ID:Mr6uGRV9
232の謎の言語のコンパイラはどこにあるんだろう
もしかしてコンパイラがなくても型が見える人なのかな

Haskellも自分が使うためじゃなくて型が見えない人のために作っただけ
そう考えるとHaskellでアプリを作っている気配がないのも辻褄が合う
0239デフォルトの名無しさん2015/08/10(月) 14:07:42.71ID:3agS2rXW
>>232
Wadlerの論文のどこの話をしてるの?
0240デフォルトの名無しさん2015/08/10(月) 14:33:14.35ID:qNcURq9A
岡部健さんこんにちは
0241デフォルトの名無しさん2015/08/10(月) 14:40:16.50ID:08na6m/L
>>239
http://ttic.uchicago.edu/~dreyer/course/papers/wadler.pdf の
Introductionの話だと思う

>>232が何を言いたいのかは分からないけど
0242デフォルトの名無しさん2015/08/10(月) 15:19:32.65ID:3agS2rXW
>>241
ありがとう。そんな最初のところだったのか。
こりゃ単に r はパラメトリック多相な関数じゃなきゃいかんて話だな。

>>232みたいに型ごと値ごとにアド・ホックな対応を付けて
r を構成することはできない(任意の型のリストの任意の値を
取らなきゃいけないんで計算可能にならない)。
0243デフォルトの名無しさん2015/08/10(月) 15:23:45.69ID:6CToalvR
>>239 >>241
そこです。
そこにある例では、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
>>241

"odds"はIntについてしか定義できないだろ。
他の型についてどうやって定義すんだ?

というわけで、どんな型のリストにも適用できる関数は
特定の型の値を具体的に見て処理できないので
リストの構造を弄ることしかできない、ということよ
0245デフォルトの名無しさん2015/08/10(月) 15:29:57.17ID:3agS2rXW
あ、アンカー間違えた。>>241じゃなくて>>243
0246デフォルトの名無しさん2015/08/10(月) 15:31:01.54ID:6CToalvR
>>242
> 型ごと値ごとにアド・ホックな対応を付けて
> r を構成することはできない(任意の型のリストの任意の値を
> 取らなきゃいけないんで計算可能にならない)。
その条件が明記されているのはあまり見たことがないのですが、
暗黙の常識なのですか?
0247デフォルトの名無しさん2015/08/10(月) 15:32:35.38ID:3agS2rXW
>>246
この文脈での「関数」が計算可能関数じゃなきゃいけないのは常識。
0248デフォルトの名無しさん2015/08/10(月) 15:39:35.42ID:6CToalvR
>>244 >>247
すれ違いすみません。
> "odds"はIntについてしか定義できないだろ。
> 他の型についてどうやって定義すんだ?
Int以外についてはidにする、とかすればいいのではないですか?
そうしたときには
> この文脈での「関数」が計算可能関数じゃなきゃいけないのは常識。
計算可能でもあると思うのですが?
それに「この文脈」というのは今のような場面では少しいい加減な感じがしますが
0249デフォルトの名無しさん2015/08/10(月) 15:42:48.51ID:3agS2rXW
まあ、こりゃアド・ホック多相の話をしてない、ってだけだな。
0250デフォルトの名無しさん2015/08/10(月) 15:46:02.23ID:6CToalvR
>>249
「アド・ホック多相」という概念があって、
ここでは「ただしアド・ホック多相でないこと」という条件が暗黙に付いている
ということですか?
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
>>251
> 問題の部分のちょっと前で暗黙どころか明確に否定している気が…

特に以下の部分のことでしょうか?
>> 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:aurF6Aj8
ML多相はad hoc多相ではないし、プログラミング言語理論でpolymorphismと言ったらデフォルトでparametric polymorphism。Cardelliのチュートリアルから読み直せ。
0254デフォルトの名無しさん2015/08/10(月) 19:25:52.09ID:aurF6Aj8
ついでに、∀でad hoc多相表すほうが稀だから。
0255デフォルトの名無しさん2015/08/10(月) 19:27:08.10ID:xfbTbnyl
形式化はイントロ以外の本論か、普通の型理論の入門書を読み直そう。
0256デフォルトの名無しさん2015/08/10(月) 19:32:28.40ID:G+nIt1Sd
associated data type は日本語では何と言うのが通例でしょうか。
0257デフォルトの名無しさん2015/08/10(月) 19:44:04.49ID:yZ3j9jzU
どっかの大学のレポート課題?
0258デフォルトの名無しさん2015/08/10(月) 20:02:43.98ID:G+nIt1Sd
>>257
私(>>256)への質問でしょうか。
勘違いでしたらすいません。

普通の社会人です。

type family を調べていたら出てきましたが、type family は型族という訳があるのに
associated data type は訳がネット上に見当たらないので質問しました。

単純に「関連データ型」でググっても associated data type に関連する記事は見当たりませんでした。
0259デフォルトの名無しさん2015/08/10(月) 20:31:37.97ID:P/rKXiwW
VBAでもやってろよ
0260デフォルトの名無しさん2015/08/10(月) 20:54:08.85ID:yZ3j9jzU
ある程度以上のプログラミングを日本語で勉強しようというのが無理なので英語のままで検索することをおすすめする
0261デフォルトの名無しさん2015/08/10(月) 21:23:30.78ID:G+nIt1Sd
>>260
誤解させてしまったようです。
勉強のために日本語訳を訊いたのではなく、
単に日本語ならなんて言うのだろうかと思っただけです。
0262デフォルトの名無しさん2015/08/10(月) 22:11:23.36ID:6CToalvR
結局、「r: ∀X. List(X) -> List(X)」という定式化ではパラメトリック多相性の意図を
正確に形式化できていないのではないか?という疑いは解けていないまま。。。
0263デフォルトの名無しさん2015/08/10(月) 23:19:26.21ID:08na6m/L
どのように書かれていたら ID:6CToalvRは「正確に形式化できている」と判断するのだろうか
0264デフォルトの名無しさん2015/08/11(火) 00:48:36.91ID:35SQIDRW
俺が悪いんじゃない、Wadlerの書き方が悪いんだ、と言いたいのかもな
0265デフォルトの名無しさん2015/08/11(火) 06:26:59.37ID:hdf2tNQK
∀型の意味はSystem Fとして厳密に形式化されている。「型システム入門」にも書いてある初歩。
0266デフォルトの名無しさん2015/08/11(火) 06:30:12.53ID:hdf2tNQK
Wadlerの論文でも4節のFigure 2でちゃんと定式化の復習してるじゃねーか。読まずに書くなよ
0267デフォルトの名無しさん2015/08/11(火) 06:36:13.99ID:l/j/VTng
>>262

論文や入門書どころか2chのレスすら読めないのか?

0255 デフォルトの名無しさん 2015/08/10 19:27:08
形式化はイントロ以外の本論か、普通の型理論の入門書を読み直そう。
ID:xfbTbnyl(1)
0268デフォルトの名無しさん2015/08/11(火) 08:39:19.79ID:cH2UxrcD
パラメータ多相はtemplateのようなものに型名を渡すだけで実体化する

アドホック多相は実体化する前に
["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
>>269
君はなぜ自分より知識や教養が上の相手にタメ口なんだ
0271デフォルトの名無しさん2015/08/13(木) 12:02:19.75ID:mwGqyG64
>>270
答えられないのか?
ところで君はこのスレをご主人と崇める番犬なんだな?w
0272デフォルトの名無しさん2015/08/13(木) 15:16:34.02ID:M3nW2qvP
基本的用語の検索もできない自称プログラマって生きてて恥ずかしくないの?
https://en.wikipedia.org/wiki/Polymorphism_(computer_science)
0273デフォルトの名無しさん2015/08/13(木) 15:18:03.14ID:d32APRUA
大学1年生か2年生の課題とかじゃない?
0274デフォルトの名無しさん2015/08/13(木) 15:24:02.22ID:Po5dRgtj
多相を分かりやすく言うと「単相ではない」という意味です
単相は昔からみんな知ってたやつなので分かりやすい
0275デフォルトの名無しさん2015/08/13(木) 15:52:21.18ID:Gt0qYtbN
>>271
おまえみたいなダメ学生のレポート代筆を誰が手伝うかってことです。
0276デフォルトの名無しさん2015/08/13(木) 16:02:02.25ID:Gt0qYtbN
田舎の秀才というか、狭い世界で褒められてるうちに
自我が肥大してしまっていつしか
「わからなくてもコツコツ勉強するのは大事」
「世の中わからんこともある」
「わからんのは、教え方が悪いからとは限らず、自分の知力の限界かもしれない」
というようなことを認めようとしないまま中途半端な歳まで来ちゃうと限りなくアウトに
近い。

妙に肥大した自我と釣り合いを取るために、「わたしには
知性も教養も欠けてるのでどうか憐れむと思って教えてください」
の一言が出せずに煽ることしかできない、そういう喧嘩腰が
いつまでも通じると思ってる時点で社会知性が低すぎてダメ。
コンビニのバイトですら務まらないレベル。


狭いサークルで褒められまくっていたせいか、妙な自信と
プライドだけは高いんだが中身はスッカスカ。


たまに親切な誰かが丁寧に教えてやっても礼の一言も述べず
「ふーん、なんか結局モナドって合成できないからプログラミングにとって致命的じゃん」
とか、言ってる本人にも意味不明なワードサラダめいたポエムを投げることしかできない。
0277デフォルトの名無しさん2015/08/13(木) 19:19:34.10ID:mwGqyG64
>>276
君どうしちゃったんだ?w
本題についてだけ静かに語ればいいんだよ
0278デフォルトの名無しさん2015/08/13(木) 19:56:35.31ID:Gt0qYtbN
>>277
まあそんなに落ち込むな。
0279デフォルトの名無しさん2015/08/13(木) 20:09:47.48ID:kVSCQFgg
自演して一人盛り上がってるアホを見た
0280デフォルトの名無しさん2015/08/13(木) 20:16:46.88ID:cFZHcgXb
長文自己紹介とか草
0281デフォルトの名無しさん2015/08/13(木) 23:59:10.02ID:/TT2ZElL
>>276
毛の壁宛なんだろうが、なんとなく流れ弾に中った感がある
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:LE4LycT3
別に俺俺型クラス作ってもいいんやで
0288デフォルトの名無しさん2015/08/15(土) 20:18:09.10ID:R9hEcy+E
うおおお いつの間にかhackageにあるソースコードがリッチになってる!
http://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:uK7XPl3A
ちょっと何言ってるか判らない
0291デフォルトの名無しさん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
>>291
若干長いけど良い記事だよね。
0293デフォルトの名無しさん2015/08/17(月) 23:42:32.36ID:E8Zlkk8d
>>291 >>292
とても素直な気持ちのいい記事だね
0294デフォルトの名無しさん2015/08/18(火) 17:03:51.11ID:j5KExTo2
いろいろHaskellが変わったらしいけど
今だとHaskellの入門書としてお勧めってどれになるんです?
0295デフォルトの名無しさん2015/08/18(火) 22:53:30.76ID:1H/7a1LX
>>294
いろいろとか言っても Monad が Applicative になったとかそんな程度じゃないの?
0296デフォルトの名無しさん2015/08/19(水) 03:34:39.76ID:fY37jawe
ねえ

Monad m => m (m a, m b) -> (m a, m b)
ってできるっけ?
0297デフォルトの名無しさん2015/08/19(水) 03:58:30.08ID:fY37jawe
失礼。自己解決しました。
join . liftA (uncurry (liftA2 (,)))
0298デフォルトの名無しさん2015/08/20(木) 02:59:44.72ID:UVdNs5g4
writer関数ってタプルの順番間違ってないか?

> (++) <$> (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
Wikipediaのエンディアンの項目を見ていて一番ばからしいと思ったのは、
エンディアンを切り替えられるバイエンディアンプロセッサ。
0302デフォルトの名無しさん2015/08/22(土) 00:31:10.13ID:EXDcUcnU
なんか、すごいの来たー!!!
ttp://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
Wikipedia
>圏論を初期の学部生に教授することは強い反対にあっている。

にわかに圏論の勉強を始めない方が良い?
0304デフォルトの名無しさん2015/08/22(土) 01:53:23.77ID:PkWehqCK
買うわ
0305デフォルトの名無しさん2015/08/22(土) 03:47:42.60ID:N1uhek7+
>>303
一言で言うと、Haskellのモナドや多相型の関数の概念を理解し使いこなす、つまり関数プログラミングの実務に圏論は全く必要ないし
知っていても何の役にも立たない、つまりは圏論はそのキーワードをひけらかしていい恰好したいだけの単なるファッションの飾りに過ぎない

他方、本当に計算の理論(例えば表示的意味論を展開する数学的構造な枠組みとしてのScottらの領域理論など)を
勉強して理解し将来的にはその分野で学術誌か国際会議に論文の1つでも通したいのならば、圏論の勉強は不可欠
(Scott理論の古典的で基礎的な部分の学習だけならば別に圏論を知らなくとも一応はできるけれどね)
0306デフォルトの名無しさん2015/08/22(土) 07:42:28.65ID:pHk1lnIK
>>305
その説明もなんか変なんだよな
いい恰好したいなら金持ちか政治家になればいいのに
なんで批判する側もされる側も学者を標的にするのかさっぱりわからない
0307デフォルトの名無しさん2015/08/22(土) 10:28:17.35ID:bUf5bCJ1
一言で言うと、自動車を運転するために熱力学や内燃機関について知る必要は全くないし
知っていても何の訳にもたたない。つまり熱力学だとかカルノーサイクルを勉強してるやつは
カッコつけたいだけのファッションバカにすぎない。

ブレーキは踏めば止まる、エンジンはなんかガソリン入れときゃ動く、ラジエーターだとか
よくわからんものはガソリンスタンドでチェックしてもらえばいいし、タイヤの空気圧が下がってる
事の意味もガソリンスタンドの人が注意してくれるし、物事が動く原理というのは
全く知る必要がない。

原理厨はなにかとあれこれ勉強しないとわからん言って脅してくるけど、俺達は反知性主義の
旗を掲げて徹底抗戦だ。
0308デフォルトの名無しさん2015/08/22(土) 10:33:20.58ID:XZXv5ALV
例えがまるで的外れだ
0309デフォルトの名無しさん2015/08/22(土) 10:39:12.14ID:Hb7eGyOr
「一言で言うと」で始まる長文を書いてる時点で
0310デフォルトの名無しさん2015/08/22(土) 11:04:44.83ID:bUf5bCJ1
反知性主義自体には共鳴してくれるでしょ。圏論要らない。
0311デフォルトの名無しさん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
>>302
宣伝乙(良い意味で)
0314デフォルトの名無しさん2015/08/23(日) 09:57:28.55ID:LhCUqlmj
Haskell分かっても圏論が分かったことにはならないの?
どこで違いが出てくるの?
0315デフォルトの名無しさん2015/08/23(日) 11:44:34.87ID:28kORioT
>>314
Haskは圏のなかでもやや特殊。型付のラムダ計算なんかを抽象化して得られる
圏と近い。例えば、Hask圏では A, B という対象に対して A->B という対象を作れるが、
このような性質は「一般の圏」にはない。
0316デフォルトの名無しさん2015/08/24(月) 02:49:24.38ID:UcMD+ccy
まぁhaskellの学習に圏論必要ないってのはほんま
0317デフォルトの名無しさん2015/08/24(月) 08:58:11.78ID:kCQmOeKa
圏論ワードに外来語的なニーズがあるというコンセンサス
0318デフォルトの名無しさん2015/08/24(月) 11:27:43.78ID:/WF09MBN
Haskellの学習に圏論は必要ないし、そもそもプログラミングを学ぶ必要すらない。
俺達先進国の人間はベトナムの優秀なIT技術者を時給50円で死ぬまで使えば良いからだ。
そもそも何かを学ぶということは人間の自然に反する。言語を捨て、文明を捨て、原始に回帰すること
こそ人類の究極の目標である。
0319デフォルトの名無しさん2015/08/24(月) 11:43:02.32ID:OjRQ25eS
知識がどうとかは、個人ベースの話なので、まったくどうでもいいし、着眼点がずれている
個人の人生のテーマなんぞは、本人にしか関係ないし、他人からしたらどうでもいいこと
お前が知識が要らないと考えるなら、そうすればいいし、俺らには関係ない、お好きにどうぞ

機能性を追及することが、人類の永遠のテーマなのです
分かりやすく言えば、100人の人間が集まって、その100人で、どういう機能を果たすか、ということ
昨今コミュニケーション能力が高らかに叫ばれるのは、そういうこと
ここで、知識は手段に過ぎず、目的になりえない
0320デフォルトの名無しさん2015/08/24(月) 12:00:06.78ID:kCQmOeKa
100人がコミュニケーションすると80人が嘘をつき合計マイナス60人になる場合もある
マイナス60人は1人よりも小さい
0321デフォルトの名無しさん2015/08/24(月) 12:08:55.77ID:OjRQ25eS
そうならないようにするのが、人類のテーマなんです
0322デフォルトの名無しさん2015/08/24(月) 13:50:02.35ID:1q9FvsVI
ワクテカ
http://haskellformac.com
0323デフォルトの名無しさん2015/08/24(月) 13:50:44.81ID:twgtagYC
mac 用IDE がもうすぐリリース
0324デフォルトの名無しさん2015/08/24(月) 13:51:24.77ID:twgtagYC
すまん、かぶった
0325デフォルトの名無しさん2015/08/24(月) 19:00:25.78ID:pjiRa/zc
>>318 建設会社でも行ってこい、
0326デフォルトの名無しさん2015/08/24(月) 19:03:26.28ID:/WF09MBN
>>325
圏論厨を滅ぼすまではダメです
0327デフォルトの名無しさん2015/08/25(火) 02:06:08.16ID:YISO+qUP
>>326 ワロタ、あれは生き残るパターンや。プログラミングの機械化がすすむ以上、おまいらが将来つかうことになるからな
0328デフォルトの名無しさん2015/08/25(火) 02:10:41.85ID:YISO+qUP
そもそも真の圏論厨はlispで独自実装しそうなもんだが
0329デフォルトの名無しさん2015/08/25(火) 07:15:28.00ID:oMRqhMXw
Lispと圏論は全然関係ないからやめろよ
C++使えよ
マクロじゃなくてテンプレートを使うんだぞ
0330デフォルトの名無しさん2015/08/25(火) 10:27:27.34ID:Vmm9Vscj
>>315
それはむしろHaskellをやればCCCがすぐ分かるということだ
Haskellをやっても圏論は分からないという例はないの?

>>316
いやその逆で、圏論の学習の替わりにhaskellが使えるか?ということなんだが
0331デフォルトの名無しさん2015/08/25(火) 11:52:16.03ID:oMRqhMXw
例というか、PerlのOOPが異端視されるのと同じ
Perlをいくら完璧に学習しても「OOPを正しく理解していない」と見做される
0332デフォルトの名無しさん2015/08/25(火) 12:14:07.00ID:Vmm9Vscj
OOPと圏論を同列に並べるのはいかがなものか
OOPは茫漠とした思想みたいなもんだが圏論は違うだろ?
0333デフォルトの名無しさん2015/08/25(火) 13:33:39.80ID:oMRqhMXw
違うだろ?ってみんなで答え合わせしないと確信を持てない時点でかなり怪しい
みんなで共有する知識はそういう怪しいものばかり
なので個人で頑張る
0334デフォルトの名無しさん2015/08/25(火) 14:11:55.34ID:nys8WXaq
>>333
Haskellの話に圏論絡めてくる奴は皆殺しにしろとか言い出す
僕みたいな反知性主義者が「答え合わせ」に参加すると結論が歪む。
0335デフォルトの名無しさん2015/08/25(火) 15:35:47.03ID:YISO+qUP
>>334 とりあえず通報しときました。
0336デフォルトの名無しさん2015/08/25(火) 21:13:15.88ID:nys8WXaq
>>335
つうほうせんといてや〜
0337デフォルトの名無しさん2015/08/26(水) 01:43:51.18ID:fE8RXalP
圏論やるより型クラス勉強してモナド使うほうがhaskellの勉強になるから
0338デフォルトの名無しさん2015/08/26(水) 08:31:04.41ID:NnDRip21
>>337
そうやな!圏論いらんわ。
だいたいあいつらちょっと数学が得意だからって調子こいてるよな。
0339デフォルトの名無しさん2015/08/26(水) 12:27:26.78ID:W/3BVY4r
いらんってことはないけどな。
圏論だと思って使わなくても圏論の概念は使うことになるし。
逆に言えばわざわざ圏論を学ばんでもどうせ触れるっつー話でもある。

俺ら日本語の文法をわざわざ学んでから喋っとるわけちゃうみたいに、
実用から入っていけばなんとなく自然な使い方もわかるようになるで。
まあ、どっちから入門してもかまへん。
ただ、圏論から入っていくやつをあえてディスるんはやめよで。
0340デフォルトの名無しさん2015/08/26(水) 13:44:56.04ID:31UMARGP
私は関西人ではないのですが、『やめよで』は『やめような』という意味の関西弁として正統なのでしょうか?
0341デフォルトの名無しさん2015/08/26(水) 14:45:58.21ID:gQwT5cTu
圏論は頭の体操にもなるし論文書いたり新しい技法を開発するレベルまでやりたいなら止めはしないが、
haskellのモナドを人に教えるときに圏論の話を絡める奴は全く信用できん、という程度の話。
0342デフォルトの名無しさん2015/08/26(水) 14:54:08.52ID:H1SEqDeZ
>>337
>>338
>>339
君たち、
「Haskellやモナドを使うのに圏論を知っておく必要は全然ない」てのはよく聞くけど
それって、「そんなの知らなくてもできる仕事は一杯あるからね、下流底辺に。
上流の仕事は圏論が分かる層がやるから気にしなくていいよ。」ってニュアンス?
0343デフォルトの名無しさん2015/08/26(水) 15:30:11.46ID:W/3BVY4r
>>342
「最初からハードル上げるな」という話。
Haskell でプログラミングするだけなら圏論を意識することはない。

圏論で言ってることというのは意識せずとも使える程度のものでしかないんだよ。
ただ、そこに明確な定義を与えて名前を付けたのが圏論という学問領域になってるだけ。
言うなれば数学界のデザインパターンが圏論。

先に Haskell を実用している人が圏論みても、
あ〜このパターンってこういう名前がついてんのね〜、ってくらいの感想だろうよ。
0344デフォルトの名無しさん2015/08/26(水) 15:57:11.19ID:W/3BVY4r
デザインパターンの中には知らなかった (しかし知っていると有用な) パターンだってあるだろうし、
それを学ぶことを無意味と切り捨てることはできない。
圏論として学ばなくても誰かのコードを読んでいるときに知るということもあるだろうから、
圏論という形で学ぶ必要は必ずしも無いけど、
まあほどほどに Haskell を使えるようになった頃に一度くらい斜め読みしてもいいんじゃないのかねとも思う。

上手く使えるようになったつもりでもさー、全然知らなかった概念が頭の中に湧いて出てくるってことはないんだよ。
たとえ話で言えば、字を早く書きたくてペンの性能を目いっぱい追求して満足な結果が出るとするじゃん?
そしたら世の中には実はタイプライターがありました、ワードプロセッサがありました、っていう感じ。
0345デフォルトの名無しさん2015/08/26(水) 16:14:34.56ID:9WcNfeqJ
目的や目標とするレベルが各人バラバラだから話が噛み合わない
0346デフォルトの名無しさん2015/08/26(水) 16:39:39.65ID:U9Ynnj38
参考文献を書く義務とそれを読む自由と読まない自由があるけど
342のように自由というニュアンスを理解できない人が多い
で、自由ってよくわからんから全部義務にしようということで圏論まで強制されてしまう
0347デフォルトの名無しさん2015/08/26(水) 16:50:54.29ID:W/3BVY4r
高度なことをしようと思えば高度な知識が必要だし、
ほどほどでいいならほどほどの知識でいいっていう当たり前の話だよな。

文章にきちんとまとめて発表しようとすると使う言葉が圏論の世界のものに
なってしまうからどうしてもそういう言葉を目にしてしまうだけで。
0348デフォルトの名無しさん2015/08/26(水) 21:07:20.44ID:2om2SE56
数学界のデザパタの前にHaskellのデザパタを知りたい
0349デフォルトの名無しさん2015/08/26(水) 21:21:20.27ID:6+xCvXdx
モナドだろ
0350デフォルトの名無しさん2015/08/26(水) 22:58:54.24ID:H1SEqDeZ
>>346
自由とか義務とかの問題じゃないだろw
能力の問題
>>347
やっぱりHaskellより圏論の方が高度wってことね
0351デフォルトの名無しさん2015/08/26(水) 23:36:27.51ID:NnDRip21
反知性主義者を代表して言わせてもらうが

「俺は圏論をまったく知らないが、モナドを自由に使えてる。だから圏論は必要ない」

以上です。
0352デフォルトの名無しさん2015/08/26(水) 23:47:35.06ID:H1SEqDeZ
>>351
反知性主義者か。ええなあ。がんばってや
0353デフォルトの名無しさん2015/08/27(木) 05:45:42.82ID:hpMNnVK0
>>351
その圏論を知らずにモナドを自由に使えているあなたが仮に圏論を学べば、
モナドを人に上手く教えたりもっと
自在にモナドを操れるようになるのかも知れないね。
0354デフォルトの名無しさん2015/08/27(木) 05:55:16.94ID:V7YRDu0j
必要に足りてるならそれはそれでいいよ。
0355デフォルトの名無しさん2015/08/27(木) 07:04:42.40ID:gHMFOOrZ
>>353
その例を一つ二つ挙げてみてよ
0356デフォルトの名無しさん2015/08/27(木) 07:15:24.26ID:MMHzsuN9
べつにチューリング完全な言語を超えるような未知の能力を研究してるわけじゃないから
ただ型推論を使って動的型付け言語のレベルに追いつけるかどうかの問題
0357デフォルトの名無しさん2015/08/27(木) 07:48:02.01ID:2fn5iyFt
何言ってんだこいつ?
0358デフォルトの名無しさん2015/08/27(木) 07:58:41.43ID:MMHzsuN9
難聴乙
0359デフォルトの名無しさん2015/08/27(木) 08:41:46.96ID:TbOH8VLZ
静的型付け言語がまるで動的型付け言語に劣っているかのような誤解を招く書き方ですね
0360デフォルトの名無しさん2015/08/27(木) 08:53:04.69ID:2fn5iyFt
チューリング完全の枠を出ないと、超一般的な前提を言いながら、
ffiで各々が呼びだせば解決する程度の話をする頭の悪さ
0361デフォルトの名無しさん2015/08/27(木) 09:24:03.24ID:MMHzsuN9
頭の良さってほんのわずかの差で一喜一憂するところが放射能に似ているよね
0362デフォルトの名無しさん2015/08/27(木) 09:57:44.93ID:8/UVeoJ+
動的型つき言語は、再帰型のある静的型付き言語のサブセットだぞ
0363デフォルトの名無しさん2015/08/27(木) 11:07:03.44ID:2fn5iyFt
>>361
すまんが放射能語ではなくて日本語で頼む
0364デフォルトの名無しさん2015/08/27(木) 12:31:59.92ID:a/U6YIqa
haskellにどんなモナドがあって、どういう使い方をすればいいのかは圏論を学んでも分からんよ。
Freeモナドが、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
Stateモナドとかスタック作るまでのチュートリアルがほとんどで
結局どう使うかはほとんど説明されてなかったり
0366デフォルトの名無しさん2015/08/27(木) 12:59:12.92ID:SD+R1pbM
>>365
実際あんまり使わないからだと思う。
それに、本当に状態操作が欲しいなら素直にSTモナド使うほうがいい。
0367デフォルトの名無しさん2015/08/27(木) 14:07:36.44ID:V7YRDu0j
>>364
どういうモナドかは当然それぞれの性質があるんだろうけど、
共通する性質があってそれをモナドというパターンに当てはめてるんだから、
モナドがどういうものかは知らんと話にならんだろう。

デザインパターンに過剰にこだわるのが害悪の場合はあるが、説明に使う言葉に何を使えばいいっていうんだ?
っていうか、基礎的な質問ならキーワードとなる言葉を与えてウェブ検索させるってのは普通のことだろう。
共通認識できる「名前」が重要で、それが圏論由来のものであろうがそうでなかろうが重要じゃない。
既についている名前があるなら新しい言葉を発明することにどれだけ意味があるっていうんだ?
0368デフォルトの名無しさん2015/08/27(木) 15:20:33.74ID:/PZRaFKU
http://homepages.inf.ed.ac.uk/wadler/papers/marktoberdorf/baastad.pdf
Monads 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
>>364
うんうん、それもまた反知性主義だね!

反知性主義者たちがどんどん集まってきてうれしい。
Haskell界で声がでかい人で圏論にハッキリ嫌悪感を示してる人って山本センセぐらいしか
いないんで、貴重な同士だわ〜
0370デフォルトの名無しさん2015/08/27(木) 15:38:27.37ID:sT+Vb4An
>>368
なんか糖衣にくるんで圏論に誘導しようとしてるような感じがして嫌だな。
参考文献に悪名高いMoggi(こいつのせいで調子こいて圏論言うやつが計算機科学に入ってきた)
が挙がってるし、ろくなもんじゃないだろ。

そもそも反知性主義者である俺は英語論文を読むなどというスノビズムに染まった行動には断固として反対なのだ。
日本男児なら日本語で語れ!
0371反知性主義者2015/08/27(木) 15:40:14.71ID:V7YRDu0j
dg非jドアsポあjふぃおs打ksgふぁ: 打sjgdl:s
dscじょぎkdさkjgdskげj子rイオdsgkあd祖gsだ

j御k自ソアdgjポdsjgぴおdsあぽgだぽあ
0372デフォルトの名無しさん2015/08/27(木) 15:44:45.48ID:a/bxJDEM
>>366
まあ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+R1pbM
>>372
STモナドはIOモナド理解してればそのまま使えるよね?
そして、IOモナド・STモナドの仕組みは原理としては別に難しくない
0376デフォルトの名無しさん2015/08/27(木) 17:06:24.88ID:6g/R3ZXu
逆にわたくし、haskellしばらく勉強してきまして
そろそろ裏でどういう理論づけがあるのかなーみたいなことを知りたくなってきたのですが、
何かしらおすすめのルートはございますか(普通に圏論に入門してみればいいの?)
0377デフォルトの名無しさん2015/08/27(木) 17:37:41.46ID:a/U6YIqa
反知性とかそういうのじゃなくてな、haskell初学者を惑わせるだけの圏論の話なんて必要無いってだけなんだ。
初心者が聞く「モナドって何?」っていう質問に圏論的な説明はじめるのは迂遠過ぎて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
>>377
自分は反知性主義を掲げて圏論厨を批判してるけど、「なぜモナドという名前なのか」とか言い出す
圏論厨は見たことない。

マクレーンが隠れ哲学厨だったんで範疇論から名を借りてcategory とつけた分野に、
ついでにライプニッツの単子論から名前を借りて(こっちはもう本当に名前を借りただけ)
monad と呼んだだけで意味とか全くないし。

それまでは triple と呼ばれてたんでまともな複合語が作れないという問題があったから
モナドと呼ぶほうがマシじゃんぐらいの意味しかない。

ほらね、圏論ってのは意味がないんです。やめましょう。
0379デフォルトの名無しさん2015/08/27(木) 18:34:38.62ID:75t8dyUl
Haskellの真髄は(->)
型クラスがなくても(->)は存在する
(->)がなければMonadもCategoryもない
0380デフォルトの名無しさん2015/08/27(木) 18:35:35.68ID:sT+Vb4An
>>376
圏論はやらんほうが人生を有効に使えると思いますが、人生を無駄にしたいというなら

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:kht9K5Vg
>>361 その前に頭の良さの定義を頼むw
0382デフォルトの名無しさん2015/08/27(木) 20:03:43.73ID:gHMFOOrZ
>>380
反知性主義者というので期待してたが
結構知ってるよ的なので、ガッカリしたw
0383デフォルトの名無しさん2015/08/27(木) 20:18:05.69ID:kht9K5Vg
お前ら人間なめんなよ、子供の算数を集合論ではじめときゃいいんだよ。
0384デフォルトの名無しさん2015/08/27(木) 21:38:54.38ID:gHMFOOrZ
>>364
> 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
>>377 >>380
ありがとうございます。
なんかある程度勉強してからだと「あ、そういうことね」っていうふうになれそう
というのに最近出会ってちょっと悔しかったので、やってみます
0386デフォルトの名無しさん2015/08/27(木) 22:16:22.24ID:kht9K5Vg
tapl
0387デフォルトの名無しさん2015/08/27(木) 22:41:39.44ID:sT+Vb4An
>>386
Benjamin 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+R1pbM
圏論ねえ。数学的興味からHaskelltoha関係なく勉強したのだが、
Haskellに関する限り、Ekmettが何してるのか理解したい時に
少し役に立つ程度だと思う。
0389デフォルトの名無しさん2015/08/27(木) 23:58:49.19ID:Rek5NYGp
Haskellと圏論の関わりなんて、IOを無矛盾に扱うために言語に追加導入できる最良の道具だったってだけのことで、
ラムダ計算とLisp・一階述語論理とPrologのような、その生い立ちに根源的に関っているもんじゃないからね
オナニーの道具としては最高なんだろう
0390デフォルトの名無しさん2015/08/28(金) 04:26:11.78ID:SsK9tv39
普通andとorとnotしか使わないから述語論理も要らないな
0391デフォルトの名無しさん2015/08/28(金) 10:12:07.75ID:ngZ5utA1
鹿児島県の伊藤祐一郎知事に言わせれば
「高校教育で女の子にサイン、コサイン、タンジェントを教えて何になるのか」
「社会の事象とか、植物の花とか草の名前を教えた方がいい」
ということになる。
0392デフォルトの名無しさん2015/08/28(金) 14:21:25.95ID:UpW/wiba
>>390
普通∀や∃も使うだろう
0393デフォルトの名無しさん2015/08/28(金) 14:56:36.00ID:SsK9tv39
>>391
関数の名前は知ってるけど内容は知らないんだろ
植物の名前でも同じことだ
名前ばっかり宣伝するのは本当に無意味だからやめればいい
0394デフォルトの名無しさん2015/08/28(金) 16:13:34.32ID:hUebxbgg
ひゃっほーう stack 環境下でエディタの補完が効くようになったぜ!
0395デフォルトの名無しさん2015/08/28(金) 20:02:41.16ID:UpW/wiba
圏論とHaskellとモナド。。。。。
ちょっと話が面白くなってる気がするな
反知性主義者や山本さんやらが出てきて。
勿論知性主義者が出てきてもいいよ
あれを読めとか何かを教えてやったとかつまらんこと言わずに
自分の見解を言ってくれ
0396デフォルトの名無しさん2015/08/28(金) 21:14:35.56ID:YaVx9p2L
圏論なんてそんなに構えて勉強する、なんてスゴイものじゃないよ
おれはバカンス先のホテルで2冊も読んだらだいたい分かったよ
0397デフォルトの名無しさん2015/08/28(金) 22:12:50.40ID:UpW/wiba
>>396
「スゴイ」とか「分かった」という語句を使う点がなんだかなと思うが。。。
すぐに分かったと言うあなたとなかなか分からん奴とは何が違うと思うか語ってみてくれないか
0398デフォルトの名無しさん2015/08/29(土) 14:46:46.88ID:bSBiDVBZ
「C++完全に理解した」
0399デフォルトの名無しさん2015/08/29(土) 23:11:48.82ID:VDxSZNt2
cabal について質問です。

.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
>> 399
たぶん、haddockセクションの html-location の項がそれ。
0401デフォルトの名無しさん2015/08/29(土) 23:38:33.21ID:VDxSZNt2
>>400
そこに文字列を入れ、いろいろなパッケージをインストールしてみましたが、
何も変わりませんでした。
0402デフォルトの名無しさん2015/08/30(日) 00:01:23.79ID:U2/m8tQL
ひょっとして、コメントアウトを外してない、なんてことはないかい?

-- html-location:

html-location: hoge
にしないといけないよ。
0403デフォルトの名無しさん2015/08/30(日) 00:21:30.92ID:XpmQg4Hy
>>402
もちろん、コメントは外しています。
0404デフォルトの名無しさん2015/08/30(日) 00:38:28.61ID:XpmQg4Hy
>>403
ちなみに、cabal install --haddock-html-location='・・・' で直接指定しても何も変わりませんでした。
0405デフォルトの名無しさん2015/08/30(日) 02:57:07.12ID:U2/m8tQL
>>404
以前似たような質問をしてた方と同じ人ですか? 
前回ともども、ろくすっぽ調べもせずテキトウに答えちゃってごめん。

いろいろ試してみたんだけど、どうやら無理っぽい。
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
>>405
こちらでは 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 内のリンクだけがおかしいのです。


もう少しアプローチを変えて調べてみます。
ありがとうございました。
04074052015/08/30(日) 11:56:14.08ID:U2/m8tQL
ああ、もし、sandbox使ってるんだったら、

$ 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
>>407
問題が解決しました。

結論から言うと、最新版の 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/m8tQL
おめでとう。
haddockのバグだったのか(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+7Zkm
instance Umai () where {}
newtype 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:VGvD8wHt
()もいいけど、型をラベルみたいにして情報載せるのは、ファントムタイプの出番ですよ。
data 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
--}
04134122015/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
>>411 >>412
ありがとうございます。
そのままでは使えないのですが、考え方を参考にさせていただき、応用してみます。


ちなみに、さすがに Umai 型クラスにも、Nasu データ型にも手を加えずに実現する方法はないですよね。
0415デフォルトの名無しさん2015/08/31(月) 21:06:33.97ID:BIyPIWGf
それならデフォルトの実装は別の場所に書いた方がよさそう
手を加えてはならない場所に書くのはリスクが大きすぎる
0416デフォルトの名無しさん2015/08/31(月) 21:21:39.09ID:YNC36to9
>>415
すいません、そういう意味ではなくて、
Umai 型クラスに相当するものがライブラリで提供されていて、
こちらでは手が加えられないのです。

もし方法がないなら、ライブラリのソースはあるので、
アドバイスを参考に改変しようかと思います。
0417デフォルトの名無しさん2015/09/02(水) 01:39:18.87ID:MPctfeu0
質問。infix pattern synonym の結合性って弄れないの?
0418デフォルトの名無しさん2015/09/02(水) 23:39:30.67ID:VgKb5GV5
>>395
なんで君はいつも上目線なんだ
0419デフォルトの名無しさん2015/09/03(木) 05:35:30.84ID:OYAV2gHU
謙虚月間です。皆さん九月は、他人の落ち度より自分の異常を優先して疑い、相手を尊重しましょう
0420デフォルトの名無しさん2015/09/04(金) 12:32:49.27ID:5HbwgMaM
GHC が出力する実行バイナリがえらいデカいんやけど、これどうにかならんの?
0421デフォルトの名無しさん2015/09/04(金) 17:36:40.07ID:KCyhzv12
atomの端末から起動しないとghc-mod使えない不具合辛い
0422デフォルトの名無しさん2015/09/04(金) 21:44:05.44ID:Ziq//RxQ
>>420


対策

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
>>424
なるほど、つまり中置記法の右側に値を置いたものは、
カリー化とは無関係で単にラムダの糖衣構文ってことなんですね。
0426デフォルトの名無しさん2015/09/05(土) 18:40:53.83ID:NPRaO0u1
まあ、(flip siplus) 2 の糖衣だと思うんでもいいと思うけどな。
0427デフォルトの名無しさん2015/09/06(日) 00:53:10.15ID:wfrbDpC5
二項演算子は後置演算子とみつけたり
0428デフォルトの名無しさん2015/09/06(日) 08:00:48.38ID:SMmxtXxm
Haskellは二項演算子を愛し過ぎてる
1+が綺麗に書けるけど、そんなにこだわる機能じゃないと思う
むしろ二項演算子無くして前置に統一したほうがよく無いかな?
0429デフォルトの名無しさん2015/09/06(日) 08:29:11.83ID:wfrbDpC5
>>428

a * x + b

なんてのをまともに書けない言語はアカンでしょ
0430デフォルトの名無しさん2015/09/06(日) 08:41:14.99ID:SMmxtXxm
>>429
>a * x + b
つ (+ (* a x) b)
0431デフォルトの名無しさん2015/09/06(日) 09:30:37.52ID:wfrbDpC5
>>430
そういうのが好きならLisp使えばいいじゃん。。。
0432デフォルトの名無しさん2015/09/06(日) 09:44:06.70ID:Vj9nK5xC
>>427
それは嘘です
後置演算子の直後の二項演算子はセーフ x! * y
二項演算子の直後の二項演算子はアウト x + * y

>>419
「本当か嘘か」を優先して考え「謙虚か傲慢か」などという雑念は捨てました
0433デフォルトの名無しさん2015/09/06(日) 09:45:15.82ID:OmMBsRo+
煽ってるのをオマエラじゃんw
0434デフォルトの名無しさん2015/09/06(日) 10:14:27.94ID:wfrbDpC5
>>432
うーん、その例と「二項演算子は結合強度最弱の単項後置演算子とみなせる」
がどう矛盾するのかよくわからないです。
0435デフォルトの名無しさん2015/09/06(日) 10:31:40.00ID:Vj9nK5xC
>>434
結合強度を変えてもsyntax errorを覆すことはできません
0436デフォルトの名無しさん2015/09/06(日) 10:59:37.29ID:wfrbDpC5
>>435

x + * 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:+gBmAsnf
>>436
Applicativeスタイルを使うときに出てくる「途中の式」はそうやって考えるとわかりやすいね。
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
>>440
それが後置演算子だとすると
(2 +)と(+ 2) で(+)が別の演算子だということになってしまう。
数式の構文解析で(-)が単項演算子と二項演算子の両方に使われるせいで
BNFが無駄に複雑化するの知ってるでしょ?
同じことが(-)だけでなく二項演算子一般について大規模に生じてイヤなわけ。
0444デフォルトの名無しさん2015/09/08(火) 04:52:37.64ID:5w88oMs5
>>440
構文は理由より人気を優先した方がいい
どんな理由を示してもおそらくライバルの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
>>445
箱の喩えでいうなら、その箱から中身を取り出したままでいられる仕組みは
モナドの範疇ではないよ。

Monad 型クラスのインスタンスであるその型に付随された
モナドとは何の関係もない機能だ。
0448デフォルトの名無しさん2015/09/08(火) 22:04:03.13ID:FdaSRh76
>>445
>「モナドは値を箱の中に入れるので外からは見えない、だから安全だ」
>っていう話をよく聞くけど、

そんな話を聞いた覚えがないのだが……
0449デフォルトの名無しさん2015/09/08(火) 22:11:56.24ID:CPV+4Ywq
自分も聞いたことないな
安全だって言ってる文献を教えて欲しい
0450デフォルトの名無しさん2015/09/08(火) 22:15:43.73ID:1BhJxNoG
>>447
でも取り出す機能を簡単に付けられるのであれば、箱としての堅牢性は無いに等しいじゃん。
一回入れたらもう出せない!ってのならわかるけど。

>>448-449
IOモナドなんかそんな風に言われるじゃん。
でもIOモナドに入れた値だってfromJustで取り出せる。
0451デフォルトの名無しさん2015/09/08(火) 22:17:47.80ID:FdaSRh76
>>450
>IOモナドなんかそんな風に言われるじゃん。
>でもIOモナドに入れた値だってfromJustで取り出せる。

???
まず前半、聞いたことがない。そういうこと言ってる実例挙げられる?
後半、意味がわからない。
0452デフォルトの名無しさん2015/09/08(火) 22:18:26.87ID:CPV+4Ywq
もしかしてMaybeなどのモナドを使うことで付く分岐による安全性を
「モナドは外からは見えないから安全」という話に思い込んだんじゃ?
0453デフォルトの名無しさん2015/09/08(火) 22:20:00.08ID:1BhJxNoG
出直してきます
0454デフォルトの名無しさん2015/09/08(火) 22:20:30.14ID:CPV+4Ywq
どうやら根本から勘違いしてただけだったか・・・
0455デフォルトの名無しさん2015/09/08(火) 23:38:38.43ID:vkbbpybQ
まあ気持ちはわかるわ。俺もはじめの頃は、Maybeモナドは腑に落ちんかった。
パターンマッチでいつでも値取り出せるじゃん。って。

モナドはデストラクタを隠蔽するのが肝なんだよな。
だからparsecとかIOとかをみて、初めてありがたみがわかった。
0456デフォルトの名無しさん2015/09/08(火) 23:44:27.36ID:FdaSRh76
>>455
>モナドはデストラクタを隠蔽するのが肝なんだよな。

データ構築子のこと?
runXX の形でモナドの実体を取り出せるモナドは珍しくないし、
IOモナドもそこは変わらないよ?
IO aの実体をWorld -> (a, World)として取り出してもありがたくないだけで

>だからparsecとかIOとかをみて、初めてありがたみがわかった。

うーん、その感覚はさっぱり
隠蔽云々とは関係なくリストモナドだろうがIOモナドだろうがありがたいけどなあ
0457デフォルトの名無しさん2015/09/08(火) 23:52:35.54ID:FdaSRh76
Maybeモナドの場合なら、return (つまりJust)に突っ込んで得られない
Maybe 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
荒くれ者のC++erがHaskellやると
バグめっちゃ減るんすよwwww
その代わりコンパイル通りににくくなるんで慣れるまでめっちゃ苛々するんすけど
実行時にヘマするくらいならコンパイル失敗した方がマシだってことを学ぶんすよwww

もうC++は体力続かない
三ヶ月前のコードとか読みたくないでしょ
歳取ったらHaskellが良いって解りますよ
Haskellなら三ヶ月前のコード、また読んでみてもいいかなって、それはとっても嬉しいなって
0461デフォルトの名無しさん2015/09/09(水) 01:57:38.90ID:rpodVdIT
>> 457
なんていうか上手く言えないんだけど、例えば、
データ構築子がreturnとbindしか無くて、一方分解子、runの類いがたくさん提供されてるデータを考えてくれ。
どうだいそれって滅茶苦茶役に立たないだろ?
0462デフォルトの名無しさん2015/09/09(水) 02:07:49.07ID:15Wbqaqp
>>461
>データ構築子がreturnとbindしか無くて、一方分解子、runの類いがたくさん提供されてるデータを考えてくれ。

なにが言いたいのか理解できないが、いずれにせよreturn とbind があれば
他のはそれから定義できるんだからなにも問題ない
runXXの類がたくさん提供されてる、というのもよくわからんが、
それで有用性が損なわれるとはちっとも思えない
0463デフォルトの名無しさん2015/09/09(水) 02:09:55.95ID:15Wbqaqp
あと、データ構築子とreturn/bindは違うものなんでそこのところ宜しく
もし、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
>>464
>だからモナドにするならreturn以外にカスタムコンストラクタをたくさん提供するべき。

いやまったくもって意味不明なんだけど
普通に型定義のデータ構築子がある以上、それを使えばいいんだし、
それらのデータ構築子から構成できないようなものもあり得ない

しかもなんで「べき」なわけ?
Maybe型が役に立たなかったことなんかないだろう
あと、勝手な自分用語振り回されても理解できない(するきになれない)
0466デフォルトの名無しさん2015/09/09(水) 02:57:08.05ID:rpodVdIT
オレオレ用語で分かりにくくて、すまんかった。共通の言葉遣いは大事だよね。データ構築子はdata Hoge a = Hoge ... の奴でいいよね?

ところでさ、ライブラリを作っていて、データの内部表現を公開したくない時があるじゃない?
あとでチューニングしたいときとか。そういう時にデータがモナドなら主に ... -> 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
>>468
こっちもすまん、>>466見る前に書き込んだから
0471デフォルトの名無しさん2015/09/09(水) 03:20:21.85ID:15Wbqaqp
>>468
>例えば、doの途中でrunして値を取り出して、その値で分岐して別のモナディックアクションにつなぐのは、計算量が無駄。
>それを避けるためにモナド(手続きの抽象)がある、と俺は理解している。

計算量(?)はほぼ変わらず、コードが見やすくなるだけだ
むしろ、コードの煩雑さを苦にしないならば
最初からモナドの実体を直接操作する方が余計な関数呼び出しと
そこでいう意味の「計算量」は減る

-- オーダー以外の意味で「計算量」を使われるのも違和感があるが
0472デフォルトの名無しさん2015/09/09(水) 03:21:55.11ID:FLIFW6sl
>>468
>例えば、doの途中でrunして値を取り出して、その値で分岐して
>別のモナディックアクションにつなぐのは、計算量が無駄。
>それを避けるためにモナド(手続きの抽象)がある、と俺は理解している。
別のモナディックアクションにつなぐのが計算量の無駄というのが、
わからんのだけど
よく言われるように、用途の文脈を明確にしたい場合に使ってる事が多いし
0473デフォルトの名無しさん2015/09/09(水) 03:27:24.33ID:15Wbqaqp
>>472
Reader モナドで、逐一runReaderを使い r->a 型関数に戻すのが手間だ、
くらいの意味だろう。そりゃモナドの中で計算を合成できる方がいいしが、
指摘の通り、手間や関数適用コストの僅かな定数的増大よりは、文脈を切らずに
連続させることの利益が目的でdo 記法を使うはずだ、と私も思う。
0474デフォルトの名無しさん2015/09/09(水) 04:04:10.81ID:FLIFW6sl
読み直したけど主張が纏まってないのと、レスが補強になってない
少し落ち着いて

>>473
それで意味がわかりましたが、自分も正に>>471と同じ事を思いました
モナド無くていいじゃん、と
0475デフォルトの名無しさん2015/09/09(水) 05:16:14.00ID:k6Vctrbh
>>467
「計算は論理の物質化である」
0476デフォルトの名無しさん2015/09/09(水) 06:53:19.57ID:5v/OlT8A
>>458
OOPがわかってもC++がさっぱりわからないのと同じ

C++がわかればstaticメンバが何の役に立つのかわかる
0477デフォルトの名無しさん2015/09/09(水) 07:44:14.88ID:yxoakRA/
なんでMonadはApplicativeのインスタンスじゃないの?
0478デフォルトの名無しさん2015/09/09(水) 11:27:05.24ID:Gx2jhnq1
いまはApplicativeだよ
0479デフォルトの名無しさん2015/09/09(水) 11:44:28.09ID:15Wbqaqp
Monadにはできない(或いは非効率)だけど、Functorよりは強い構造を
持ってる有用なデータ型が多いことがHaskellでのプログラミングの進展に
よって後になってから判明したから

後付で用意されたんで、元からあるMonadの定義には手を付けなかった
0480デフォルトの名無しさん2015/09/09(水) 15:58:18.64ID:Q+d8J0F/
>>445
藁人形を殴るのやめろ
0481デフォルトの名無しさん2015/09/09(水) 18:35:43.48ID:wpO/WxMy
RTS上のデータ域に直接的にアクセスできるらしいな
unboxedが最速かと思ったがもう一つ隠し玉があるのか
0482デフォルトの名無しさん2015/09/09(水) 20:47:23.14ID:yxoakRA/
<*> <*>
0483デフォルトの名無しさん2015/09/09(水) 20:48:31.78ID:15Wbqaqp
FFIのためにCに揃えてメモリ剥き出しでデータ配置してる場合のことでしょ
0484デフォルトの名無しさん2015/09/11(金) 17:09:38.98ID:yMgx5TOb
StateはStateT Identityとして定義されてるのに、なぜMaybeはMaybeTを使って定義されていないのでしょう?
0485デフォルトの名無しさん2015/09/11(金) 18:51:03.18ID:KUqdYwfe
>>484
Stateは、状態をあとづけでつける場合に使われるからモナド変換子なのかなぁ。。。?
0486デフォルトの名無しさん2015/09/11(金) 19:36:27.09ID:v/2h2RVh
MaybeはEitherを使って定義されなかったという前例がある
0487デフォルトの名無しさん2015/09/11(金) 20:01:00.74ID:2FuYRHxl
そらそうだろ、という気もするのだが、

Maybe a = Either () a
Just x = Right x
Nothing = Left ()

みたいな話?
0488デフォルトの名無しさん2015/09/11(金) 20:39:04.30ID:v/2h2RVh
unitはidentityに似てるからいいんじゃね
0489デフォルトの名無しさん2015/09/12(土) 09:02:59.99ID:8GXyupq5
よく頭のおかしいバカが「スケーラビリティ」とほざくが
大抵それは「前例のない規模で前例を踏襲する」ことだ
0490デフォルトの名無しさん2015/09/12(土) 09:43:20.01ID:UPPQquvW
>>489
「前例のある規模で前例を踏襲することができない」よりはいいんじゃね
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+KN
えー
0494デフォルトの名無しさん2015/09/13(日) 14:50:26.51ID:mhOIQ8p/
○○されると仕事がなくなるというのは現実的にあるとしても、
だから○○は止めろとグチを言って前へ進まないのはただの甘えです。


ところで、GCがゴミを回収するタイミングを制御する方法はあるでしょうか。
たとえば、ある関数を評価しようとしないとGCが動かないようにできる、みたいな。

ステージクリア型のゲームを作っていると、ステージプレイ中はGCを止めて、
クリアしたりミスしたタイミングで一気にゴミ回収したいことってありませんか?
他にも、3DCGツールを作っていて、レンダリング中ではなく完了後にゴミを回収したい、とか。
0495デフォルトの名無しさん2015/09/13(日) 15:44:15.42ID:x1dh+v5m
>>494
GC止めるのはできないはず
System.Mem以下の関数で明示的に起動することはできる

RTSオプションの -I フラグ辺りを見るといいのかもしれない
0496デフォルトの名無しさん2015/09/13(日) 17:52:56.94ID:m/zohjMN
>>494
あるある
入力待ちに入る瞬間に軽くGCしといて欲しいとか考える
0497デフォルトの名無しさん2015/09/13(日) 22:09:38.34ID:mhOIQ8p/
>>495
ユーザーガイドを見てみました。

なるほど、そのオプションでアイドルになってから
GCが自動起動するまでの時間を指定できるのですね。
この値を非現実的な大きな値にすれば、結果的にperformGC関数で
意図したタイミングでGCを起動できることにならないか、と。

試してみます。
ありがとうございました。
0498デフォルトの名無しさん2015/09/17(木) 15:51:54.68ID:B1grEVzP
近頃ホットなライブラリは?
0499デフォルトの名無しさん2015/09/18(金) 01:29:26.35ID:wjuvkHJc
tanakahってネトウヨなのか
0500デフォルトの名無しさん2015/09/18(金) 13:33:55.01ID:YvxDAq3A
そんなことはない。彼は六年前に衆議院総選挙で民主党に投票した過去がある。よほど懲りたとみえる
0501デフォルトの名無しさん2015/09/18(金) 15:57:30.16ID:hYbUwCNL
民主に騙されてアホウヨになってしまったんだね
0502デフォルトの名無しさん2015/09/18(金) 17:03:07.30ID:4VBZsKU6
どんな嘘に騙されたのか知らんが
騙されたというならもっとこう、嘘を絶対に許さない的な理念があるべきじゃないのか
人を分類して煽り合うだけでは嘘は無くならないだろう
0503デフォルトの名無しさん2015/09/18(金) 19:10:38.07ID:YvxDAq3A
Haskellでこの世から嘘をなくせるのか?
プログラミングの話をしてくれ
0504デフォルトの名無しさん2015/09/18(金) 22:09:52.30ID:dOXUeH6Y
嘘を見抜くソフトを開発すればいい

うまい嘘をつくためにも使えちゃうか
0505デフォルトの名無しさん2015/09/18(金) 23:39:24.36ID:hYbUwCNL
tanakahがおかしいのは昔からだ
0506デフォルトの名無しさん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
Hideyuki Tanaka ‏@tanakh
憲法守れ!検閲反対!憲法守れ!検閲反対!

検閲する側の人間を支持していてこれか
脳みそ入ってないでしょ
0508デフォルトの名無しさん2015/09/19(土) 08:31:20.34ID:oTM0A26u
ここはHaskellのプログラミングについて語るスレです。プログラマ個人について語るスレではありません
0509デフォルトの名無しさん2015/09/19(土) 09:58:08.46ID:UoEBemSS
とりあえず連想リストの検索と削除を同時にするけどアキュムレータを使わない方法

f :: 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
めっちゃ素朴で雑談的な疑問: 長い函数合成書く時に、ついAしてBして…っていうふうに考えてしまって
右から順に書いてしまう (極端には filter even 書いてからその左に length . って書き加える)
んですが、これは慣れてもそういうもの?
それともそのうち「最終的に欲しいのはこれだから」みたいに左から書くようになる?
0511デフォルトの名無しさん2015/09/19(土) 11:55:02.12ID:uMEyIMVB
自分も同じ疑問感じるわ
今はタイプするのが楽だから左から書いてるけど
一度右からの流れを思い浮かべてから逆順をたどるように書くみたいにしかできてない
左から考えられるようになるものなのか?そもそもなるべきなのか?どうなんだろう
0512デフォルトの名無しさん2015/09/19(土) 12:03:35.61ID:dgpmJE92
>>510
右から左に思考の順番通り書くので何の問題もない。
カーソルの戻りがイヤで左から右にしたいなら

(>>>) :関数合成演算子( . )の引数が逆になった演算子(Control.Category)

とか

(&) :関数適用演算子($)の引数が逆になった演算子(Data.Function)

とかを使えばいいよ。

簡単な短いものはボトムアップで考えて関数合成の連鎖で直接書いてしまうし、
複雑な関数は「欲しいのはこれだから」みたいにトップダウンで定義を考えて
(where節がどんどん入れ子になる感じで)書いていく。
0513デフォルトの名無しさん2015/09/19(土) 12:36:41.64ID:UoEBemSS
左に書き加えるとかはHaskellではなくVimの話題のような気がする
0514デフォルトの名無しさん2015/09/20(日) 00:25:40.61ID:6c+MIwD/
田中さん完全にネトウヨなんだな
0515デフォルトの名無しさん2015/09/20(日) 09:21:19.17ID:ZXXgaQ/P
>>509
レスが遅くなってすいません。

その関数 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
>>515

>>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
>>516
[(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:629ydc81
脳みそ入ってるか入ってないか判らないときはMaybeモナドに包んで処理って習った
0519デフォルトの名無しさん2015/09/20(日) 12:05:14.46ID:OSUmrGRk
>>506でやりたいのっていわゆる強連結成分分解じゃないの
ググればしっくりくる解き方があるんじゃないかな
0520デフォルトの名無しさん2015/09/20(日) 12:24:31.09ID:oJTeEA6y
宣言的なコードをあきらめればいい
0521デフォルトの名無しさん2015/09/20(日) 12:40:33.83ID:629ydc81
シンプルに総当りしてマッチしたものを返せばいい
0522デフォルトの名無しさん2015/09/20(日) 13:13:36.11ID:ZXXgaQ/P
>>517
すいません、やはり意味がよく分かりません。

関数 f の各引数と戻り値の意味を教えていただけないでしょうか。
0523デフォルトの名無しさん2015/09/20(日) 13:40:26.01ID:ZXXgaQ/P
>>519
恥ずかしながら初めて聞いた名称だったので調べてみました。
確かに、置換を有向グラフとみなせば、強連結成分分解で解けますね。
今、そのアルゴリズムの詳細を調べているところです。

ただ、私の問題の方が制限がきついので、実際はもう少し特化した方法がとれると思います。
グラフと見なしたとき、全てのノードについて出る辺と入る辺はちょうど1つずつです。
なので極大もなにも一通りにしか分解できませんし、探索中に戻る必要もありません。


>>521
総当たりというのが具体的にどのような処理を指しているのか分かりませんが、
それは結局 >>506 になるのではありませんか?
0524デフォルトの名無しさん2015/09/20(日) 16:52:06.13ID:KBlLbBcH
>>506
多少は手続き的っぽくない感じで定義してみた
計算量のことなんも考えてないので泥臭さでは全く負けてないけど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.Graph (buildG,scc)
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:jrn4ktsf
>>509のつづき

g (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
>>524
グラフで言えば、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:/2p4upNw
>>527
h (zip xs xs') の簡約をノートに書いていって、処理がやっと理解できました。

結果的に、ひとつの巡回置換の先頭 2 要素のうちの最初のひとつを h で、
次の要素を g で取り出しているのがやや気になります。

あと、1 要素から成る巡回置換を作ることになる場合、
(x, x) :: [...] というパターンから処理を始めますが、
最初の x を h で取り出して、次の x を g で取り出してから、
残りのリスト [...] から g で取り出した x があるかを調べますよね。
そこも少し気になるところです(そこには無いと分かっているから)。

以上の部分をもう少しシンプルにできそうな気がするので考えてみます。


みなさん、いろいろな方法でアドバイスくださり、ありがとうございました。
参考にします。
0530デフォルトの名無しさん2015/09/21(月) 13:35:14.19ID:/2p4upNw
>>524
冷静に考えてみれば、いろいろ最適化できそうですね。

たとえば、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
>>530
と思ったのですが、iterate (map (ns !!)) [0 .. n-1] の部分で O(n^3) でしたね。

連投失礼しました。
0532デフォルトの名無しさん2015/09/21(月) 18:54:41.45ID:gEmyCLgu
>>514
(´・_・`)自分が思ったことを素直に表明してるだけで、特段ネトウヨに加担してるつもりはないと思うよ
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:rRTVDkU9
田中はもう何年もずっとだろ
0536デフォルトの名無しさん2015/09/22(火) 15:24:02.83ID:cGE1lXHQ
(´・_・`)他人の意見を鵜呑みにするより自分で考えてるだけでネトウヨというレッテルを貼られるなんて辛すぎでしょ。
0537デフォルトの名無しさん2015/09/22(火) 18:49:33.73ID:cCHjzu4f
>>536
>他人の意見を鵜呑みにするより自分で考えてるだけでネトウヨ

いや、まさに他人の意見を鵜呑みにしてるだろw
0538デフォルトの名無しさん2015/09/22(火) 20:56:50.42ID:ADm2wL+1
関プロ実入の194Pの図4.1の一番右側にあるtarai、間違ってませんかね?
0539デフォルトの名無しさん2015/09/22(火) 20:59:08.65ID:ADm2wL+1
毛の壁に触ったがために田中さんも災難だなぁ
0540デフォルトの名無しさん2015/09/22(火) 21:29:48.50ID:cCHjzu4f
taraiは2ヴァージョンある
0541デフォルトの名無しさん2015/09/23(水) 13:39:43.66ID:18dgrDRG
>>510
fmapとかnewtypeコンストラクタとかは最終的に欲しいものというよりむしろ
欲しくないものを検出するために書いてるだけだから
慣れないと感じるのは順序とは別の問題かもしれない
欲しいものの記述のみに集中できる言語があればいいんじゃないか
0542デフォルトの名無しさん2015/09/23(水) 13:44:57.16ID:OAr0MdsU
>fmapとかnewtypeコンストラクタとかは最終的に欲しいものというよりむしろ
>欲しくないものを検出するために書いてるだけだから
0543デフォルトの名無しさん2015/09/23(水) 23:08:22.19ID:mLvEhcU8
(´・_・`)民主党政権時代より今の自民の政治がマシだと思っただけでネトウヨ扱いなんですかねえ
0544デフォルトの名無しさん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:ZG5YRh3S
田中さん実質実効為替レートとか知らなさそう
0546デフォルトの名無しさん2015/09/24(木) 05:50:31.24ID:eomUiX/2
毛の壁本当うぜーな
関係ない話は自分のブログでやってろボケ
0547デフォルトの名無しさん2015/09/24(木) 08:34:06.00ID:Z+e1DhYA
実名と自然言語がうぜーから無名関数プログラミング
0548デフォルトの名無しさん2015/09/24(木) 08:52:18.74ID:Uo3c7c9s
>>544
元のサンプルplz
0549デフォルトの名無しさん2015/09/24(木) 17:39:46.80ID:wr9fetd/
思っているだけじゃなくてレッテル貼り、中傷、デマ
色々やってんじゃん
0550デフォルトの名無しさん2015/09/24(木) 18:00:44.34ID:t2o+8nOY
Haskellの話して。それがHaskellとどう関係あるの?
0551デフォルトの名無しさん2015/09/24(木) 19:16:38.77ID:9+DIf2hV
マ板でtanakhスレでも立ててそっちでやれ
0552デフォルトの名無しさん2015/09/24(木) 20:30:38.41ID:NkCijieZ
>>548
すみません。反復関数系のソースは以下です。
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:LEPedfxV
一人二人見かけてそれを全体として語っちゃうような感じ
0554デフォルトの名無しさん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:791H3qBg
なんでソースの全体示さないで、一部分だけ貼り付けてんの?
0557デフォルトの名無しさん2015/09/25(金) 08:28:12.92ID:8yN1LKRy
確率的構文ツリー生成なんかな
0558デフォルトの名無しさん2015/09/25(金) 08:41:47.24ID:JLRSSQVw
宗教上の理由でオープンソースを認めたくない人もいるかもしれない
0559デフォルトの名無しさん2015/09/25(金) 17:27:22.42ID:VsxADiNC
エントロピーの計算って p log p とか p log p/q とかいっぱい足し合わせるからpやqの大きさに依ってあり得ない数値になることがあります
合計値が非負であることが数学的に証明済みの計算結果が負になることもあります
困りました
0560デフォルトの名無しさん2015/09/25(金) 19:08:14.22ID:8yN1LKRy
>>559
Haskell関係ないよね。どっちかというと数値計算の話題だと思う。
0561デフォルトの名無しさん2015/09/25(金) 19:28:04.32ID:VsxADiNC
>>560
Haskellにそういの巧いことやってくれるライブラリありませんか?
05625522015/09/25(金) 21:21:39.52ID:1bSV3maE
>>554 >>556 >>557
どうもありがとうございます。
もっとハスケル学習してから解読してみます。
パタンマッチ用に記号を鰓が出ない範囲で構成しただけなのかもしれません。
0563デフォルトの名無しさん2015/09/25(金) 23:01:07.26ID:8yN1LKRy
>>561
Haskell万能だと思いすぎじゃね?
0564デフォルトの名無しさん2015/09/26(土) 00:37:50.07ID:wQKcUgTw
ぼく「Haskellに夢を見過ぎた」
0565デフォルトの名無しさん2015/09/26(土) 06:29:16.50ID:b2xSHmqn
Haskellやりすぎるとネトウヨになる
彼女もできない
0566デフォルトの名無しさん2015/09/26(土) 12:13:32.50ID:NeyxRrj3
>>561
君がそのライブラリを作ればいい。(ドヤッ)
0567デフォルトの名無しさん2015/09/26(土) 15:17:28.36ID:9aiso459
>>561
浮動小数点使わずに計算を進めて最後の最後に浮動小数点にすればいい。
data Logarithm = Log Ratio
みたいな型と、Logarithmに関する計算法則を関数で定義してやればいいだけ。
後はインターフェースを使いやすくしてライブラリとして公開だ!
0568デフォルトの名無しさん2015/09/26(土) 18:49:49.80ID:NeyxRrj3
>>567
logsumexp みたいな問題ってそれだけで解決するんだろうか(疑問)
0569デフォルトの名無しさん2015/09/27(日) 11:14:14.50ID:76rcq1HU
今 yesod-1.4.2 パッケージがインストールされている状態です。

ここに、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
stack new、もう少し便利になるといいな。
ライセンスファイルまで作ってくれるのはいいけど、テンプレートいじらないとBSD固定だし。
0571デフォルトの名無しさん2015/09/27(日) 21:10:40.71ID:4V+mGekM
テンプレートを一度弄るだけで済むなら十分便利だと思うが……
0572デフォルトの名無しさん2015/09/28(月) 20:50:38.43ID:7GFvCUeK
>>569 ですが、今の状態のままだと解決策は見あたらないので、
一度全て綺麗さっぱりとアンインストールして 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+fSKN
stackでghc入れないからそうなる
0574デフォルトの名無しさん2015/09/28(月) 22:15:50.09ID:7GFvCUeK
>>573
今の状態からはもう直せないのでしょうか。
0575デフォルトの名無しさん2015/09/29(火) 03:02:05.70ID:EIRExeCg
自分でいれたghcをpathから外して、stack setup
0576デフォルトの名無しさん2015/09/29(火) 03:03:41.97ID:EIRExeCg
すればstackからghcいれられるけど、望む結果になるかはわからん。
0577デフォルトの名無しさん2015/09/29(火) 04:11:33.49ID:2Slpmx/K
main = do
[x,y] <- span (\i -> i < 3) [1 2 3 4 5]
print y

みたいに、spanの結果を束縛したいんだけど、型が合わない。
doの中で、モナドじゃない普通の関数の戻り値を束縛する方法を教えて下さい。
<$>とか<*>で頑張ればできるんでしょうか?
0578デフォルトの名無しさん2015/09/29(火) 05:03:04.88ID:On1dpniq
>>577
letを使えばよい
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/YzO9
あとwhere、インデントは適当にあわせくれ

main = do
print y
where
(x, y) = span (\i -> i < 3) [1..5]
0580デフォルトの名無しさん2015/09/29(火) 05:59:19.36ID:cx9spjlF
プログラマーの朝は早い。
0581デフォルトの名無しさん2015/09/29(火) 15:10:52.01ID:2Slpmx/K
> 578
> 579
そうか、無理にIO ([a],[a])にしようとしないでletを使えばよかったのか・・・。

早朝から回答ありがとうございました。
そして書き込み直後に寝落ちしてごめんなさい。
0582デフォルトの名無しさん2015/09/29(火) 16:05:00.10ID:2Slpmx/K
span :: (a -> Bool) -> [a] -> ([a], [a]) に注意
の意味がやっとわかりました。
タプルだったんですね。

main = do
 (x,y) <- (span (\i -> i < 3)) <$> return [1..5]
 print y
でできました。
0583デフォルトの名無しさん2015/09/29(火) 20:19:07.38ID:QEsaWW2p
>>582

純粋な値をわざわざ return して <- で束縛(正確には違うけど)するのはよくない。
純粋な値の束縛にはlet を使おう(whereでもいい)。

あと、細かいことだが

¥i -> i < 3

とは書かずに

(< 3)

と書く(中置演算子のセクション記法による部分適用)。
0584デフォルトの名無しさん2015/09/29(火) 21:47:48.05ID:7/IBEyg8
何故do中のletにはinが不要なのですか?
0585デフォルトの名無しさん2015/09/29(火) 21:53:11.97ID:GFX2Obud
>>584
do 構文というものはそうだからとしか言いようがない。
Haskell Language Report とかちゃんと見てる?
0586デフォルトの名無しさん2015/09/30(水) 00:13:44.19ID:lhq6Kj3a
>>584
let ... in を使いたければ do 構文に先行して書く必要がある。
というか、do 構文中に出現するletは do構文に先行するlet ... in の糖衣構文。
なんでそうなってるのかというと、大雑把にはdo構文の解糖を簡単にするため。

# where派より
0587デフォルトの名無しさん2015/09/30(水) 00:43:40.23ID:7+kRPL7S
whereは好きじゃない。当方はlet派です。
F#由来の |> 演算子もいいと思う。
0588デフォルトの名無しさん2015/09/30(水) 01:54:07.34ID:VeSxtbXl
F#の |> ってなんだろうと、ググろうとしたけど、記号がググれない。Hoogle的なものはないのか、F#よ。
0589デフォルトの名無しさん2015/09/30(水) 11:12:27.89ID:YNt8mKMb
forward pipe operatorだよ
0590デフォルトの名無しさん2015/10/01(木) 03:27:55.14ID:tMJ2X2AQ
tanakhネトウヨオフ会やるでー
0591デフォルトの名無しさん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:J0wqCUi1
データ宣言に型クラス制約つけるのって非推奨ないし禁止されてなかったっけ
0593デフォルトの名無しさん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:xHUlQErn
代替手段ないの? どうしてもどうしてもどうしてもそれやりたいの?
0596デフォルトの名無しさん2015/10/03(土) 10:59:58.12ID:+dNnssqW
Windowsでタスクトレイに常駐するタイプのプログラムを作ろうと思ったらgtk2ksでいいの?
0597デフォルトの名無しさん2015/10/03(土) 11:00:27.88ID:+dNnssqW
×gtk2ks
○gtk2hs
0598デフォルトの名無しさん2015/10/04(日) 03:27:47.87ID:ToJIIXd8
Michael Barr, Charles Wells, "Category Theory for Computing Science"って誰か読んだことある人いる?
http://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
1要素のリストを作るとき、[x]ではなく[] xのような書き方を
したいときがあります。(\x' -> [x']) x とか return x は気に入らないです。
この対策となる手短な演算子、関数あります?
0602デフォルトの名無しさん2015/10/04(日) 10:49:06.91ID:2p1Fakm9
>>601
return
0603デフォルトの名無しさん2015/10/04(日) 10:50:45.65ID:2p1Fakm9
すまぬ、「return x は気に入らないです」を見落とした
0604デフォルトの名無しさん2015/10/04(日) 11:44:55.55ID:DjeWLfiE
>>601
(:[]) x ダメ?

パクッと食べる感じで私は好きですが
0605デフォルトの名無しさん2015/10/04(日) 12:05:49.96ID:6Gez6s+W
ていうか感情論じゃなくて客観的な動機を設定してほしい
0606デフォルトの名無しさん2015/10/04(日) 14:15:53.93ID:fDLINyyR
>>604
いいね。採用です。

>>605
(\x' -> [x']) x 見た目に冗長 (でも、ついさっきまで使っていた)
return は、多目的に利用されていて、
特に「IOモナドにいれる」という雰囲気が強い。
単要素リストのために使いたくないです。
0607デフォルトの名無しさん2015/10/04(日) 18:32:08.45ID:6Gez6s+W
モナドがIO専用になったら型クラスにする意味がない
演算子はいくらでも作れるから演算子オーバーロードの需要も少ない
0608デフォルトの名無しさん2015/10/04(日) 22:02:02.06ID:ZUTIhruE
Applicativeのpureがreturnよりはいい名前だと思うが
この目的なら>>604の書き方が一番クールに見える
0609デフォルトの名無しさん2015/10/04(日) 22:44:20.33ID:Bf0N6nIe
というか、普通は>>604で書くもんだろ。
非決定性計算の話をしてる時はreturnに決まってるが
0610デフォルトの名無しさん2015/10/05(月) 00:10:48.14ID:GrmouQHI
>>609
そういう事は初めはなかなか気づけないものなんですよ。

慣れた人にとっては普通すぎて何故その発想が出てこないのか不思議なことでも、
本人にとってはその思考回路がまだできていないのだから仕方がない。

でも、大抵そういう事は一度教えれば納得してもらえるから、
クドクドと言わなくてもいいんじゃないでしょうか。


あと、このタイミングで「非決定性計算」という単語を出しても、
return に対して IO モナドと強く結びついた印象を持っている話し相手には、
たぶん何のことだか分からないと思いますよ。
この単語を出すのなら、もう少し噛み砕いて言わないと。
0611デフォルトの名無しさん2015/10/05(月) 00:43:59.72ID:kDxLTVRe
リストをリストとして扱うか、モナドとして扱うかの違いですか
0612デフォルトの名無しさん2015/10/05(月) 06:37:18.73ID:07AYgejN
とりあえず***演算子を使ってみてほしい
Arrowとして扱わないから使わないなんてもったいない
0613デフォルトの名無しさん2015/10/05(月) 09:45:35.34ID:yzUqWBwX
(>>>)はともかく(***)の出番なんてそんなあるか??
0614デフォルトの名無しさん2015/10/05(月) 11:28:48.81ID:pbV8Etye
>>148
ただ賢くなりたいってためにやってるんだと思うよ
筋トレと同じ
目的がなくただプログラミングが詳しくなりたいって人がやってるだけ
だから使えない知識なんだよ
0615デフォルトの名無しさん2015/10/05(月) 13:21:54.61ID:07AYgejN
目的は人それぞれ
これを知らない人は同調圧力をかけて計画経済をやろうとするので
そういう意味でとても重要な知識だよ
0616デフォルトの名無しさん2015/10/09(金) 07:42:19.60ID:FkJ7bVyJ
>>583
>純粋な値をわざわざ 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:kuWdcal8
1. モナドから中身を取り出して
2. なんか純粋な計算をして
3. モナドに戻す
これらを疎結合的に書けるのに、純粋な値をreturnでラップして繋げちゃうと
密結合になっちゃってよくない、という話だと理解していた
0620デフォルトの名無しさん2015/10/09(金) 15:51:18.91ID:SHMAXyUq
Haskell使ってる時点でC++より遅いのは今更なこと
低バグ、3ヶ月後に読んでうんざりしないコードが書きたくてHaskellを使うのだろう?
0621デフォルトの名無しさん2015/10/09(金) 22:08:25.16ID:9aZeSACJ
低バグはいいが、3ヶ月後に読んでうんざりしないは保証しかねるかな
意外と冗長なほうが読みやすいこともある
0622デフォルトの名無しさん2015/10/09(金) 22:44:34.08ID:uiMXim+R
可読性を最大化する言語を決めてから一つの言語で書き続ける
これはウォーターフォール的なやり方

どんな言語が与えられてもまあまあ読めるような書き方を覚えてから言語を適当に選ぶ
というやり方があってもいいと思う
0623デフォルトの名無しさん2015/10/09(金) 23:13:43.06ID:sJZRLwqr
3ヶ月後に仕様が変わっていて大幅書き直しを要求されることも…
言語拡張なんていうクソほども信用できないものを使った自業自得だが、これには参ったです
0624デフォルトの名無しさん2015/10/10(土) 09:00:52.54ID:k6/3wbQ3
目的のためなら互換性を犠牲にする言語と、目的も犠牲もない言語を使い分ける
0625デフォルトの名無しさん2015/10/14(水) 10:07:56.26ID:6zz3+ZrR
Tカードやマイナンバーの
定期的に番号変えても行動パターンが同じだったら結局同定されてしまう問題って

関手から隠されているはずの対象の性質がわかっちゃうんだよって
圏論的に秘匿性に限界があるってことを指摘できちゃうんじゃないの?
役人馬鹿なの?
0626デフォルトの名無しさん2015/10/14(水) 11:04:49.72ID:HE0NXWt0
ヤケクソワロタ
0627デフォルトの名無しさん2015/10/15(木) 16:45:01.88ID:UdQzikyH
>>625
>Tカードやマイナンバーの定期的に番号変えても行動パターンが同じだったら
>結局同定されてしまう問題って

行動パターン?

公開鍵暗号方式で公開鍵を規則的に変えると秘密鍵も同じ規則でかわるの?
0628デフォルトの名無しさん2015/10/15(木) 18:00:22.88ID:8y87T4ny
線形に変化すると特定されるので非線形の暗号アルゴリズムを使用しなければならない
0629デフォルトの名無しさん2015/10/17(土) 13:50:41.43ID:oxF0LCT1
最近ホットなライブラリは?
0630デフォルトの名無しさん2015/10/18(日) 17:32:04.94ID:IQSF+r4c
wai パッケージのライブラリの使い方について質問です。

Web アプリにおけるストリーム レスポンスがどのように働くのか調べているのですが、
挙動がいまいちよく分かりません。

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
>>630
すいません、コードが変で、余計なものもありました。

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:D0TieV9y
sbvって実行時証命? コンパイル時証命してくれる機能はないの?
0633デフォルトの名無しさん2015/10/22(木) 01:58:37.48ID:7Ovl9dzN
Data.ListとData.Array.Repaをimportとするのに困っています
・Repaをfull importする -> map,zipWithが衝突する
・Repaをqualifiedにする -> :. も修飾しろと言われる
両方qualifiedにするしか回避方法がないのでしょうか?
0634デフォルトの名無しさん2015/10/22(木) 02:12:31.41ID:kknqMtK3
import Data.Array.Repa (:.)
import qualified Data.Array.Repa as R
0635デフォルトの名無しさん2015/10/22(木) 02:15:03.82ID:kknqMtK3
或いは

import Data.Array.Repa as R

とRepaをqualifiedせずにいったんフルに開いてしまい、
衝突するmapやzipWith は R.map R.zipWith とする。
0636デフォルトの名無しさん2015/10/28(水) 01:22:53.11ID:JEFLc7P8
>>634
同じモジュールを2回importしてもいいんですね

import Data.Array.Repa ((:.)(..))
import qualified Data.Array.Repa as R

これで思っていた感じになりました
ありがとうございました
0637デフォルトの名無しさん2015/10/29(木) 21:24:47.10ID:DfqrGTRw
いまだに forall がよく分からん。

f :: T1 a => T2 a
g :: forall a. T1 a => T2 a

関数 f と g の違いって何?
0638デフォルトの名無しさん2015/10/29(木) 21:31:26.31ID:MKBh71hJ
ライブラリのサンプルでラムダ式の4重ネストとか見かけるけどそういう書き方って普通なの?
jsのコールバック地獄と何一つ変わらない気がするんだけど
0639デフォルトの名無しさん2015/10/29(木) 23:35:31.17ID:e9INJKYU
>>637
なにも違わない
0640デフォルトの名無しさん2015/10/30(金) 01:13:23.74ID:FTBRryE0
>>639

=> は型制約?
それとも -> という関数型データ構築子の誤記?

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
>>639
>>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:dbQDbY0R
>>637
Haskellが今どうなってるか知らないが一般的にトップレベルのforallは省略できる
局所的なforallは省略できない
例 (forall a. (b -> a) -> a) -> b
0643デフォルトの名無しさん2015/10/31(土) 11:22:59.89ID:v6Gqs4tJ
モナドの別名を作りたいです。型におけるnewtypeのように、専用のモナドにして、
既存のモナドと混ざらないようにしたいです。

具体的には、Writerモナドを特化したいと考えています。

WriterT のエラーログ専用版、 ErrorLogTを作り、
エラーログは関数tellではなく、専用関数tellErrorを使うようにしたいです。

同様に、警告ログ用はWarningLogTとtellWarningとしたいです。

作る方法あります?
0644デフォルトの名無しさん2015/10/31(土) 13:00:33.74ID:VBW/ZV1E
>>641
それはmasterが局所的な量化になってるんじゃないの?
ChatHandlerの型にはmasterがどういう型かが現れてないでしょ
0645デフォルトの名無しさん2015/10/31(土) 13:04:49.04ID:VBW/ZV1E
>>643

newtype 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
>>642
>>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
>>647
んー、確かめたら局所量化じゃなさそうだね。
= の右に左に出てこない型変数をforallなしで書くなってことなんだろうけど
でもこれデータ型宣言じゃなくて型シノニムだもんね。
0649デフォルトの名無しさん2015/10/31(土) 20:13:28.97ID:VBW/ZV1E
>>638
>ライブラリのサンプルでラムダ式の4重ネストとか見かけるけどそういう書き方って普通なの?
>jsのコールバック地獄と何一つ変わらない気がするんだけど

よくわからん。

¥x1 x2 x3 -> zzzzzzz と書くのを律儀に
¥x1 -> ¥x2 -> ¥x3 -> zzzzzzzzz と書いてたって話じゃないのか?

それなら単に複数引数のλを周りくどい表記で書いてるってだけだ。
或いはdo構文をdesugarした形で明示的に書いてるとかかな。
いずれにせよ関数定義内で局所的に変数を定義するのと同じなんで地獄とも思えない。
0650デフォルトの名無しさん2015/10/31(土) 20:39:17.39ID:fFBIHpK6
もしhaskellじゃなかったらごめんなさい
うろ覚えだけどabcマシン?なるマシン語を下地になんか作る本があったきがするんだけど
何の本かわかります?
0651デフォルトの名無しさん2015/11/01(日) 02:39:58.12ID:35r9qLcL
すみませんhaskell学習のためにIDE使おうと思い試しに
intellijにhaskforceプラグイン入れて
winghci向けにテキストエディタで作っていた物を実行した所
cabalのhackageライブラリへの接続設定が上手くいかないみたいで
エラー連発となったのですが
どなたかintellij活用していて解る方いましたら教えて下さい。

参考URL
https://carymrobbins.github.io/intellij-haskforce/
06526512015/11/01(日) 11:32:51.24ID:35r9qLcL
すみません.cabalファイルの
build-depends設定が必要でした。
お騒がせしました。
0653デフォルトの名無しさん2015/11/02(月) 00:08:37.14ID:BuossX5P
>>650
わからん。
Haskellはcmmで書かれてるらしい。
0654デフォルトの名無しさん2015/11/02(月) 00:55:43.62ID:+TdI2Qwj
abcマシンってこの人が記事にしてるやつ?

http://d.hatena.ne.jp/lethevert/20060424/p2
0655デフォルトの名無しさん2015/11/02(月) 01:05:24.39ID:+TdI2Qwj
察するにHaskellじゃなくConcurrent Cleanなる関数型言語がABCマシンからなるVMを使っているようだが
0656デフォルトの名無しさん2015/11/02(月) 01:17:27.14ID:+TdI2Qwj
昔は2chにConcurent Cleanのスレがあったらしい

http://d.hatena.ne.jp/quox/20080809/p4
0657デフォルトの名無しさん2015/11/02(月) 02:19:27.64ID:3aJacJQZ
いまは単にCleanという。Concurrentの部分は黒歴史認定された。
0658デフォルトの名無しさん2015/11/02(月) 20:29:53.84ID:iqlL+d1G
cleanかー。確かに昔cleanのpdfファイルを読んだ覚えがある。cleanのスレもたまに見てた
haskellじゃなかったのね、ありがとう
0659デフォルトの名無しさん2015/11/02(月) 20:33:46.97ID:6V7frwcR
import Data.Array
import Data.Map

f :: Array Int Int -> Int -> Int
f a i = a ! i

これ、(!) がどっちのモジュール由来かわからんってエラーが出るんだが、
なんで推論しないんだろうな。

もし (!) が、Array と Map がともにインスタンスになっている共通のクラスのメソッドなら、
ちゃんとどっちの型のものか推論してくれるのに。
0660デフォルトの名無しさん2015/11/02(月) 22:03:07.66ID:3aJacJQZ
>>659
>これ、(!) がどっちのモジュール由来かわからんってエラーが出るんだが、
>なんで推論しないんだろうな。
>
>もし (!) が、Array と Map がともにインスタンスになっている共通のクラスのメソッドなら、
>ちゃんとどっちの型のものか推論してくれるのに。

まさに殆ど自分で答えを書いてると思うが、(!)は多相関数じゃないから
推論もヘッタクレもなく、単純に名前が衝突する。

ほぼ同じ状況のレコードのフィールドは
列多相にする拡張がGHC 8.0でついに入るようだ。
0661デフォルトの名無しさん2015/11/02(月) 22:29:42.30ID:BI35UJR0
多相な関数ってのとたまたま同じ名前がついた関数が複数あるってのは条件が違うんだな。
0662デフォルトの名無しさん2015/11/02(月) 23:30:27.13ID:6V7frwcR
>>660
名前が衝突してたって、a と i の型で (!) がどっちのものか特定できるじゃん。

なんで分からないなんて言うの、って話。

クラスメソッドなら同じく a と i の型から推測するわけだから、
同じように推測すればいいのに。
0663デフォルトの名無しさん2015/11/02(月) 23:36:48.35ID:3aJacJQZ
>>662
多相性抜きだと (!) に型がつかないから。
あと、同じ型シグネチャを持った複数の(!)があったらいずれにせよ解決できない。
おとなしく最初からモジュール名で修飾して特定できるようにしとけ、というのは理にかなった方針。
0664デフォルトの名無しさん2015/11/03(火) 09:06:22.82ID:6b9tjAll
>>663
うーん、正直なところまだ納得できん。

これだけ教えてくれ。
>>659 の状況で (!) が Data.Array モジュールで定義されたものだと特定するのは、理論的に不可能なのか?
それとも、たまたま今の ghc に特定する仕組みが備わっていないだけなのか?
0665デフォルトの名無しさん2015/11/03(火) 09:43:56.42ID:9Nk73qdO
>>664
理屈としては可能なんじゃないかな。効率がわるいから
やらんだけで。
0666デフォルトの名無しさん2015/11/03(火) 12:15:21.68ID:47MAD1yd
>>664
観点による。現在の環境にある(!)という名前の全部をテーブルから探してきて、
引数位置の型に合うヴァージョンを同定するということ自体はもちろんできる。

だが、(!)を多相にする仕組みを用意しないと(!)に型が付かないので
型安全性の観点からは不可能だということになる。
試しに自分が期待するように振る舞う(!)の型を書いてみればいい。

察するに構造的部分型が欲しいのかもしれないが、Haskellにはない(OCamlにはある)。
0667デフォルトの名無しさん2015/11/04(水) 11:53:03.71ID:8WRcFuaF
具体的に考えるんだ
x の型が一意に決まらないとき show x はどうなるかとか
0668デフォルトの名無しさん2015/11/04(水) 20:49:16.04ID:YGBxZpF/
>>667
どうなるの?
0669デフォルトの名無しさん2015/11/05(木) 12:04:56.34ID:327W9Rc/
A型またはB型を意味するABクラスを考える
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
13:00
〜21:00
チャンネル 関数型ストリーム処理勉強会

lv241026970
0671デフォルトの名無しさん2015/11/08(日) 15:12:58.87ID:ZXpAyz0G
free monadのfreeってどういう意味?
自由とか解放とか、鉛フリーとかのフリー?
monad以外にも何とかフリーってあるの?
0672デフォルトの名無しさん2015/11/08(日) 23:09:18.21ID:/x5r6R9h
>>671
由来は数学だね。数学のなかで、なんかの理論(たとえば群論や線形空間論)があったとして、
「なんでもない集合S」を土台にして「群」や「線型空間」を作りたい場合があるわけ。
普通の群はなんか色々元同士に絡みあった複雑な関係があったりするけど、Sから簡単に作った
群はそういう「複雑な関係から自由」だと思えるわけ。そんなわけで、そうやって作ったのを「Sの
上の自由群」と呼んだりする。

線形空間もそう。Sの元をベクトル空間の基底だと思って、無理にベクトル空間にするわけ。
S={きゅうり、なす、みかん} だとすると、これらを基底とするベクトルは

 αきゅうり+βなす+γみかん

みたいになる、、、とか言うと大理不尽パンチを食らった感じがするかもしれんけど、
学習理論で言う特徴空間なんてそんな感じだよ。

 α特徴1+β特徴2 + γ特徴3

みたいに表して、その空間がどうなってるかを調べたりするわけ。そういう意味で、一見
理不尽というか、「数学的な対象はコネコネして作れない」という神話的プラトニズムからは
受け入れがたいだろうけど、こうして作った空間は「数学」と「現実」を結んで議論するのに役に立つよ。

「現実と数学」の理論を結んでくれるこのような働きそのものを圏論ではシミュレートできるわけ。
「なんたら」という理論に対して「自由なんたら」を考えることができる。こういうとゆるっとしてふわっとした
話のようだけど、一般性という意味でのゆるさを保ちつつ、議論が宙に浮かない程度にはリゴラスな
議論ができるのが圏論の旨味です。

気分的な解説をこれ以上続けても仕方ないので、興味があったら圏論の本の「随伴」あたりを勉強されたし。
たまに「Wikipedia見てもわからなかった」とか言ってる人がいるけど、Wikipediaは記事によって記述の濃淡が
ばらつき過ぎていて、あれで勉強するというのは全くオススメしないよ。
0673デフォルトの名無しさん2015/11/09(月) 00:46:28.67ID:hXrsgMsb
>>672
ありがと。

圏論 原著第2版 の第9章のタイトルが随伴だそうだから読んでみるわ。
圏論入門者がそこまで到達(理解)するのにどれだけ時間がかかるか分からんが。
0674デフォルトの名無しさん2015/11/10(火) 15:18:42.59ID:GBT1w9xC
モナドって離散信号を一回連続に直してからフーリエ変換して離散に戻すみたいな感じですか
0675デフォルトの名無しさん2015/11/10(火) 20:05:26.23ID:ZeRtqP7q
モナドは自己関手なので離散から連続に直すみたいな感じではありません
0676デフォルトの名無しさん2015/11/11(水) 00:04:10.91ID:CaB3I9+U
>>674
床下配線でどうたら、という解説から想像をたくましくしてはいけない
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
>>678
そういう意味での文脈、じゃないよ。

たとえば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の計算効果はあります
Listを知らない人にモナドを教えるのは早すぎるし
知っている人に計算効果を教えるのは遅すぎる
0682デフォルトの名無しさん2015/11/12(木) 19:03:08.30ID:UTL+VBaF
昔、継承がなければポリモーフィズムもないと思ってたんだが
ダックタイピングすれば継承がなくてもポリモーフィズムがあると気付いて
継承を理解するには静的型付けを知るべきだと思った

モナドも同じだと思う
静的型付けを知らなければモナドの本当の意味は分からない
0683デフォルトの名無しさん2015/11/12(木) 19:15:06.84ID:169dDeUZ
>>682
>昔、継承がなければポリモーフィズムもないと思ってたんだが
>ダックタイピングすれば継承がなくてもポリモーフィズムがあると気付いて
>継承を理解するには静的型付けを知るべきだと思った

意味がわからん。
継承と多相が関係ないのはそりゃ当然だが
ダックタイピングがどうというのも関係がない

>モナドも同じだと思う
>静的型付けを知らなければモナドの本当の意味は分からない

いや普通にリストモナドとかLispで実装して使うから。
そういうLisperは既に静的型付けを知っている!みたいな話なのかもしれんけど。
0684デフォルトの名無しさん2015/11/12(木) 21:24:49.38ID:UTL+VBaF
>>683
リストモナドというけど、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/o
ID:UTL+VBaFが何言ってんのかさっぱり分からん
0687デフォルトの名無しさん2015/11/13(金) 00:16:45.89ID:S1si1Bvf
嘘を言うよりよっぽど安全だが
まあどんな小さなリスクも見逃さない努力が必要ってことか
0688デフォルトの名無しさん2015/11/13(金) 07:28:57.94ID:z10Svt7p
そもそも継承と部分型関係は関係ないからな。
ID:UTL+VBaF (>>687もかな?) の言ってることは尽く意味不明。
0689デフォルトの名無しさん2015/11/14(土) 16:08:25.00ID:eusaGjJ0
>>681
(>>=)のような組み合わせ方法を議論のビルディングブロックに
もってきたのがHaskellの(というかワドラーの)偉さなんだけど、
この「偉さ」は静的な型がしっかりした世界でのみ意味を持つのであって
そういう意味では他の言語では(所謂関数型言語の仲間であっても)
モナドを論じる意味は全くない。
0690デフォルトの名無しさん2015/11/14(土) 16:32:22.06ID:99hLr/Ur
>>689
>この「偉さ」は静的な型がしっかりした世界でのみ意味を持つのであって

まったく勘違いしてる
計算効果は型付けの静的動的とはなんの関係もない
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
let や where の変数の値は実行時まで分からないことが多い
分からないことは宣言できない
余計な変数を作らないようにして分からないことを目立たなくすることはできる
0693デフォルトの名無しさん2015/11/14(土) 23:38:38.09ID:99hLr/Ur
>let や where の変数の値は実行時まで分からないことが多い
>分からないことは宣言できない
>余計な変数を作らないようにして分からないことを目立たなくすることはできる

意味不明過ぎる。
局所定義でなくトップレベルに書いたらいいとでも?
0694デフォルトの名無しさん2015/11/15(日) 00:16:27.42ID:1MD+X9xB
宣言的ってナニ?
0695デフォルトの名無しさん2015/11/15(日) 06:56:56.90ID:QRVxROzt
Excelは宣言的だと聞いたことがある
0696デフォルトの名無しさん2015/11/15(日) 09:11:10.12ID:5yN0loUP
囲碁やソリティア、大戦略などのような2次元の広がりのある升目型ボードゲームを作る場合、
ボードのデータ構造は Haskell でもやはり Data.Array 系でしょうか。
0697デフォルトの名無しさん2015/11/15(日) 10:02:09.42ID:rgLL3QSn
>>696
immutableでやるんならData.Mapでもさほど問題はないよ。数百要素程度だし。
mutableで行くとシンプルに割りきってMArrayを使ってもいいんじゃないかな。
もし盤面を行列と見た計算が必要ならRepaを使う。
0698デフォルトの名無しさん2015/11/15(日) 14:07:14.87ID:0IQFXnOJ
副作用使わない自慢よりは静的型付け自慢の方が無難
0699デフォルトの名無しさん2015/11/15(日) 20:49:33.73ID:5yN0loUP
>>697
ありがとうございます。
参考にさせていただきます。
0700デフォルトの名無しさん2015/11/15(日) 21:30:51.67ID:mV2QWUyr
>>690
私が言ったのは (>>=)を議論のビルディングブロックに持ってくることが
ピンと来るのは静的な型がしっかりしているからだ、と言うことだ。

別にLispやJavascriptやらJavaで (>>=)に該当するものを作っても構わんが
Haskellが受けるのと同じ恩恵は受けられない。

ホゲホゲという言語でモナド作ってみたとかいう記事は腐るほど出てくるが
Haskellっぽい言語以外では「作ってみた」以上の進展はない。
考えることは出来ても(>>=)を議論のビルディングブロックにする旨味が
その導入コストを下回るからだ。
0701デフォルトの名無しさん2015/11/15(日) 22:40:50.94ID:vt2WrPRj
宣言的なコードと非宣言的なコードの違いが分からないどれがどれ?

A: 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
declarativeと何を対比したいんだ?

宣言的/式志向的

を区別したいなら
https://wiki.haskell.org/Declaration_vs._expression_style

を読むだろJK
0703デフォルトの名無しさん2015/11/16(月) 01:27:31.81ID:Dn8++f15
>>701
・宣言的/非宣言的に分けられるという信念はだれに吹きこまれたのか
・宣言的/非宣言的を判定する基準は存在すると思うか。思うとしたら何故か
・そもそも宣言的(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:f2IMGMZY
モナドすら知らない人からするとdo文は手続きに見える
0707デフォルトの名無しさん2015/11/17(火) 07:00:14.09ID:qSlbRl0V
>>706
というかそれでいいんだよ。
純粋な関数型の枠組みの内部で手続き的な構造をもたらすことが
モナドを導入する意図の重要なひとつなんだから。
0708デフォルトの名無しさん2015/11/17(火) 21:08:21.39ID:a/8UTPX3
手続き的な構造を目的にして do 構文を使っちゃいかん。
ソースが見苦しくなる。

手続き的な構造の構築機能としては、
Haskell の do 構文は C 言語などに比べて遥かに不自由なのだから。
0709デフォルトの名無しさん2015/11/18(水) 08:39:48.41ID:yhwFYSiS
main :: IO () の場合がまさにそうだけど、モナドM に対して M なんちゃらって
値を一つのリテラルで書くのが難しい場合に手続き的に do で
構成するような使い方にとどめておいたほうが良いのであって
手続き的にかけるぞやったーとか言ってると全体がIOモナドに
なちゃーうよ。
0710デフォルトの名無しさん2015/11/18(水) 12:46:08.66ID:CKQsS/J8
>>707
> 純粋な関数型の枠組みの内部で手続き的な構造をもたらすことが
> モナドを導入する意図の重要なひとつ
それってどのくらい信用していい?
それじゃあ、モナドを導入する意図のうち重要なものをすべて挙げることができる?
あるいは、モナドを導入する意図全体を簡潔に言える?
0711デフォルトの名無しさん2015/11/18(水) 18:32:33.28ID:yhwFYSiS
>>710
重要な理由の一つを挙げただけの人にどうして
「モナドを導入する意図のうち重要なものをすべて挙げることができる?」
と聞くのかさっぱりわからん。

というか「信じるかどうか」気にする前に君が読むべき論文は

Wadler Monad

でググれば一発目に出てくると思うんだが。あとはその論文でも
引用されてる Moggi 1989 とか。 Moggi 1989 はアイデアの宝庫だよ。
状態や継続が「モナドで表現した計算効果」とみなせることは
Moggiのアイデアだよ。
0712デフォルトの名無しさん2015/11/18(水) 19:17:44.11ID:YqJaO+rH
ttp://www.amazon.co.jp/圏論の技法-中岡-宏行/dp/4535786674
発売日 2015/12/14

こんなの今日見つけたんだけど、圏論、今年、流行ってるの?

日本人が書いてるから、言葉的に読みやすいと嬉しいけど。
0713デフォルトの名無しさん2015/11/18(水) 20:53:20.61ID:CKQsS/J8
>>711
> 重要な理由の一つを挙げただけの人にどうして
> 「モナドを導入する意図のうち重要なものをすべて挙げることができる?」
> と聞くのかさっぱりわからん。
めんどくさい人だね。一つ挙げた人が残りすべてを挙げることができるかもしらんし、
できんかもしらんじゃないか。なんで「と聞くのかさっぱりわからん」のかさっぱりわからん。
出来ないはずだがね、あなたにも

> Wadler Monad
> Moggi 1989 はアイデアの宝庫だよ
それはあなたたちの買いかぶりだよ
0714デフォルトの名無しさん2015/11/18(水) 22:39:23.99ID:yhwFYSiS
↑なんでハスケルスレってこんな人ばっか湧くの?
0715デフォルトの名無しさん2015/11/18(水) 22:54:25.73ID:ELCanc9c
>>707
よく分からんのだが、その構造というのは表現と同義?

単に手続き型言語のプログラムと似たような見た目にできるよって話なのか、
それとももっと深い意味(意義)があるのか。
0716デフォルトの名無しさん2015/11/18(水) 22:57:14.04ID:r+WUaKBg
>>714
しかもこういうのに限ってまともに勉強したことない感じなんだよなあ

Moggi1989をきちんと読んで理解した人間人が
>>710みたいな間抜けな質問をするはずもなく。
0717デフォルトの名無しさん2015/11/18(水) 23:01:07.01ID:r+WUaKBg
>>715
モナドを使って計算効果の表示意味論を与えようという話なんで、
見た目がどうとかじゃなくて、まさに「意味」の話よ。
0718デフォルトの名無しさん2015/11/18(水) 23:26:13.39ID:CKQsS/J8
>>714 >>716
腐るほど居る単なる文献学習生の一人(二人?)なのね?w
しかも今や相当古い文献
0719デフォルトの名無しさん2015/11/18(水) 23:32:09.39ID:r+WUaKBg
うわあイタい
0720デフォルトの名無しさん2015/11/19(木) 07:29:01.58ID:lSpyFHbj
>>717
計算効果の表示的意味論を「何に対して」与えるの?
手続き的な構造をもたらす対象は「何」?

両者の「何」は同じもの?
つまり、その「何か」はモナドによって計算効果の表示的意味論を与えられると、
構造が手続き的になるの?

構造の意味もいまいち分からんが・・・
0721デフォルトの名無しさん2015/11/19(木) 10:52:43.27ID:zQxckC7S
質問が多くなるのは最初の質問がおかしいんだよ
おそらく質問の答えを知りたいのではなく論破して否定したいだけ
それなら単刀直入に否定から入る方が早い

否定から入るのを避けるのは非効率
明らかに生産性が下がっている
0722デフォルトの名無しさん2015/11/19(木) 13:45:26.51ID:0swJqKqT
関数型言語ってモジュール間の依存性高すぎない?
0723デフォルトの名無しさん2015/11/19(木) 14:24:16.18ID:/zyx7Wn8
大雑把な書き方をするねぇ
0724デフォルトの名無しさん2015/11/19(木) 14:25:14.25ID:zQxckC7S
F#とC#のような言語非依存のモジュールシステムがあったらいいね
0725デフォルトの名無しさん2015/11/19(木) 17:36:15.14ID:vkUnAwZU
C言語出来るだけの素人がhaskell修めるまでどんくらい時間かかりますか?
0726デフォルトの名無しさん2015/11/19(木) 20:54:12.06ID:0e/5E7Hf
修めるだけならチュートリアル読むだけなんだからまったく時間かからんだろ。
マスターする、という意味なら一般にそんな時間の見積もりは不可能だろ。
0727デフォルトの名無しさん2015/11/19(木) 22:18:31.37ID:sCZhhvVw
>>717 >>726
もっとちゃんと答えられんのか
0728デフォルトの名無しさん2015/11/19(木) 22:33:37.20ID:0e/5E7Hf
>>727
「ちゃんと」答えてるじゃないか。
むしろ根拠もないのにこれ以上に具体的な答えを返す方がおかしいわ。
0729デフォルトの名無しさん2015/11/19(木) 23:05:29.68ID:sCZhhvVw
>>728
それは無能ってことよ
0730デフォルトの名無しさん2015/11/19(木) 23:06:28.90ID:NCXIzrQp
有能なら未来予測ができるのか
0731デフォルトの名無しさん2015/11/19(木) 23:15:10.43ID:uB3RBNvP
>>727
きみ、このスレに頻繁に書き込んでるけど、なんでHaskellに執着してるの?

親でも殺されたの?
0732デフォルトの名無しさん2015/11/19(木) 23:15:42.54ID:0e/5E7Hf
>>729
はいはい。お前さんが答えてやりゃよかろ。無能じゃないんだったらな。
0733デフォルトの名無しさん2015/11/20(金) 17:56:29.77ID:hD02raLH
haskellでnumpyのようなライブラリーありますか?
0734デフォルトの名無しさん2015/11/20(金) 19:48:44.22ID:Ub4YKJzu
>>729
あれ、返事待ってたんだけどな…
ほらー有能なんでしょ君? 早く答えてくれないと!
かなり待ってるんだけどなぁ。俺が
死ぬまでにちゃんと答えてくれるんだよね?
ねー早くスマートでクールな答えをよろしく頼むよ!
0735デフォルトの名無しさん2015/11/21(土) 11:05:00.50ID:74J1zl0I
Jカーブ底打ってからあと2年
0736デフォルトの名無しさん2015/11/22(日) 13:17:23.26ID:lKqXG5SA
>>733
bindings-gsl じゃだめですか
0737デフォルトの名無しさん2015/11/25(水) 00:31:18.47ID:4BagtNs6
semantic versioningを厳密に順守するパッケージ間なら、ビルド後の依存関係を緩くしても良さそうなもんだけどな。
base_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:tNxrewhG
semanticsとなんの関係もないのになんでsemantic versioningっていうんだろう
0740デフォルトの名無しさん2015/11/25(水) 21:52:40.53ID:8QEKlgDl
ソースの意味が分かってないと順守できないし順守されているかどうか判断できないから
0741デフォルトの名無しさん2015/11/26(木) 00:48:29.77ID:EiQ95VPh
パッケージのインストールってなんでファイルを置くだけでOKにできないの
0742デフォルトの名無しさん2015/11/26(木) 23:00:17.77ID:caXSzhxT
>>741
?どういう意味だろう
0743デフォルトの名無しさん2015/11/27(金) 20:05:24.18ID:eLJXztJb
Ambiguous!
0744デフォルトの名無しさん2015/11/28(土) 11:22:10.44ID:ADrw5NIB
諸君、議論したまえ
0745デフォルトの名無しさん2015/11/29(日) 09:37:17.49ID:9VwKMKnd
>>744
またおまえか
0746デフォルトの名無しさん2015/11/29(日) 10:55:13.94ID:DI7OadCE
conduit と persist を連携させ、例えば上流から String 型のデータを受けて、
「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:XiHhDJLB
template haskell つかってるひとはじめてみた
0748デフォルトの名無しさん2015/12/01(火) 10:17:37.88ID:pLCJABYC
そんなこというひとはじめてみた
実用だと使うよね?yesod某とかfile-embedとか

>>746
むしろpersistとconduitの連携とか勉強になった
すっきりしていいと思う
0749デフォルトの名無しさん2015/12/02(水) 02:05:09.83ID:sE+ivAhG
file-embedは便利だけどyesodとかhakyllとかそんな使うかなあ。
まあでもlensでお目にかかってるはずだとは思うけど。
0750デフォルトの名無しさん2015/12/02(水) 12:18:37.59ID:8wtTORdb
lens はいろんなチュートリアルみてもなにやってるか
わからなくて使ってない
0751デフォルトの名無しさん2015/12/02(水) 17:37:47.86ID:PbTtaUvu
Haskellをベースに創られたElmとかいうAltJS言語の話題はここでいいですか?
0752デフォルトの名無しさん2015/12/02(水) 22:51:45.37ID:sE+ivAhG
簡単な文法の話以外ならElmスレ立てたほうがいいと思う
0753デフォルトの名無しさん2015/12/04(金) 22:59:21.91ID:Jt34pK2I
>>711
これ読んでみるわ、サンキューモッギ
0754デフォルトの名無しさん2015/12/05(土) 15:12:50.94ID:r040mJaZ
Monadクラスの中で特に汎用性の高いインスタンスを一つ選び
そのインスタンスだけでほぼ何でもできる、という方向に行かないのは何故なのかな
そうすれば苦労してMonadクラスを理解する必要もなくなるのに
07555922015/12/05(土) 17:54:28.20ID:e0mSV6nD
>>754
きみがMonadクラスを理解するのに苦労した原因は
それぞれのインスタンスが個々の機能に特化ているからなの?

インスタンスが特化しているとクラスが理解しにくいのは何で?

意味が分からん
0756デフォルトの名無しさん2015/12/05(土) 19:18:42.16ID:r040mJaZ
特化しすぎたら価値を理解するのに苦労するのは当たり前じゃないか
例えばアフリカのある国でしか使えない通貨とか
07575922015/12/05(土) 20:10:01.50ID:e0mSV6nD
>>756
きみにとってアフリカの通貨(インスタンス)の価値は分からなくても
通貨(クラス)の価値は分かるよね
0758デフォルトの名無しさん2015/12/05(土) 20:15:13.38ID:xnZtirmK
モナドは単なる、今のところなかなかの成功を納めているデザインパターンの一つに過ぎないとこのスレで教わった
0759デフォルトの名無しさん2015/12/05(土) 20:17:20.10ID:xnZtirmK
あと、月を指せば指を認むって諺をさっきTwitterから学んだ
0760デフォルトの名無しさん2015/12/05(土) 21:06:41.94ID:GqrmhMyi
>>754
>Monadクラスの中で特に汎用性の高いインスタンスを一つ選び
>そのインスタンスだけでほぼ何でもできる、という方向に行かないのは何故なのかな

なんでわざわざそんなモジュール性がクソになるようなことしなきゃいかんのw
0761デフォルトの名無しさん2015/12/05(土) 21:17:53.90ID:fWHJ2v3J
So you can think of lists as promises that
the 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
>>760
特化してもモジュールが単純化される保証はない
ポイントカードのように特化して複雑化したモジュールが大量に作られる可能性がある
0763デフォルトの名無しさん2015/12/05(土) 22:04:23.53ID:/HX/hq4Y
promiseを日本語で理解してくると読めるようになると思う
07647612015/12/06(日) 08:58:48.47ID:d9uqm994
すごいhaskell楽しく学ぼう持ってる人教えてください
205ページに日本語訳が載ってると思います
お願いします
0765デフォルトの名無しさん2015/12/06(日) 15:02:16.24ID:lk97yytv
モナド則をチェックする機能はなぜ作れないのか
0766デフォルトの名無しさん2015/12/06(日) 15:05:47.98ID:B69NHvUF
>>765
一般に与えられた2つの値の等価性を決定する手段がないから(たとえば関数)
0767デフォルトの名無しさん2015/12/06(日) 15:16:43.60ID:43TPMysj
そういうのはチェックではなく証明しないとだめだ。もちろんその証明は人間が書くのだが。
0768デフォルトの名無しさん2015/12/06(日) 16:24:47.53ID:rl6X8EeV
既存のインスタンスは証明済みだよな
既存のに制約を加えただけのインスタンスも証明不要
0769デフォルトの名無しさん2015/12/06(日) 19:05:15.11ID:43TPMysj
mtlのListTがモナドではないと気付かれるまでに少し掛かったので油断は禁物だ
0770デフォルトの名無しさん2015/12/09(水) 16:23:41.49ID:KCuPtV0t
なんだと? 発案者は何らかの責任を取ったのか?
0771デフォルトの名無しさん2015/12/10(木) 10:04:31.34ID:be8IS9Hr
GHC 7.10.3 リリースおめ
[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:qPm1t7ac
>>770
Cのクソ品質の乱数だって誰も責任とっとらんがな
0773デフォルトの名無しさん2015/12/10(木) 10:39:08.93ID:bjguJgYh
returnの命名者誰なんだろ
0774デフォルトの名無しさん2015/12/10(木) 11:53:32.15ID:b8dKvTYk
たとえば「絶対に儲かる」乱数だとか品質に言及していたら責任問題になるだろうが
作者が何も言ってない値札もついてないものは質が低くても別にいいんじゃないか
0775デフォルトの名無しさん2015/12/10(木) 15:50:49.33ID:C4TvgIE0
名前なんて適当に別名つけたったらええやん。
0776デフォルトの名無しさん2015/12/10(木) 17:03:21.77ID:HOydu8dt
標準を軽視すれば他人に読みにくい糞コードの濫発を招くのではないか
0777デフォルトの名無しさん2015/12/10(木) 17:11:09.97ID:C4TvgIE0
Haskell のコードなんて言語内 DSL の乱発じゃん。 別名くらいイマサラ
0778デフォルトの名無しさん2015/12/10(木) 19:10:58.97ID:97YX12O0
不満があるなら自分で言語を作ればいい
それもできないなら黙ってる事をお勧めする
0779デフォルトの名無しさん2015/12/10(木) 19:37:06.78ID:pF20NpG5
>>777
それは言い得て妙だな。俺も使わせてもらおう。
0780デフォルトの名無しさん2015/12/10(木) 20:07:15.77ID:HRHtpj0X
本当の初心者には

IOモナドは型を合わせるパズルさえ解けたらそのご褒美に
純粋性を保ちながら入出力を許してくれる仕組みだと思え

って言ってる。
合わせ慣れるとほっといても意味がわかってくるんだよね
0781デフォルトの名無しさん2015/12/10(木) 20:22:42.52ID:IZmXUGd+
近くにHaskellに興味を持ってくれる初心者がいるなんて羨ましい
0782デフォルトの名無しさん2015/12/10(木) 22:44:48.71ID:KZYbcLbE
>>780
どうも理解が全く違ったようだな。撤回するわ。やめとく。
0783デフォルトの名無しさん2015/12/11(金) 10:18:36.36ID:r5Q1R4hd
ハスケルって白鳥になりたいペンギンみたいな言語だな
0784デフォルトの名無しさん2015/12/11(金) 19:58:31.12ID:sot30U5t
Haskellは、海底から見上げたらペンギンも飛べることになるって言語
0785デフォルトの名無しさん2015/12/11(金) 22:20:30.68ID:85l8vb8h
Haskellを何かに例える奴はろくにHaskell使ってないだろw
0786デフォルトの名無しさん2015/12/11(金) 22:24:19.25ID:GOodMDFm
初心者に分かりやすい例えと熟練者に分かりやすい例えは違うし
0787デフォルトの名無しさん2015/12/12(土) 13:37:18.60ID:ujGm9ePq
>>783
>>784
これらの喩えは初心者に分かりやすいのですか?
それとも熟練者に分かりやすいのですか?

私には意味が分からないです。
0788デフォルトの名無しさん2015/12/13(日) 00:08:50.71ID:3pFOKkOt
>>787
間を取って初心者にも熟練者にも意味不明な喩えにしてみました。
どちらにも「同じくらい」納得していただくことを目指した結果なので
何卒ご了承ください。
0789デフォルトの名無しさん2015/12/13(日) 11:41:19.28ID:Osvw0E0t
例え話の目的は、元ネタを知ってる奴なら言わなくても分かることを省略することだな
省略しても何も分かりやすくならない
ただ短くなるだけ
0790デフォルトの名無しさん2015/12/15(火) 13:09:03.38ID:iFi41cde
haskell勉強中です
H本にfoldlが無限リストに対して動作しないと書いてあるのですがfoldrで扱えてfoldlで扱えないとはどういうことですか
0791デフォルトの名無しさん2015/12/15(火) 13:16:24.90ID:sAET7hcQ
後のページを読めばわかるようになる
0792デフォルトの名無しさん2015/12/15(火) 15:12:58.62ID:HsnKelNC
>>790
遅延評価だから
0793デフォルトの名無しさん2015/12/15(火) 18:57:39.98ID:QE2M/7jx
读书百遍、其意自见。
0794デフォルトの名無しさん2015/12/15(火) 20:24:17.53ID:lBHgLkLX
>>791-792
続き読みました
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:CNI5JGVG
プログラマはMacを使ってるってマジ?
http://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:+WfqJ81y
>>798
Haskell力の低い人と高い人で決定的に違うのは何でしょうか。
0800デフォルトの名無しさん2015/12/20(日) 00:59:06.94ID:nJz8/sCp
動的型で嬉しいことがあるとすれば(返り値の?)型の違う関数を許す事になるが果たして…
0801デフォルトの名無しさん2015/12/20(日) 01:13:13.68ID:AMk4fv31
コード弄りながら設計を考えていくタイプの物は動的型の方が楽かな
0802デフォルトの名無しさん2015/12/20(日) 03:44:49.47ID:PpeZ7QXn
>>799
Haskell力が低い人
「読んだ方が良いか?」

Haskell力が高い人
「『ママッ子』なんだよ>>798
 ビビったんだ…。甘ったれてんだ! わかるか? え?オレの言ってる事。
 『型』のせいじゃあねえ。心の奥のところでオメーにはビビリがあんだよ!
 オレたち強いHaskellerはな!
 そこら辺のナンパJavascripterや仲よしクラブで『読んだ方が良いか?』『読んだ方が良いか?』
 って訊いて回って仲間と心をなぐさめあってるような負け犬どもとはわけが違うんだからな。
『読んだ方が良いか?』…そんな言葉は使う必要がねーんだ。
 なぜならオレや、オレたちの仲間はその言葉を頭に思い浮かべた時には!
 実際に本を読んじまってもうすでに 終わってるからだッ!
 だから 使った事がねェ〜〜〜ッ。
 >>798
 オマエもそうなるよなァ〜〜〜〜〜〜〜〜
 オレたちの仲間なら…わかるか? オレの言ってる事… え?
『読み終わった』なら 使ってもいいッ!」
0803デフォルトの名無しさん2015/12/20(日) 12:57:25.53ID:NTC3UnWc
>>802
ほんこれ
0804デフォルトの名無しさん2015/12/21(月) 08:53:41.20ID:p6vwDy5Q
bottomって何だお
0805デフォルトの名無しさん2015/12/21(月) 13:59:05.21ID:UYX3g1H/
あらゆる部分関数を全関数にするための魔法のこと
0806デフォルトの名無しさん2015/12/21(月) 15:13:18.71ID:Nh3sqEqI
和の単位元bottom
積の単位元unit
0807デフォルトの名無しさん2015/12/21(月) 21:20:25.06ID:p/vkOJl0
C から int 型の配列を Haskell に渡して
たとえば Haskell ですべての要素に 1 を足して
足された配列を C に返すってのをやりたいんだけど
いいサンプル知らない?

配列じゃなくて単独の int とか double とかはできるんだけどな
0808デフォルトの名無しさん2015/12/21(月) 21:48:27.29ID:ppP3iBcM
Cでやればよくない?
0809デフォルトの名無しさん2015/12/21(月) 22:48:06.17ID:p/vkOJl0
そりゃ業務だったらそうするけどさ

できたら楽しいなって、それだけだよ
0810デフォルトの名無しさん2015/12/22(火) 21:04:57.45ID:RcXN8h3P
>>807
FFIしたいということですか
0811デフォルトの名無しさん2015/12/22(火) 22:08:30.28ID:JyKdzAuM
本物のプログラマはHaskellを使う 日経ソフトウエア
第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
>>810
そういうことですね

>>811
情報ありがとうです

とりあえず力技ではできたけど、あんまりスマートじゃないなー
俺の Haskell レベルだと、どうやってリストにすればいいか解らないw
http://pastebin.com/v9q509Pr
0813デフォルトの名無しさん2015/12/23(水) 15:44:56.86ID:2+dP2nJG
ghc 7.10.3 の ghci 上での :sprint について

Prelude> let x = 1
Prelude> :sprint x
x = _
Prelude> x
1
Prelude> :sprint x
x = _

こうなるんだが、これが正常なの?
最後、x = 1 と表示されるのを期待したんだが。
0814デフォルトの名無しさん2015/12/23(水) 20:34:05.51ID:ar8RTNkN
>>813
http://d.hatena.ne.jp/kazu-yamamoto/20151217
0815デフォルトの名無しさん2015/12/23(水) 20:49:10.99ID:2+dP2nJG
>>814
なるほど

ありがと、助かったよ
0816はちみつ餃子 ◆8X2XSCHEME 2015/12/24(木) 02:55:04.00ID:HopzupNL
>>784
どこかで見たネタだと思ったらゆゆ式だった。
0817デフォルトの名無しさん2015/12/29(火) 00:17:50.09ID:9ZoBZ5vT
諸君、議論したまえ。
0818デフォルトの名無しさん2015/12/29(火) 10:01:45.65ID:RBH4v58J
>>817
すっこんでろ
0819デフォルトの名無しさん2015/12/29(火) 10:07:19.04ID:zZSzcFIy
H本でbracketOnErrorのとこまで読みました。
bracketとbracketOnErrorの使い分けどうやってますか?
onerrorの方が効率は良さそうですが。
0820デフォルトの名無しさん2015/12/29(火) 10:39:50.46ID:xUoFMoAl
H本なんて固有名詞ネーヨカス
0821デフォルトの名無しさん2015/12/29(火) 11:02:31.87ID:zZSzcFIy
>>820
あなたがわからないだけでしょ
0822デフォルトの名無しさん2015/12/29(火) 11:05:25.98ID:xUoFMoAl
キチガイだな。 放置でヨロwww
0823デフォルトの名無しさん2015/12/29(火) 11:21:31.50ID:zZSzcFIy
>>822
あんたキチガイだからNGしとくわw
さいならー
0824デフォルトの名無しさん2015/12/29(火) 11:24:08.59ID:xUoFMoAl
>819 名前:デフォルトの名無しさん[sage] 投稿日:2015/12/29(火) 10:07:19.04 ID:zZSzcFIy [1/3]
>H本でbracketOnErrorのとこまで読みました。
>bracketとbracketOnErrorの使い分けどうやってますか?
>onerrorの方が効率は良さそうですが。

どっちがキチガイなんだろうかwwww
0825デフォルトの名無しさん2015/12/29(火) 11:39:12.45ID:X0OP3kiA
>>819
その本でどのように説明されているのか私は知りませんので、
的外れなレスでしたらごめんなさい。

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
>>825
ありがとうございます。
すみません。まだ初歩の学習中でbracketのソースは読めそうにないです…
bracketOnErrorでも第三引数に第二引数と同等のリソース開放のコードを書くことでこの2つの関数は代替可能だと思ったのですが間違っているでしょうか?
onerrorの方が効率が良いと思ったのは例外が発生しない場合第二引数の関数を呼び出すコストがかからないからと考えましたが大したコストじゃなさそうですね
0827デフォルトの名無しさん2015/12/29(火) 13:40:10.25ID:X0OP3kiA
>>826
たしかに bracketOnError の第2引数は、第3引数で例外が発生しない限り実行されません。
その意味では「例外の無い通常運転では第2引数を実行するコストはかからない」のでその分効率的でしょうね。

ただ問題は、そのような処理の流れで本当に大丈夫なの? と言うことです。
あなたが実現させたい処理の流れに合っているかどうか、それが最も大事です。
bracket と bracketOnError のどちらを使っても実現させたい処理に適合するのなら、
より効率的な方を選ぶのも手です(効率の他に、ソースがより読みやすい方を選ぶのも手)。

効率よりもまずは合っているかどうかを考えた方が良いと思います。
>>825 で「役割が違う、効率で比較するものではない」と言ったのはそういう意味です。
合わないものを工夫して合わせるのはバグの元なので、
そういう工夫はそれしか手段がない場合のみやるべきだと私は思います。

もし bracketOnError の第3引数にリソース解法処理を「必ず行うように」書くのなら、
あなたがメリットだと感じている「例外がなければ第2引数を実行するコストがかからない」
というのは無くなり、処理的には bracket と「ほぼ」同等になりますが、
それなら bracket を使うべきだと私は思います。
同じ処理を実現するなら、手間がかかる bracketOnError より楽に bracket です。
0828デフォルトの名無しさん2015/12/30(水) 04:17:15.91ID:P/Z2Dori
bracketOnError の第一引数が例外となったらどうなりますか?

bracket AB共通後始末 $ bracketOnError planBwith後始末forB\AB共通後始末 planAwith後始末forA\AB共通後始末
こう書けばいいです?
0829デフォルトの名無しさん2015/12/30(水) 12:39:36.95ID:5ugZQDQL
教えて君にエサをやるからこうなる。 だからあれほどスルーといったのにな。
0830デフォルトの名無しさん2015/12/30(水) 17:44:17.38ID:SM7sbKvE
>>828
bracketOnError の第1引数で例外が発生すれば、
その例外はそのまま bracketOnError の外に伝わります。

このことは、>>825 で挙げたソースが読めなくても、
自分で実験して確認できます。
実際に第1引数で適当なが例外を発生させてみれば良いです。

「こう書けばいいです?」の部分は何を言いたいのかよく分かりません。
まずは落ち着いてください。
全角のバックスラッシュは何を意味するのわかりませんし、
そもそも btrcket や bracketInError の第1引数は第3引数よりも先に実行されます。
そこに後始末処理を書いてはいけません。

何を言いたいのかは分かりませんが、しかしこれも実験で簡単に確認できるはずです。
どちらの関数も引数はすべて IO モナドなので、print を適当に挟んで実行順などを調べられます。

質問の前に、まずは自分でやってみてください。
0831デフォルトの名無しさん2015/12/31(木) 07:48:53.39ID:qqIJWikB
>>827
結論としてbracketOnErrorとbracketは代替可能ですよね。

ちなみ>>828は私じゃないのでw
0832デフォルトの名無しさん2015/12/31(木) 10:26:45.78ID:W7OP38Mu
>>831
おそらく、あなたの期待している処理に関してだけ言えば、両者は代替可能だと言ってしまっても、
実用上それほど間違っていはないと思われます。

歯切れが悪い言い方で申し訳ないです。
というのも、正確に言えば両者は代替できない(と思う)からです。
>>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
>>831
すいません、>>832 で外部例外と言いましたが、言葉が間違っていました。

正しくは「非同期例外」です。
0834デフォルトの名無しさん2016/01/02(土) 10:40:11.71ID:GEI8yUNi
persistent-sqlite パッケージの接続用関数のどれを使っても、
データベース名に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:yZAYApNA
これが関数型界隈の人間は冷たいの正体か…
0837デフォルトの名無しさん2016/01/02(土) 14:10:02.21ID:3O/U03ws
「名前そのままのファイル」が作られるんだから仕様だろ
URIを解釈せずにそのままファイル名にする、というのは
きちんと意味のある方針
0838デフォルトの名無しさん2016/01/02(土) 14:32:31.40ID:GEI8yUNi
Sqliteの仕様としてURIが使え、インメモリで名前が使えるよ。
SqliteのC言語ライブラリでも、それをラップした他言語ライブラリでも、
Haskell の sqluie-simple でも問題なく仕様通りの使い方ができる。

だから、persistent-sqlite で使えないのが不思議なんだよ。

で、単に persistent-sqlite のバグなのか、
このライブラリに限りSqliteの仕様に反することが明文化されているのか、
それとも俺の使い方が悪い(どこかで設定できる?)のか、
と質問したんだが、どうだろうか。


>>837
それがドキュメントに書かれていれば、なるほどと思う。
一応俺なりにドキュメントを精読したつもりなんだが、見当たらない。
0839デフォルトの名無しさん2016/01/02(土) 14:47:45.97ID:Z1J/2moe
関数型の切り口で語る奴はだいたいKだと思ってる
0840デフォルトの名無しさん2016/01/02(土) 15:28:52.47ID:3O/U03ws
そもそもDatabase.Persist.Sql (withSqlConn) がそういう動作をする

persistentのバックエンドのひとつとしてsqliteが使えるというだけで、
sqliteの機能をまるのまま提供する義理があるわけじゃないからな
sqlite特有の仕様は全部切り捨ててるんじゃね
0841デフォルトの名無しさん2016/01/02(土) 15:48:49.70ID:GEI8yUNi
じゃあ、Sqlite の大きな特徴のひとつであるインメモリはなんで使えるんだ?

withSqliteConn ":memory:" は普通に使えてるんだが。
0842デフォルトの名無しさん2016/01/02(土) 15:51:15.87ID:uD+WV8wT
毛の壁うざいな
0843デフォルトの名無しさん2016/01/02(土) 16:02:15.60ID:QMorx62m
もうブームは去った感じだけど、まだ元気にどこかで妄言吐き散らかしてるんだろうか
0844デフォルトの名無しさん2016/01/02(土) 17:45:42.15ID:qABI05dX
>>836
これ質問されてんじゃなくてURI使わせろって命令されてるだけだから
命令を無視されても冷たいとはいえない
0845デフォルトの名無しさん2016/01/02(土) 23:33:46.23ID:GEI8yUNi
誰も知らないようだから、GitHub yessodweb/persistent の issues にあげてみるよ。
0846デフォルトの名無しさん2016/01/03(日) 18:32:26.80ID:6l5P920y
C言語ライブラリでも the URI filename capability is disabled by default
って書いてあるね
0847デフォルトの名無しさん2016/01/03(日) 20:43:59.44ID:LkkfiKGZ
>>846
そう、俺も GitHub の issues に投稿してから気づいた。
自分で Sqlite のサイトのリンクまで載せておきながらね。

すぐにゴメンナサイをしたけど、かなり恥ずかしいヤツになってしまった。
みんなにもゴメン、完全に俺の早とちりだった。

ただ、URI解釈機能の追加には作者も乗ってくれたみたい。
0848デフォルトの名無しさん2016/01/03(日) 20:52:19.95ID:6l5P920y
sqlite-simple は direct-sqlite に依存する
direct-sqlite.cabal の cc-options の所には -DSQLITE_USE_URI と書いてある

persistent-sqlite.cabal の cc-options にはそれがない
0849デフォルトの名無しさん2016/01/04(月) 01:57:02.65ID:sSvUYJHW
年始早々お邪魔します。
stylish haskellをインストールしてみたのですが
IDEの表示動作には何ら変化が無く
これを導入する事によって何が嬉しいのか解りません。
もし解説してるサイト等を知ってましたら教えて下さい。
0850デフォルトの名無しさん2016/01/04(月) 13:18:37.61ID:FL15/iqU
cabal test の結果を色分け表示するツールって無いかな?
0851デフォルトの名無しさん2016/01/04(月) 19:09:54.69ID:26vt+6G2
>>849
前Vimから使ってたけど単なるコードの整形ツールだよ?そういうことではなく?
08528492016/01/04(月) 22:46:13.38ID:sSvUYJHW
>>849
ありがとうございます。
単なるコードの整形ツールねのですね。
ハスケルはlet式の中で改行された名前の先頭位置によって
鰓が出たりするので重宝できるかもしれません。
0853デフォルトの名無しさん2016/01/05(火) 01:43:11.91ID:e1QBvQbc
使い方どころか何のためのツールかも知らないでインストールしたのか
このスレに質問しにくる奴は総じてどこかおかしいな
まあ、まともな人間ならStack OverflowやTwitterで答えてもらってるからそれもそうか
0854デフォルトの名無しさん2016/01/05(火) 05:45:19.85ID:cUqgoqn1
総じてどこかおかしい奴用Haskell質問スレ設立の機運が高まる
0855デフォルトの名無しさん2016/01/05(火) 08:41:47.32ID:ikPXVG/Y
総じてっていうか英語読めない/読まない人たちだな
0856デフォルトの名無しさん2016/01/05(火) 08:45:29.10ID:DJzEWfiC
2chに書けばお人好しが教えてくれると思っている
0857デフォルトの名無しさん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
>>859
意思疎通する気があるなら安価ぐらい付けたらどうかな
0861デフォルトの名無しさん2016/01/05(火) 18:05:51.34ID:4ajyxAFr
>>860
意思疎通する気は全くありませんでした
謹んでお詫び申し上げます
0862デフォルトの名無しさん2016/01/05(火) 19:32:18.30ID:e1QBvQbc
>>861
年始早々お邪魔しにきたわけだ、なるほど
0863デフォルトの名無しさん2016/01/05(火) 20:11:41.05ID:55Fn/q1S
『話せば分かる』なんて大ウソ!
正解は『離せば分かつ』
毛の壁

朦朧健
0864デフォルトの名無しさん2016/01/05(火) 21:26:43.07ID:4ajyxAFr
>>862
こちらの意図も伝わっていなかったようですが
それも含めて意思疎通する気が無い故仕方がないことと考えております
年始の戯れにお付き合いいただきありがとうございます
0865デフォルトの名無しさん2016/01/05(火) 21:45:24.66ID:HIgjIRNU
AdventCalender書いてない奴が居るせいでHaskellがランキングから外れてて草
総ストック数はそこそこあったのに
0866デフォルトの名無しさん2016/01/05(火) 22:44:55.92ID:+VJkCmAJ
ghc のコンパイルエラーの文って、いつも最初の数行しか役に立たないんだけど、
後ろの方の文が役に立った人っている?

たとえば、適当なファイルに次の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
総じてではなく丁寧語で書いてる奴約1名が本当に頭のおかしい奴ってだけだね
>>819と同じ奴っぽいけど一瞬でサイコパスだと見ぬいた>>820何者なんだ…
0868デフォルトの名無しさん2016/01/06(水) 07:55:50.59ID:GReAeoH6
>>866
まあとりあえず言葉通りの意味がわかれば十分じゃないか
逆に何を言われても物足りないと思えば、言葉が何の役にも立たないのは当然だ
0869デフォルトの名無しさん2016/01/09(土) 08:12:25.88ID:nN+q48Tl
諸君、議論したまえ
0870デフォルトの名無しさん2016/01/09(土) 09:51:25.24ID:j1jPLBvu
保守
0871デフォルトの名無しさん2016/01/09(土) 10:19:50.09ID:BmIw5AdJ
それはHaskellのコードをまともに書いたことがないからというだけでは……
似たような型の関数を長大に連鎖してる箇所でそれがなかったら手間もいいとこ
0872デフォルトの名無しさん2016/01/09(土) 10:22:14.19ID:BmIw5AdJ
あ、しばしば予想外の箇所が示されるってのはあるけどな。
型推論が最終的に失敗した箇所とエンバグした箇所が違うことはわりとある
0873デフォルトの名無しさん2016/01/09(土) 17:15:15.57ID:CcDze1VM
>>871
まともかどうかは分からんが、
確かに似たような型の関数を長大に連鎖するのは意図的に避けてる。
やっぱ、そこから逃げてちゃマズいか。

それがなかったらの「それ」が何を指しているのか曖昧だが、
最後の In the first argument of の件か?
それなら、エラーが検出された場所(行と列)が最初に示されるだろ。
それで分かるよね。
0874デフォルトの名無しさん2016/01/10(日) 11:57:12.49ID:wsJCRVkv
ghcの仕事は辻褄が合わないコードを探すことだ
役に立たないコードを探すことではない
役に立つなんて下手に断言して辻褄が合わなくなるより何も言わない方がましだ
0875デフォルトの名無しさん2016/01/11(月) 22:38:48.37ID:SN+G+m/4
毛の壁みたいな奴いるな
0876デフォルトの名無しさん2016/01/12(火) 00:48:54.32ID:cUmJzvMy
ghcをメイクするにはghcが要るんですか?
0877デフォルトの名無しさん2016/01/12(火) 01:06:03.30ID:KMQpPdRt
>>876
要ります
CコンパイラがCで書かれてるのと一緒です
0878デフォルトの名無しさん2016/01/12(火) 08:27:15.11ID:9LHzGZEP
バグったghcを直すためにバグったghcを使うんだよな…
0879デフォルトの名無しさん2016/01/12(火) 11:56:28.50ID:j0Q/nFNr
そういう場合、バグっていなかった最後のバージョンを特定して、それの次のバージョンのソースコード見直してリメイクして次のバージョンをリメイクしてって辿り直すんですか?
0880デフォルトの名無しさん2016/01/12(火) 12:09:55.19ID:ifvCKaAg
もしIDE使ったらエディタのバグやビルドツールのバグも不可避になるのかな
0881デフォルトの名無しさん2016/01/12(火) 19:29:52.54ID:gQfF03pT
Haskellは関数型言語ですから、コンパイルが通った時にはバグが無いことを保証されています。
従ってバグを持つghcは原理的に存在しません。
0882デフォルトの名無しさん2016/01/12(火) 20:54:15.23ID:+sXl4caO
でもHaskellコンパイラ第一号はC/C++なんかで書かれたんでしょ?
そこで埋め込まれた可能性がある
0883デフォルトの名無しさん2016/01/12(火) 20:58:13.20ID:RBb1nE9O
保証されてるのは型の整合性だけだろ
0884デフォルトの名無しさん2016/01/12(火) 22:04:04.84ID:KMQpPdRt
>>879
大抵は新規の拡張とか高度な最適化に関するエンバグなので
それを用いていないGHCを-O1程度でコンパイルするぶんには無問題
0885デフォルトの名無しさん2016/01/12(火) 22:05:51.78ID:KMQpPdRt
あ、よく考えたらそうでもないか。隣家廻りとかもよく壊れてる気がしてきた。
だが、まあ別にGHC自身を普通にセルフコンパイルするのに支障はない。
0886デフォルトの名無しさん2016/01/12(火) 22:11:51.98ID:KMQpPdRt
>>882
Lazy MLという純粋かつ遅延評価なML方言で
GHCのプロトタイプが書かれて、それを使って
ブートストラップしたということらしい。
0887デフォルトの名無しさん2016/01/13(水) 07:57:01.82ID:oCkaPOn/
コンパイルの最終ラインはCでしょ、なあに少しくらいバグが入っていた方が気付けになる
0888デフォルトの名無しさん2016/01/13(水) 20:45:24.32ID:w9GbZ+Jw
Haskellは関数型言語なので並列性が最強です。
メニーコアの時代には全てのソフトウェアがHaskellで書かれるでしょう。
0889デフォルトの名無しさん2016/01/13(水) 21:08:44.44ID:3fMyO6UP
せやろか
0890デフォルトの名無しさん2016/01/13(水) 21:26:21.50ID:4r91zTEF
なるわけない、適材適所だよ
Haskell は強力な原語だけど万能でもなんでもない
0891デフォルトの名無しさん2016/01/13(水) 22:42:46.22ID:0P99nKsm
>>888
rtsがcmmみたいなクソ言語つこうとる間は移植性皆無だし
Haskellがメニーコア時代を制するとか全くの寝言。
0892デフォルトの名無しさん2016/01/13(水) 23:17:52.63ID:J+RphLvP
シングルコア、メニー言語の時代がずっと続いたから
なんでも反対する人に未来を予想させたらメニーコア単一言語になる
0893デフォルトの名無しさん2016/01/14(木) 08:43:44.75ID:PREROaaL
cmmの移植性が皆無#とは

ともあれもうLLVM化がほぼ完了してるんでなあ
0894デフォルトの名無しさん2016/01/14(木) 21:36:49.38ID:lc/juWNa
メニーコア時代のプロセッサはHaskellのために作られます。
従って移植性は必要ありません。
また、Haskellに対して最大の最適化がかけられるので、ただでさえ世界最高速のHaskellが
更に速くなります。
0895デフォルトの名無しさん2016/01/14(木) 21:41:27.88ID:lc/juWNa
スーパーコンピューター京は、当初Cで書かれたジョブを投入していましたが、
あまりにも遅く実力を発揮できなかったそうです。
たまたまHaskellで書かれたコードを実行したところ素直にスケールし、同等のCプログラムに比べて
一万倍以上の速度をたたき出したそうです。
今では、京で実行されるプログラムの8割以上がHaskellで書かれるそうです。
この話を聞いた時、私はメニーコア時代にはHaskell以外すべて淘汰されると確信しました。
0896デフォルトの名無しさん2016/01/14(木) 22:16:56.74ID:cBi4ATG+
@各位 触るな
0897デフォルトの名無しさん2016/01/14(木) 22:54:04.38ID:o0uc+UVB
しれっとフォートラン無視されてて草
0898デフォルトの名無しさん2016/01/16(土) 11:31:35.21ID:uAWxWNtS
メモリさえあれば無限に近い桁数の計算ができるCOBOLがさいつよだって銀行の資料室窓際のおじいちゃんが泣きながらいってた
0899デフォルトの名無しさん2016/01/16(土) 13:52:30.64ID:B2ptzm1e
sparc向けのコード吐けるhaskellコンパイラって存在するの?
0900デフォルトの名無しさん2016/01/16(土) 17:47:04.65ID:KeKHWyn2
>>899
つくればあるよ
0901デフォルトの名無しさん2016/01/16(土) 17:58:15.76ID:0llXe6dZ
さすがにその回答はないわ
0902デフォルトの名無しさん2016/01/16(土) 18:02:56.95ID:KeKHWyn2
GHCのサイトになければないに決まってるんだし、
こういうしょうもないレスを期待されてたとしか思えないんだよね。
0903デフォルトの名無しさん2016/01/16(土) 19:20:11.46ID:pNi7JFmY
>>899は反語だろ多分
0904デフォルトの名無しさん2016/01/16(土) 19:28:23.40ID:o1tKgFaF
SourceForgeやgithub、適当なコミュニティにあるかもしれないんだけどな
10年前なら公式サイト or SFにないなら諦める、だったけど今はどこで作られてるか分かったもんじゃない
0905デフォルトの名無しさん2016/01/16(土) 20:48:22.43ID:0sqpR6Ox
sparcマシン上でソースからコンパイラメイクすればよくね?
0906デフォルトの名無しさん2016/01/16(土) 20:58:56.01ID:0llXe6dZ
ターゲット上でコンパイルすればそのターゲット向け実行ファイルが作られるすばらしいコンパイラのソースをお持ちの方がいるようです
0907デフォルトの名無しさん2016/01/16(土) 21:06:56.91ID:0C9LAeXO
Cを吐くjhcとか使えばいいよ
0908デフォルトの名無しさん2016/01/16(土) 21:07:38.08ID:xP+g/trL
sparcってアーキテクチャとしてどこが違うんだっけ?
0909デフォルトの名無しさん2016/01/17(日) 13:57:54.88ID:po5BkGJ7
Haskellのレベルでもまだ機械語が透けて見える奴と見えない奴がいるね
0910デフォルトの名無しさん2016/01/17(日) 14:35:14.34ID:Nzqff/kH
Haskellなんてそれこそ透け見えちゃいけない言語だしな
元の話だが、sparcクロスコンパイルもダメなんだけか?
今どき少ないがWSの並列のためにありそうなもんだが
0911デフォルトの名無しさん2016/01/17(日) 16:43:00.23ID:snuCDPAE
京でhaskellなんていう妄言に対するただのヤジだったのに、思いの外盛り上がってし待っている
0912デフォルトの名無しさん2016/01/17(日) 16:47:33.31ID:8TKcXYcp
京はやっぱりfortranですかね
0913デフォルトの名無しさん2016/01/17(日) 18:30:04.29ID:6Xbfm/TM
>>907
あれはもう死んだでしょ
0914デフォルトの名無しさん2016/01/17(日) 19:17:09.30ID:EUfsW/B2
>>911
質問の契機が思いの外しょうもなかった

HaskellでもFortranでもどっちでも良いが京では数学者が最適化しやすい方が良いんだろうな
どっちがいいかはプログラマ上がりじゃわかんねーや
0915デフォルトの名無しさん2016/01/18(月) 07:26:30.97ID:lC5RiWYz
>>913
別に死んでないよ
ajhcがコンパイルできなくなってるのは
単にApplicativeがMonadの上に追加されたのに
追従してないだけなんで簡単に直せるよ
0916デフォルトの名無しさん2016/01/18(月) 08:10:47.49ID:z+08kDV+
死んでるじゃん
0917デフォルトの名無しさん2016/01/18(月) 08:26:38.17ID:20Rww3ua
心室細動だよ。まだ死んでない
0918デフォルトの名無しさん2016/01/18(月) 08:38:12.76ID:lC5RiWYz
その程度も自分で直せずに「死んでるじゃん」とか言ってるの……?
0919デフォルトの名無しさん2016/01/18(月) 09:44:26.78ID:2kgu3Wem
その程度の改修も公式に入らないほどにメンテが滞っているのならプロジェクトとしては死んでる、ってことだろ
0920デフォルトの名無しさん2016/01/18(月) 11:20:01.95ID:8cTkl+Hb
所詮研究のためのおもちゃなんだなあ
0921デフォルトの名無しさん2016/01/18(月) 12:55:40.37ID:tos9CkFO
じゃあ研究じゃなくて練習といえばいいだけ
練習もせずにぶっつけ本番なんてとんでもない
0922デフォルトの名無しさん2016/01/18(月) 21:36:05.75ID:JZfdalHf
>>918
Monadがどうこう以前に、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:unNXfSBy
科学技術用ってFortran?
0925デフォルトの名無しさん2016/01/19(火) 08:54:34.98ID:PSMgNBFb
fortranスレで聞け
0926デフォルトの名無しさん2016/01/19(火) 09:41:41.72ID:N1YYkuEv
研究職は基本fortran,Mathematica,mapleから選ぶ感じ
0927デフォルトの名無しさん2016/01/19(火) 09:45:48.91ID:n8RJjF56
数理ではHaskell便利なのになぁ
0928デフォルトの名無しさん2016/01/19(火) 10:42:59.62ID:n/8vNsiZ
一部のアルゴリズムの実装が簡単
0929デフォルトの名無しさん2016/01/19(火) 15:53:22.93ID:2890i3Ni
局所的なアルゴリズムじゃなくて、もっと全体を支配するような仕組み
静的型付けとかデザインパターンとか
デザインパターンはたとえば非決定性やイテレータやモナドや非同期のようなもの
0930デフォルトの名無しさん2016/01/19(火) 16:10:57.67ID:u5xt7rMo
JavaとHaskellどっちが実行速いの?
0931デフォルトの名無しさん2016/01/19(火) 18:57:29.11ID:utvSG+ku
jhcの話してんのにHaskell=おもちゃと読み取ったアホがいるらしい
0932デフォルトの名無しさん2016/01/19(火) 19:44:38.35ID:2890i3Ni
言語は二つ以上覚えるとよい
そのうち一つは玩具といわれても腹の立たない言語
C++, Java, Haskellから二つ選ぶなら重複の少ないものがよいからJavaは選ばない
0933デフォルトの名無しさん2016/01/19(火) 19:47:55.74ID:n8RJjF56
>>929含め何を言ってるのかサッパリ分からないのは関数型脳じゃないからなのか
誰か日本語で訳してくれい
0934デフォルトの名無しさん2016/01/19(火) 20:35:11.06ID:56LgXKla
誰かS式に訳して
0935デフォルトの名無しさん2016/01/19(火) 20:43:40.58ID:9Sv9SZsi
そうなんですよ。
Haskellを初めとする関数型言語は数学者にとって超絶便利。
しかしながら数学がわからない者にとっては難解なだけです。
まあ言ってみれば馬鹿には無理ってことなんですよ。
選ばれた天才が使ってこそ意味のある言語なんです。
0936デフォルトの名無しさん2016/01/19(火) 20:49:29.88ID:1uIbW5OB
K定期
0937デフォルトの名無しさん2016/01/19(火) 21:02:43.49ID:2890i3Ni
デザパタが難しいのは、コードの中にパターン名が明記されている保証がないから
明記しないから正式名称が統一されている保証もない
0938デフォルトの名無しさん2016/01/19(火) 21:34:03.32ID:n8RJjF56
>>936
なるー、翻訳thx
0939デフォルトの名無しさん2016/01/20(水) 07:09:49.67ID:xfIx1JoD
安全工学の知見?
0940デフォルトの名無しさん2016/01/20(水) 22:33:36.75ID:zBNmSvu8
>>994
makiが馬鹿にしてる「安倍首相」って現世にいる安倍首相とは別の人間なんじゃないか、って思うときがある。
なんか自分が妄想してる間抜けの具現した影を殴り倒してはしゃいでる、みたいな。
奴が書き込んでるコメントを見てると根本的な事すら理解してないことが結構ある。
0941デフォルトの名無しさん2016/01/20(水) 22:35:37.60ID:zBNmSvu8
スマン。誤爆したorz
0942デフォルトの名無しさん2016/01/21(木) 20:24:13.58ID:+cVcyY3w
バトルプログラマー☆マキの話ならココで合ってるぜ。
0943デフォルトの名無しさん2016/01/24(日) 22:23:49.70ID:1M5wgVFf
HDBCのexecute関数ってどこで実装されているのでしょうか?
Statement.hsの34行目に型宣言は見つかったのですが、実態が見つかりません。
よろしくお願いします!
0944デフォルトの名無しさん2016/01/24(日) 22:40:42.90ID:1M5wgVFf
x実態
o実体
0945デフォルトの名無しさん2016/01/24(日) 22:42:43.90ID:zJPsJxlD
>>943
Haskellは停止の必要無しにネットワークのむこう側にでさえコードを移動できるのです。
計算の途中で性能の不足を感じたら、性能の高いマシンへイメージを転送し、実行を継続します。
ですから、実装がどこにあるかは問題ではないのです。
Haskellであること、そしてHaskellを使えることが重要なのです。
Haskell使いであることに誇りを持ちましょう。
09469432016/01/24(日) 23:37:58.35ID:1M5wgVFf
すみません、意味がわかりません。
僕が知りたいのはどのソースのどの行にexecuteの実装があるかです。
よろしくお願いします。
0947デフォルトの名無しさん2016/01/25(月) 00:25:15.56ID:+Q+z/Jp3
>>943 >>946
Javaで言うところのInterfaceみたいなもんだから
各データベース管理システムごとに実装が作られてる
sqlite3ならHDBC-sqlite3に
PostgreSQLならHDBC-postgresqlに
0948デフォルトの名無しさん2016/01/25(月) 01:35:24.48ID:PuP3t03Q
>>945
こんなのに騙される奴がいるのか?
前向きな事を言っているから建設的な議論なんだろうみたいな考えの奴しか騙せないだろ

Haskellはおもちゃという批判の方がまだマシだ
0949デフォルトの名無しさん2016/01/25(月) 07:13:34.86ID:UErqEOmx
>>945
OCamlスレに帰りたまへ
09509432016/01/25(月) 15:13:40.10ID:jwcC6CKd
>>947
なるほど!ありがとうございます!
0951デフォルトの名無しさん2016/01/25(月) 20:55:40.98ID:bhSAv5/D
このスレ、まだ関数型言語ブーム時のあれこれを引きずってて笑う
0952デフォルトの名無しさん2016/01/25(月) 21:32:23.89ID:FKcC8XYP
引きずってるのは変な虫だけですから
0953デフォルトの名無しさん2016/01/25(月) 22:47:29.59ID:mYLsxkwY
一部の奴が胡乱な書き込みをしているだけで、9割が現実を見ているよ
0954デフォルトの名無しさん2016/01/26(火) 01:28:52.09ID:fLwBjkWJ
ジエネレーティブプログラミングみたいな表現力で考えると、スキャフォルドやテンプレートか、lispのマクロか、全てがs式(データ)か、haskellの遅延評価みたいな選択肢があって、
得手不得手含めて、どれが好きか勝手に選べみたいな感じ。
って、書いてて全く意味が分からないが。
0955デフォルトの名無しさん2016/01/26(火) 01:30:15.26ID:fLwBjkWJ
型の表現力は考慮してなかった。
0956デフォルトの名無しさん2016/01/26(火) 08:56:48.33ID:9z2oQ6YS
>Javaで言うところのInterfaceみたいなもんだから

こマ?
0957デフォルトの名無しさん2016/01/26(火) 09:22:36.05ID:hH8elJ+8
>>956
ざっくりしすぎだけどまあ、気持ちとしては近いんじゃね
0958デフォルトの名無しさん2016/01/27(水) 20:33:39.13ID:tY0EzgE5
わしも昔はHaskellerとして名を馳せたのじゃったがライブラリにArrowを受けてしまってな
0959デフォルトの名無しさん2016/01/28(木) 03:10:29.57ID:s/n+KVu9
後から実装できるのがinterfaceとは違う
0960デフォルトの名無しさん2016/01/28(木) 10:55:25.89ID:oB3jszBn
templateを教えたらHaskell並みに難しいのがバレるからinterfaceしか教えない現実
0961デフォルトの名無しさん2016/01/28(木) 11:11:40.25ID:tTuOSjjQ
重箱の隅をつついてどうでもいいことに華を咲かせるなぁ
言語違うんだから完全一致の概念にはならんだろ
ざっくりした気持ちで受け止めとけ
0962デフォルトの名無しさん2016/01/28(木) 19:20:31.31ID:V4rb6WtO
このスレにたどり着いたHaskell初心者が誤解してしまう恐れを取り除かないと
0963デフォルトの名無しさん2016/01/29(金) 22:37:12.50ID:V8UIRHzx
2ちゃんやってる段階で加齢臭漂うジジイしかいないこと確定なんで、意識高い(笑)Haskellワナビは
こんな痰壺のぞきに来ないやろ彡(゚)(゚)
0964デフォルトの名無しさん2016/01/30(土) 08:45:57.67ID:vmtmT3H6
3日に1回しか本気出さない怠け者でも通常の3倍以上生きてるだけでわりと有能だからね
若者に嫉妬されるのも仕方ない
0965デフォルトの名無しさん2016/01/31(日) 04:05:38.74ID:1wXDLlpg
すごいハスでさえなかなか読み切らない
できる人はあれ一日でおkなん?
0966デフォルトの名無しさん2016/01/31(日) 09:28:31.71ID:AEzrRz3r
>>965
読み切るだけなら1日か、長くても数日でできるでしょう。

でも、理解して、納得して、自分の言葉で説明できるまでには
そうとう時間かかると思います。
1ヶ月やそこらでは無理な人は多いです。

がんばってください。
0967デフォルトの名無しさん2016/01/31(日) 10:25:52.63ID:XFfzw+ki
少しでも批判的な立場から見れば、全部読み切る必要がないのは明らかだけど
批判を封じると無駄が増えていく
0968デフォルトの名無しさん2016/02/01(月) 06:10:51.64ID:zz5N12rG
鈍感力とかいってた頃は鈍感だからいくら批判されてもOKだったけど今は批判NGなのかな
0969デフォルトの名無しさん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
>>970
うんそうだね。

でも遅延評価ってのが何物なのかわかってくるとあんま驚かない。
0972デフォルトの名無しさん2016/02/01(月) 23:05:53.20ID:t43chpFC
yieldある言語だと無限要素の実現は容易だけど
それをリスト構造として扱えるって点では便利かもね
0973デフォルトの名無しさん2016/02/01(月) 23:14:58.61ID:Ciri+Qiy
遅延評価は並列処理をしようとすると驚き最小の原則を破る
0974デフォルトの名無しさん2016/02/01(月) 23:47:41.92ID:WxMLgo2+
遅延評価はノンプリエンプティブマルチタスクの親戚
タスクを遅延している

もしプリエンプティブならタスクが勝手に動き出すので無限ループを止められない
メニーコアとかも無限ループを止められない
0975デフォルトの名無しさん2016/02/02(火) 02:33:42.54ID:Dqi7KAqT
遅延のおかげでメモリ不足になってエラーになった
0976デフォルトの名無しさん2016/02/02(火) 04:43:44.40ID:xJAws4GV
ここから遅延評価の悪口を言っていこう
0977デフォルトの名無しさん2016/02/02(火) 05:59:03.44ID:JJLoMZID
どんなに素晴らしいプログラミング言語だろうと
コーディングする人間の質が悪ければ何の意味も価値もなさない

http://ideone.com/880zvK
0978デフォルトの名無しさん2016/02/02(火) 10:15:13.59ID:lBmePa6t
https://paiza.io/projects/6tuAv6EyXxyMfm4QkzUopg

まあこの程度のものを>>977みたいに書かれたらそりゃたまらんよな
0979デフォルトの名無しさん2016/02/02(火) 18:57:44.79ID:PRq2IyAN
ワンラインシェルスクリプトの俺スゲーみたいだな
悪いわけじゃないが、他者の可読性ってどうなんだ?
0980デフォルトの名無しさん2016/02/02(火) 19:35:18.50ID:uTTEQY4N
>>977
酷すぎて乾いた笑いが出るな
Sラン級糞コーダーに解答例書かせるとかPaiza大丈夫か
0981デフォルトの名無しさん2016/02/02(火) 19:43:13.89ID:24ytvjJT
このスレ、書いてないことまで透視能力使って読んでる奴いっぱいいるじゃん
それに比べたら書いてあることの可読性がどうなろうと透視するのは簡単だろ
0982デフォルトの名無しさん2016/02/02(火) 19:49:12.70ID:uTTEQY4N
検索してみたらただの2chの回答者じゃん
流石に一般人晒すのはマズイよ
0983デフォルトの名無しさん2016/02/02(火) 20:19:13.66ID:qoaDQoLB
instance Functor Tree where
fmap 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:lBmePa6t
>>983

1.つかないと型が合わないだろ

2.そもそも再帰的定義

「ある木に fmap f した結果は、根にfを適用し、葉の部分木にfmap fした木である」

が理解出来てるか?
0985デフォルトの名無しさん2016/02/02(火) 20:44:20.82ID:qoaDQoLB
>>984
>2.そもそも再帰的定義
>
>「ある木に fmap f した結果は、根にfを適用し、葉の部分木にfmap fした木である」
>
>が理解出来てるか?

すみません、理解できていないです。
なぜ葉は直接fを適用できないのでしょうか?
0986デフォルトの名無しさん2016/02/02(火) 21:14:43.83ID:lBmePa6t
>>985
たとえば整数の二分木(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
Haskellは無限ループに陥りません。
だからこそコンパイルが通ればバグが無いことを保証できるのです。
0988デフォルトの名無しさん2016/02/03(水) 00:23:47.55ID:eYCB0y5I
バグの定義からはじめようか
0989デフォルトの名無しさん2016/02/03(水) 01:05:28.09ID:pvHSiWBf
>>985
1. fが受け取るのは[xの型] (xは[Tree型]じゃない)
2. left と rightは[Tree型]
3. [Tree型]とfの仲介がfmap

おわかり?
0990デフォルトの名無しさん2016/02/03(水) 03:37:57.16ID:mzFRVKkI
ideoneでhaskellのサンプルコードが無限ループじゃなかったっけ?
0991デフォルトの名無しさん2016/02/03(水) 04:12:58.04ID:OD3iNzjF
Androidでお手軽にHaskellできるアプリ誰か頼む。C4droid並の品質で。ソースコードはAndroidのVimTouchで書くからIDEは要らないや
09929852016/02/03(水) 11:15:50.69ID:B67PXnHg
>>986, 989
理解できました!
わかりやすい説明ありがとうございます!
0993デフォルトの名無しさん2016/02/03(水) 13:15:08.68ID:KiXDjJxB
タブレットでコーディングする需要があるのか…
0994デフォルトの名無しさん2016/02/03(水) 13:41:55.87ID:vZagwsW/
arm向けのコード吐けるhaskellコンパイラって存在するの?
と言ってみる
0995デフォルトの名無しさん2016/02/03(水) 13:47:52.96ID:WaqhOfMD
ARMをターゲットにしたクロスコンパイラなGHCは普通に存在する

そのGHCでGHC自体をARM向けにコンパイルすれば
ARM計算機上でHaskell使った開発ができるはず
0996デフォルトの名無しさん2016/02/03(水) 14:04:22.91ID:uEOUJl1K
むしろプラットフォームに依存しないようなソフトしか書けないやろ
0997デフォルトの名無しさん2016/02/03(水) 17:44:14.30ID:vZagwsW/
>>899に被せただけで特に意味はなかったが、クロスコンパイル環境は普通にあるのな
Androidなら誰か暇人が作ってそうだけど、あっても古くてメンテされてないかな

>>996
そのコメントは流石に的が外れすぎてる
0998デフォルトの名無しさん2016/02/03(水) 20:41:29.18ID:WaqhOfMD
というかそもそもGHCはLLVMに対応してるからな
0999デフォルトの名無しさん2016/02/03(水) 20:54:22.37ID:jdFVwRiR
>>993
キッズが空き時間にスマホにBluetoothキーボード繋いでCodeForcesやるだろ
1000デフォルトの名無しさん2016/02/03(水) 22:28:22.77ID:SRrG8qzq
トイプログラムで遊んでないでアプリ作ろうぜ
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
10021002Over 1000Thread
2ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 2ちゃんねる専用ブラウザからの広告除去
★ 2ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
http://premium.2ch.net/
http://pink-chan-store.myshopify.com/
レス数が1000を超えています。これ以上書き込みはできません。