5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

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

1 :岡部メモリリーク健:2015/07/14(火) 19:27:09.01 ID: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/

2 :岡部メモリリーク健:2015/07/14(火) 19:28:16.17 ID: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

3 :岡部メモリリーク健:2015/07/14(火) 19:30:31.82 ID: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/

4 :岡部メモリリーク健:2015/07/14(火) 19:31:05.70 ID: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

5 :デフォルトの名無しさん:2015/07/14(火) 20:28:01.97 ID:0RtCvlur
匿名掲示板に
「児童ポルノ単純所持で捕まったら無罪だったとしても社会的に終わるぞ」
という脅し文句を連呼してる人がいる

確か日本IBM会長が痴漢で捕まった時に騒いでたの2chの一部だけで
本当に痴漢で捕まったと思ってる人がほとんどいなかった記憶あるのだが

6 :デフォルトの名無しさん:2015/07/14(火) 21:11:22.75 ID:i6nYqHOg
AIZU ONLINE JUDGE 競技プログラミング
http://judge.u-aizu.ac.jp/onlinejudge/index.jsp

Haskellで書けるようになった

7 :デフォルトの名無しさん:2015/07/14(火) 21:59:12.35 ID:rJOXcg+a
>>6
うおおお!!朗報だありがとう!!!

8 :デフォルトの名無しさん:2015/07/14(火) 22:54:43.45 ID:zZLZaIbg
このスレが本スレだな。例のAAが無いと盛り上がらん。

9 :デフォルトの名無しさん:2015/07/14(火) 23:45:50.85 ID:9bHYU59E
>>6
うおおお!やったぜ。

10 :デフォルトの名無しさん:2015/07/15(水) 08:14:27.60 ID:4Hwk0PWM
命令型でないとrangeもmapも書けないのは海外では常識。
そのことは海外のサイト見れば明らか。権威のある人物ならみんな知ってる

11 :デフォルトの名無しさん:2015/07/15(水) 10:03:03.19 ID:YlUThGkU
>>10
それはわからんのよ。
バイオコンピュータによって可能になるかもしれんしな。

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

バイオコンピュータが目の前に来てからHaskellを使おうと考えるのが普通の人だわな。
まあその時には、Haskellは無くなってるだろけどな。

12 :デフォルトの名無しさん:2015/07/15(水) 10:12:30.07 ID:7IHYvImg
http://web.archive.org/web/20150715011113/http://qiita.com/nonstarter/items/2763f5d85f2b8df3b18b

13 :デフォルトの名無しさん:2015/07/15(水) 10:14:47.29 ID: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

基本中の基本です。

14 :デフォルトの名無しさん:2015/07/15(水) 12:17:03.32 ID:xvlXRMcz
UCLA卒業と、岡部健(kenokabe・毛の壁)を語ろう [転載禁止]©2ch.net
http://hello.2ch.net/test/read.cgi/joke/1436928203/

15 :デフォルトの名無しさん:2015/07/15(水) 12:19:15.92 ID:K1aSLVoR
>>14
もう許してやれよ

16 :デフォルトの名無しさん:2015/07/15(水) 15:43:52.14 ID:D9jiOfI+
岡部健がQiitaのコメント欄に出没してるぞ〜(歓喜)

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

今度の名前はqiitapostの模様

17 :デフォルトの名無しさん:2015/07/15(水) 15:53:29.88 ID:LpfZNZ91
とうとう荒らしに墜ちたか

18 :デフォルトの名無しさん:2015/07/15(水) 19:19:40.86 ID:UBeVoT4I
教育者の端くれなのに、やることが小さいね

19 :デフォルトの名無しさん:2015/07/15(水) 22:55:42.93 ID:d/UN4JRs
>>1にこんな品のないAAを貼り付けるのはよくない
こんなスレ、僕は認めないからな

20 :デフォルトの名無しさん:2015/07/16(木) 04:10:56.66 ID:KHTiVbh0
         ,.-―: ̄`ー::::::::::、
       /::::::::::::.::::::::::::::::::::::::::::`::、、
      /::::::::::::::::::::::::::::::::::::::::::::::::::::::`、
      l::::::::::::::::::::::::::::::::::::::::;':l:::::::::::\::l
      l:::::::::::::::::::::::::::::::::,,::::::::;-,:,::::::::::::::::l
     l::::::::::::::::,_,.::::,';::::::;:::::: :: l ::::::::::::::l
     l::::::::::/-/:::/-ニ,.::::/=,./::::::::::l
     ヽ:::: ´、ひ> ;:  l .<ひ>'  、::::::::/
    ヽ:::::    ̄ .)::;  l  ̄   l::::/    
     、:::::..   /:::; .,-、     l:::/、
    ,―::::::::  ゝヽ- ー' 、    l::/,、ヽ
     l,、,、,,:、:: / ,--、,-.、_ l    /::::::,、,、l
   l,、,、,、,、,、::、 `ー ̄-'   /:::::::::::,、,、l
   l,、,、,、,、,、,、::ヽ      /::::::::、,、,、,、,ノ:\

こんにちは。
私は現在、関数型プログラミングを勉強している者で、まさにこちらのスレで批評されている書籍を読んで、思考を切り替えるためのコツを分かり易く学べたと考えている者です。
様々な視点から学び、理解を深めたいと考えており、こちらのスレも目を通し、関心を持って注目しております。

21 :デフォルトの名無しさん:2015/07/16(木) 18:10:05.00 ID:GJpPkx9w
mapは命令型でしか書けない。

22 :デフォルトの名無しさん:2015/07/16(木) 20:22:23.87 ID:r83nWszG
おい、Codepadのようなものを「エミュレーター」と解釈できる、なんらかの要素があるとしたらどのあたりなんだ?

23 :デフォルトの名無しさん:2015/07/17(金) 09:35:07.66 ID:tmwhQ/Tf
モナドって一言で言うとなんなん?

24 :デフォルトの名無しさん:2015/07/17(金) 10:24:36.36 ID:F5MI8UaQ
世界線

25 :デフォルトの名無しさん:2015/07/17(金) 10:36:26.09 ID:MFPhKAxg
>>23
class Monad m where
(>>=) :: m a -> (a -> m b) -> m b
return :: a -> m a

っていう関数が定義されていてモナド則を満たすもの

26 :デフォルトの名無しさん:2015/07/17(金) 11:26:02.98 ID:6p5xRLuM
>>25
なるほど
やっぱり岡部健の間違いか。

27 :デフォルトの名無しさん:2015/07/17(金) 13:59:02.04 ID:ZQ7d1iCZ
foldでmapは書けるが、岡部健はその事と間違えてたんだろうな

28 :デフォルトの名無しさん:2015/07/17(金) 18:24:18.12 ID:xMYrjQca
>>25
一言で言うとなんなん?言うてるやん
それともほんとは分かってないから言えないとか?

29 :デフォルトの名無しさん:2015/07/17(金) 20:05:48.09 ID:OMUEmUCh
なんやこら調子乗んなしばくど

30 :デフォルトの名無しさん:2015/07/17(金) 22:36:24.63 ID:5l1JDgrx
>>28
「一言」って、どれくらいの長さまで認めてくれるの?

31 :デフォルトの名無しさん:2015/07/17(金) 23:01:29.55 ID:MFPhKAxg
>>28
自己関手の圏におけるモノイド対象

32 :デフォルトの名無しさん:2015/07/18(土) 00:36:23.29 ID:74tlor8C
>>23,28
順次、反復、分岐のうち分岐を可能にする構造[1]
という説明であれば一般的なプログラマは理解できるはず

[1] http://d.hatena.ne.jp/kazu-yamamoto/20150128/1422413182

33 :デフォルトの名無しさん:2015/07/18(土) 03:20:25.11 ID:uyPUGWQb
一言で一言でって、一言で言えたら定義がそもそもそうなってるわ!
一言でいっちゃうと必ず嘘を含むので言葉尻をとらえる重箱の隅をつつく言葉遊び勢を気にしておいそれと一言で言えないんだよ
だから一言で言って欲しいなら、『厳密でなく細かな間違いを含んだ私見でいいので、大雑把で直感的に言い直すとどんな風にとらえておけば当たらずとも遠からずですか?』って訊けよな

34 :デフォルトの名無しさん:2015/07/18(土) 03:26:05.93 ID:gfB+6PlW
>>32
その説明、ずっと分からなかったんだけど、反復を実現するのはApplicativeなの?
単に関数を再帰的に定義すればいいんじゃないの?

35 :デフォルトの名無しさん:2015/07/18(土) 09:51:48.04 ID:H0ZPg8aJ
>>31 じゃなくて
>>32
そうそうこういうのがいいんだが、
モナドって、命令型でふつうにできてることを関数型の中でもやりたいってことでOK?
そうすると、IOはいいけどMaybeやListが置いてけぼりになるんじゃないの?

36 :デフォルトの名無しさん:2015/07/18(土) 11:55:58.35 ID:wQVOOXnd
Maybe/Eitherならエラー時の処理、リストならリスト内包表記におけるフィルター処理が分岐にあたる
他のモナドだと直感的に「分岐」とはみなせないような例もあるかもしれないけど
そのモナドなりの意味で分岐を解釈できるはず

Functorを箱とみなすか文脈とみなすかみたいな話と同じで
一言で言おうとしたときに具体例を選べばどうしたって他で無理のある解釈が出てくるわけで
そこを突っ込みたかったら結局「定義にもどれ」ということになる

37 :デフォルトの名無しさん:2015/07/18(土) 12:31:05.33 ID:H0ZPg8aJ
>>36
ああそう、やっぱり>>32はあくまで初心者向けの通俗的解釈に過ぎないわけね。
また振り出しにもどったわw
> そこを突っ込みたかったら結局「定義にもどれ」ということになる
突っ込みたいわけじゃないんだが。。。
「定義にもどれ」ってのは、一見もっともに聞こえるがダメダメよw
「なんでそんな定義なの?」というのが大事なわけで。
それに定義というなら、『Monad は、単なる型クラスの一つで、それ以上でも
それ以下でもありません』でほんとおしまいなんだし

38 :デフォルトの名無しさん:2015/07/18(土) 12:36:02.25 ID:v0EKlLM2
皆様方
以降、スルーでよろしくおながいします

39 :デフォルトの名無しさん:2015/07/18(土) 13:51:37.96 ID:0Oe5sxAP
モナド変換子が絡むと一気にむずかしくなるなぁ
StateTとIOの複合は頻出っぽいから頑張って身につけたい
なにか参考になるサンプルとかないでしょうか

40 :デフォルトの名無しさん:2015/07/18(土) 14:56:48.04 ID:BTDuC5lZ
https://gist.github.com/anonymous/1944f34703bcb63131d8


これはどちらが正しいんだ?

41 : ◆Ww2pZaKGaW0T :2015/07/18(土) 15:17:02.40 ID:UfuhnolG
最初に無があった
無は有を生んだ
これが全ての真理

42 :デフォルトの名無しさん:2015/07/18(土) 19:49:11.57 ID:sxZpdZw2
>>40
ちゃんと見て無いけど、
どっちもどっちな感じ…

43 :デフォルトの名無しさん:2015/07/18(土) 20:30:55.47 ID: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のコードが悪いと思うが。

44 :デフォルトの名無しさん:2015/07/18(土) 21:59:10.40 ID:+ygt6sr1
>>37
うんじゃぁ これも通俗的な話だけど
(>>=) :: m a -> (a -> m b) -> m b
って関数が凄い便利なんだよ scalaだとflatMapなんていったりするけど
monadの力って (>>=) って関数が定義されてる mっていうデータ構造(文脈だの箱だの言われるが)
これをhaskellは副作用を扱うのに使ってるけど
副作用を普通に扱える言語でもmaybeやfutureみたいにエラー時の処理や非同期計算に便利なんだ
もちろん上は全然正確な話ではない

45 :デフォルトの名無しさん:2015/07/18(土) 22:45:41.76 ID:obUySxxZ
>>43
これに関してはメモリリークの件でコード改竄を指摘されて
「お前らだってコード改竄してるじゃないか!」
って言いたいんだろうなぁと思う。

事実関係よりも心の平安を保てるかどうかで発言してるっぽいし。

46 :デフォルトの名無しさん:2015/07/19(日) 00:11:41.45 ID:g7CK7gj2
main = do
print "Hello"

これをghc hello.hsすると生成された実行ファイルのサイズが1MB超えるんですが
こんなものですか?
もっと大量のコードが書けるほどのレベルではないんですが、500行ぐらい書いたらサイズが1GB言っちゃうんじゃないかと心配になりました

47 :デフォルトの名無しさん:2015/07/19(日) 00:36:25.80 ID:Nq0FmX+u
ランタイムの分がでかいからな、なんで線形に増加すると思ったのか

48 :デフォルトの名無しさん:2015/07/19(日) 01:43:02.12 ID:csGsF3Kw
qtライブラリを使えば、1mbぐらい気にならなくなるじゃろ。

49 :デフォルトの名無しさん:2015/07/19(日) 07:26:20.64 ID:au0Vcvuj
>>46
jhcを使うとランタイムがないぶんそれだけ小さくなるというのを
岡部究(master_q)さんが一時期熱心に調べてたな。

50 :デフォルトの名無しさん:2015/07/19(日) 08:05:11.94 ID:BgJ/88od
>>44 はかなり良い説明だと感じた。
一面を捉えた正確な説明だと思いますよ。

51 :デフォルトの名無しさん:2015/07/19(日) 10:16:27.53 ID:ZQ+VxBJa
>>44
> (>>=) :: m a -> (a -> m b) -> m b
うん、これは、たしかに
(a -> b) -> (m a -> mb)
m(a -> b) -> (ma -> mb)
に比べるとやや崩れているところな。そこが人間にとっていいってことか?
だが、IOからMaybeや非決定性まであまりに無節操に広く適用されるところが、
かえって、実はナンセンスなんじゃないの?と思ってしまうな

52 :デフォルトの名無しさん:2015/07/19(日) 10:57:36.17 ID:XE+dCI5P
取り敢えず初心者にモナドってなんなの?って訊かれたら、オレオレDSLのフレームワークって言っときゃ良いんでしょ?

53 :デフォルトの名無しさん:2015/07/19(日) 13:47:54.47 ID:I4MCl2HA
モノイド大将がボス

54 :デフォルトの名無しさん:2015/07/19(日) 15:46:09.62 ID:I1Wicbx/
>>52 その説明いつも全然意味不明

55 :デフォルトの名無しさん:2015/07/19(日) 16:48:46.04 ID:OqblcV5w
>>51
まず最初に、モナドと全く関係のない言語が、副作用を無節操に広く適用した
そうして無節操に広がったIOの適用範囲の一部をIOではなくMaybe等で書き直している
Maybeが広くなった分だけIOが狭くなるのでモナド全体の広さは変わらない

56 :デフォルトの名無しさん:2015/07/19(日) 17:14:36.93 ID:kvcDaKH1
>>48
QtでもさすがにHello出力だけで1MB超えは無い。

57 :デフォルトの名無しさん:2015/07/19(日) 18:26:20.48 ID:ZQ+VxBJa
>>55
> まず最初に、・・・副作用を無節操に広く適用した
> IOの適用範囲の一部をIOではなくMaybe等で書き直している
> Maybeが広くなった分だけIOが狭くなる
上の3行の一つ一つが意味分からん。
もう少し補足してくれんか

58 :デフォルトの名無しさん:2015/07/19(日) 19:00:07.54 ID:OqblcV5w
>>57
分からんなら後回しにして比較的分かりやすいところを先に解決すればいいと思う
分からんところに拘るのは効率が悪い

59 :デフォルトの名無しさん:2015/07/19(日) 19:13:47.34 ID:ZQ+VxBJa
>>58
例えば教科書に出てくるなにかの概念が分からんというようなことじゃなて、
あなたが>>55に書いている文が、あれじゃ意味不明と言ってるんだが。
副作用を無節操に広く適用ってどういうこと?
そしてIOとMaybeしか出てこんがモナドはこの二つだけじゃないし

60 :デフォルトの名無しさん:2015/07/19(日) 19:32:23.42 ID:OqblcV5w
>>59
対案を出せばいいと思う

61 :デフォルトの名無しさん:2015/07/19(日) 21:26:06.98 ID:BgJ/88od
>>51 のような疑問は、Applicative と Monad のパワーの違いとは?ということであり、
それについてはすごいHaskell に平易な解説があったと思う。

要するに>>= があるおかげで、 モナドから取り出した値を見て、次に行う副作用を作れるってことだ。

62 :デフォルトの名無しさん:2015/07/19(日) 23:30:44.39 ID:ZQ+VxBJa
>>60
対案出せと言われましても意味分からんからできません、なんよw わからへん?

>>61
> 要するに>>= があるおかげで、 モナドから取り出した値を見て、次に行う副作用を作れる
それって、 (>>=) :: m a -> (a -> m b) -> m b  言うてるだけやし

63 :デフォルトの名無しさん:2015/07/19(日) 23:34:09.77 ID:bed99W+w
実際monadとapplicativeどっちも使える状況なら
applicative使ったほうがいいよって言われてね?

64 :デフォルトの名無しさん:2015/07/20(月) 00:20:18.66 ID:0TG+/+/W
和書のどれかに載ってた床下配線が一言だと一番分かりやすいと思った

65 :デフォルトの名無しさん:2015/07/20(月) 00:27:41.08 ID:wg3sT89+
>>61
取り出すところまでは同じだが、取り出した後でできることが違う
m a -> (a -> b) -> m b
m a -> (a -> m b) -> m b
-- 超えられない壁 --
m a -> (a -> b) -> b

66 :デフォルトの名無しさん:2015/07/20(月) 02:08:57.73 ID:u/oPh9jr
つか正直>>51が何言ってるかわからん

>>63
mapでできることをfoldや再帰でやらないってのと同じ発想だね

67 :デフォルトの名無しさん:2015/07/20(月) 09:29:20.00 ID:c+ACSEXZ
>>64
箱やコンテナもそうだがそういう物理的比喩は所詮本物じゃない

>>65
超えられないのか?

68 :デフォルトの名無しさん:2015/07/20(月) 09:57:42.74 ID:wg3sT89+
>>67
IOが超えられない
モナドクラスというのはIOと同じクラスになりたいやつが集まってるから

69 :デフォルトの名無しさん:2015/07/20(月) 21:32:15.43 ID: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"
とやってもうまく取り出せません。。

70 :デフォルトの名無しさん:2015/07/20(月) 21:52:25.58 ID:WnNA5LDR
そりゃ型あわないんだから出来ないよそんなこと

71 :デフォルトの名無しさん:2015/07/20(月) 22:03:47.04 ID:l2CykBu3
クソアマ死ね


まさかとは思うが kenokabe先生(a.k.a qiitapost, chimetorch) は React.js を使いさえすればプログラムが FRP になると考えているのだろうか。
https://twitter.com/bolero_MURAKAMI/status/623057115456733184

72 :69:2015/07/20(月) 22:10:25.52 ID:tLpP/4eq
>>70
関数のオーバーロードみたいの使ってできるようにないませんかね??

73 :デフォルトの名無しさん:2015/07/20(月) 22:56:29.03 ID:XuKvM2I+
モナドは型クラス。ある代数データ型に、
それに対応するfmap, ap, bind が揃っているだけ。

だが、その代数データ型の値をデータコンストラクタで出来上がった
構文木と見ると、代数データ型がBNFみたいに見えてくるはずだ。
そのBNFが表現する言語に、まさにfmap, ap, bindが制御構造を
もたらすものとして理解できる。

これが「モナドがDSLフレームワーク」ということの意味。

74 :デフォルトの名無しさん:2015/07/20(月) 23:06:18.94 ID:XuKvM2I+
>>69
>getData :: DataType -> a

なんでこの型付けがおかしいかわかれば
getDataが作れないことの諦めがつくよ。

75 :デフォルトの名無しさん:2015/07/20(月) 23:52:10.07 ID:WnNA5LDR
>>72
Haskellに関数のオーバーロードはない
型クラスを変に絡めればあるにはあるけど

どういう状況を想定してその関数がほしいと思ったのかを教えてもらえれば、アドバイスできるかもしれない
基本的にHaskellではそういう関数を必要とすることはないはず

76 :デフォルトの名無しさん:2015/07/21(火) 00:28:11.79 ID: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"}

77 :デフォルトの名無しさん:2015/07/21(火) 00:39:13.17 ID:xbZldfZG
>>76
確かに記述上できる事になるけど
意味ないなあー

78 :デフォルトの名無しさん:2015/07/21(火) 01:37:31.91 ID:XB/uoEzx
むしろ

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

みたいにしたらいけない理由が見当たらない。

79 :デフォルトの名無しさん:2015/07/21(火) 01:57:25.58 ID:iDhKY9Vq
>>69
欲しいのは (Num a) => [a] のような型か
fromIntegralとかrealToFracのような
具体型をジェネリックな数に変換する関数だったりしないだろうか

80 :デフォルトの名無しさん:2015/07/21(火) 13:15:45.21 ID:Dco/MENI
モナドは一度使えば最後までついて回るしがらみ

81 :デフォルトの名無しさん:2015/07/21(火) 13:21:44.03 ID:/2Z49al6
なんだかんだ言っても、モナドって、結局、低級言語のデザインパターンなんだな
一言で言えばそういうことだった

82 :デフォルトの名無しさん:2015/07/21(火) 13:22:20.40 ID:B0LBt+ac
岡部健がQiitaで発狂続けてて大草原

83 :デフォルトの名無しさん:2015/07/21(火) 13:32:51.80 ID:aaCdXzrq
http://yomogi.2ch.net/test/read.cgi/net/1437302243/
GitHub/Qiita/StackOverflowの臭い奴を観察1

84 :デフォルトの名無しさん:2015/07/21(火) 19:49:21.60 ID:LwXUVlfX
https://gist.github.com/anonymous/10622bea0d37cdd0f59f

85 :デフォルトの名無しさん:2015/07/21(火) 22:58:37.09 ID:eRnXfzMM
毛の壁の記事を探索するbotコンテストでも開催しろ

86 :デフォルトの名無しさん:2015/07/23(木) 08:07:45.47 ID:Hd8z6Qav
>>82
Qiita荒らしにしか見えない。

87 :デフォルトの名無しさん:2015/07/23(木) 09:38:20.27 ID:UOPnVIxG
Monadでは
>>= :: ma -> (a -> mb) -> mb
となっているですが、これは、どうして
>>= :: ma -> (ma -> mb) -> mb(つまり普通のapply)
ではだめなのでしょうか?

88 :デフォルトの名無しさん:2015/07/23(木) 10:23:45.67 ID: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 を吸収して
適用してくれる。だから、「モナドでラップされた値を取り出して適用してくれる」
みたいな言われ方をするけど、まあ、結果としてそう見えるようなうまい定義が
されてる。(例えばモナド則なんかがそんなうまい定義の背景にあって、そういうのを
どうやって思いついたか説明しようとすると圏論の話しになる。しらんでいい。)

89 :デフォルトの名無しさん:2015/07/23(木) 10:30:27.22 ID:9NQb4Eqn
>>87

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

そういう場合、

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

みたいなのを「つなげたい」場合がある。これは入り口が違うので (>>=) は使えない。
だもんで、(>>) なんてのがある。

90 :デフォルトの名無しさん:2015/07/23(木) 10:46:01.13 ID:UOPnVIxG
>>88
>>= :: ma -> (a -> mb) -> mb
を用意する代わりに、
extract :: ma -> a
みたいなのがあれば、普通の関数適用だけでも同じことができるのではないのですか?

91 :デフォルトの名無しさん:2015/07/23(木) 11:47:48.09 ID:9NQb4Eqn
>>90
「そういうのが作れるならば」あなたのおっしゃるとおり。

具体的に考えてみましょう。 m が Maybe の場合、 extract Nothing は何になりますか

92 :デフォルトの名無しさん:2015/07/23(木) 11:59:35.34 ID: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 の値を返してる。
(つまりモナドの中から値を引っ張りだす、というような事は実際にはやってないわけ)。

実際にはモナドのなかから値を引っ張りだしてないにも関わらず、引っ張りだして
適用したと「プログラマの心の中で」みなしていても整合してるように書けてしまう。

そういううまいルールをどうやって設定するかみたいな話をするために圏論を借りてきてる。
正直、圏論だとかいってもこのレベルの話ならグラフ理論と難しさは変わらん。
(表示的意味論でも圏論を使うけど、そっちは数学がよほど好きでないと厳しい)。

93 :デフォルトの名無しさん:2015/07/23(木) 13:06:35.41 ID:UOPnVIxG
>>91
> extract Nothing は何になりますか
なるひどこれは困った。。。

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

>>= :: ma -> (a -> mb) -> mb の中では、特に、
a -> mb の部分がモナドにとって本質的なんだなと思えてきました

94 :デフォルトの名無しさん:2015/07/23(木) 13:35:05.00 ID:UOPnVIxG
>>92
> そういううまいルールをどうやって設定するかみたいな話をするために圏論を借りてきてる。
「そういううまいルール」とは、どこの事でしょうか?

95 :デフォルトの名無しさん:2015/07/23(木) 13:41:38.62 ID:UOPnVIxG
>>92
extract :: ma -> a
は存在しない場合があるようですが、
いつも存在しないのですか?
また、join :: m(ma) -> ma
は必ず存在するのですか?

96 :デフォルトの名無しさん:2015/07/23(木) 14:03:17.98 ID: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
でやる流儀の両方が解説されてます。論理的にはどっちで考えても良い。)

97 :デフォルトの名無しさん:2015/07/23(木) 18:38:39.92 ID:KEVSaEFA
日本語でおすすめの入門サイトってありますか?

98 :デフォルトの名無しさん:2015/07/23(木) 21:02:13.38 ID:hAeb0KoI
Haskellの型システムは入門用ではない
静的型と動的型の高度な煽り合いの成果物だ

99 :デフォルトの名無しさん:2015/07/23(木) 21:31:05.23 ID:UOPnVIxG
>>96 :デフォルトの名無しさん:2015/07/23(木) 14:03:17.98 ID:9NQb4Eqn
> そういう上手いルール、はモナド則です。
うまいというより、ふつうに定義すればモナド則は満たされるのではないですか?

> join :: M(M a) -> M a
> の存在は、モナドの構成要件の一つだと言って差し支えないと思います。
joinがそうであるのにextractがそうでないのはなぜでしょうか?
まあ、oinは不可欠だが、extractはなくても代わりがあるからだということなのでしょうが

100 :デフォルトの名無しさん:2015/07/23(木) 21:46:55.16 ID: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 型の射をうまくつなげてどうにかしたい場合です。
それは「コモナド」と呼ばれてます。(これを積極的に考える場面もあるらしいのですが
私の勉強が追いついていないのでコモナドについてこれ以上語れることはありません。)

101 :デフォルトの名無しさん:2015/07/23(木) 21:58:48.06 ID:GSXYPmA+
>>100
空でないデータ構造に対して、その中のある(現在注目している)要素を特に指し示す
ある種のポインターを持った構造として使う、というのがよく知られた例ではないかと。

ストリームをチューリングマシンのテープに見立てた時のヘッドの現在位置とか。

102 :デフォルトの名無しさん:2015/07/23(木) 22:28:56.93 ID:ul3W6A8M
extract を要求しなくてもいろんなことができる、という程度におれは考えてるなぁ

103 :デフォルトの名無しさん:2015/07/23(木) 23:19:05.16 ID:UOPnVIxG
> たとえば http://d.hatena.ne.jp/itto100pen/20090710 に、モナド則の一部が満たされない例があります。
ページ紹介ありがとうござます。
そこの return x = [x x] は、(私の思うw)「ふつうの」定義ではないので、
それがモナド則を満たさないのも尤もかなと思いました

104 :デフォルトの名無しさん:2015/07/23(木) 23:32:47.82 ID:GSXYPmA+
>>103
逆に言えば、あなたが直観的に思う「ふつう」を保証してくれるのがモナド則なのですわ。

105 :デフォルトの名無しさん:2015/07/23(木) 23:45:33.49 ID:UOPnVIxG
>>104
モナド則というのがそういうものだという説明ははじめて聞きました。本当ですか?

106 :デフォルトの名無しさん:2015/07/24(金) 00:04:12.32 ID:E+4NqHJH
まあ要はそれらは「自然」な振る舞いをするようにできているのです。

107 :デフォルトの名無しさん:2015/07/24(金) 06:20:03.70 ID:SOLi30hJ
そんな希望的観測は法則を知らなくてもできるから法則の意味がない
法則はもっと不吉な意味を持つべきなんだよ

「不自然にならないよう自然を保証してくれるので復旧シナリオは考えていない」
まさかこのパターンの意味がわからない難聴系主人公はいないよね

108 :デフォルトの名無しさん:2015/07/24(金) 08:17:51.80 ID:ZflfUkEE
>>107
> 「不自然にならないよう自然を保証してくれるので復旧シナリオは考えていない」
> まさかこのパターンの意味がわからない難聴系主人公はいないよね
ここよくわからない。少し説明を加えてくれませんか

109 :デフォルトの名無しさん:2015/07/24(金) 08:31:24.73 ID:sUR4TL+C
モナド則を満たさないモナドインスタンスは使用者が大いに困るだろう
上の return x = [x x]
とか

110 :デフォルトの名無しさん:2015/07/24(金) 09:47:25.11 ID:+b/Jkmb9
明らかにモナド則を満たさないモナドインスタンスの例はよく出てくるけど、
「ふつうの」FunctorやApplicative Functorであって
Monadでないものの具体例ってあるのかな

111 :デフォルトの名無しさん:2015/07/24(金) 10:31:52.55 ID:qo8KZeeD
>>110
ZipList
理由はこれ http://www.mail-archive.com/haskell-cafe@haskell.org/msg57217.html

112 :デフォルトの名無しさん:2015/07/24(金) 12:24:32.99 ID:mRGyPSzK
>>109
確かにロボットが困った顔してるように見える

113 :デフォルトの名無しさん:2015/07/24(金) 16:30:09.13 ID:sUR4TL+C
>>110
間違ってるかもしらんけど
関数はFunctorやApplicative Functorだけどmonadではなかったような

114 :デフォルトの名無しさん:2015/07/24(金) 18:21:56.53 ID:ZflfUkEE
>>113
関数は恒等モナドなのでしょう?

115 :デフォルトの名無しさん:2015/07/24(金) 20:30:46.83 ID:ZflfUkEE
とにかくモナド則ってモナドの本質とは全然関係ないですよね。
そのネーミングがよくないなw

116 :デフォルトの名無しさん:2015/07/24(金) 22:02:00.45 ID:UUB1Rdtf
>>115
モナドの本質とは、Kleisli射が「合成できる」ことであって、モナド則は
そのような合成が well-defined であることを保証しているという意味では本質と
関係している。

117 :デフォルトの名無しさん:2015/07/24(金) 22:15:15.51 ID:E+4NqHJH
>>113
(->)型はモナド。
Readerモナドの正体は関数モナドそのもの。

118 :デフォルトの名無しさん:2015/07/24(金) 22:26:30.02 ID:XFwmWe1A
モナド則は情報量保存則のようなものだと思ってもよい
(>>=)やreturnでwrapするだけで元の情報が失われるような実装は禁止
後に続く関数に元の情報を全て渡す

つまりわざと情報を捨てればモナド則を満たさない例を作れる
return x = ("", x)
(_, x) >>= f = f x

("warning", x) >>= return = ("", x)

119 :デフォルトの名無しさん:2015/07/24(金) 22:29:22.04 ID:+b/Jkmb9
>>111
なるほどZipListか
まだちゃんと読めてないんだけど、
> (可算無限も含めて)長さが固定のベクトルだったらその定義で上手く行くんだけどね、
> でも一般のリストに対する上手い定義ももしかしたらあるかもね
って感じの結論か
return (= pure) が無限リストを返すから
確かにモナド則を満たすのは容易ではなさそう

>>115
Haskellでは型さえ合っていればコンパイルできてしまうだけで
モナドがモナド則を満たすのはむしろ定義だと思う

120 :デフォルトの名無しさん:2015/07/24(金) 22:52:20.29 ID:jOlzxqLq
まあMonadLikeクラスでも作ってモナド則無しでやってみろよ
辛くなったら帰って来い

121 :デフォルトの名無しさん:2015/07/24(金) 23:04:31.56 ID:ZflfUkEE
>>116
> モナド則は...合成が well-defined であることを保証している
>>118
> モナド則は情報量保存則のようなものだと思ってもよい
>>119
> モナドがモナド則を満たすのはむしろ定義だと思う

えっ? モナド則って単位元の存在と結合則ですから、モナドに限らないおよそ代数演算に
課される最低限の規則に過ぎないでしょう?

122 :デフォルトの名無しさん:2015/07/24(金) 23:18:40.52 ID:UUB1Rdtf
>>121
その最低限の規則だって明示的に指定して置かなければ混乱するでしょ。
あなたにとって最低限のことは隣の誰かにとっては最低限の常識ではない。

123 :デフォルトの名無しさん:2015/07/24(金) 23:40:04.07 ID:XFwmWe1A
結合法則 (x + y) + z = x + (y + z)
交換法則 (+ z) . (x +) = (x +) . (+ z)
これらは数学的に同じ意味だから
結合法則は最低限だとか、交換法則は最低限じゃないとかいうのは
数学じゃなくて言葉遊びだよね

124 :デフォルトの名無しさん:2015/07/25(土) 07:47:47.08 ID:6zkZTkly
結合法則を満たせば半群
群は交換法則を満たさなくてもよい,満たすものを特に可換群とよぶ

十分に数学的だ

125 :デフォルトの名無しさん:2015/07/25(土) 07:57:27.29 ID:Jr3WK49j
非可換群なんかいくらでもあるのにね。

126 :デフォルトの名無しさん:2015/07/25(土) 08:09:08.78 ID:Jr3WK49j
Z上でのある演算(+)の結合法則から構成される構造を
別の台集合(+z)(x+)と合成(.)で構成される構造に等価だといったところで
もとの演算(+)の可換性について何も言ったことにはならないというだけのことよね

127 :121:2015/07/25(土) 08:44:38.00 ID:Bvjhkxqq
>>122 >>123
強調点は「最低限」のところではなく「およそ(ふつうの)代数演算に共通」
というところにありました

128 :121:2015/07/25(土) 08:46:08.24 ID:Bvjhkxqq
だから、モナドの特質を表すものじゃないと

129 :デフォルトの名無しさん:2015/07/25(土) 08:55:06.98 ID:gZG0Y+YD
>>126
嘘を言ったのではなく何も言ってないのか
チャレンジよりゼロリスクを選んだ人間がどのような評価を受けるかという意味で面白い

130 :デフォルトの名無しさん:2015/07/25(土) 09:14:59.38 ID:bPfkCbEC
数学の話はいいからHaskellの話を

131 :デフォルトの名無しさん:2015/07/25(土) 09:34:33.91 ID:Bvjhkxqq
trace :: ((B, D) -> (C, D)) -> B -> C
trace f b = let (c, d) = f(b, d) in c

としたとき、このtraceってwell-defined?

132 :デフォルトの名無しさん:2015/07/26(日) 10:00:37.02 ID:dkr9+eHq
型に特質があるから値の特質(モナド則?)はなくても良くね?
「選択と集中」とかいう言葉を信じるなら値に特質を持つことは寧ろ禁止した方が良い

133 :デフォルトの名無しさん:2015/07/26(日) 11:46:33.95 ID:rsm1cXgs
HackageDBである特定のパッケージに依存しているパッケージの一覧を得る
検索方法はないでしょうか。

たとえば、yesod が必要なパッケージの一覧など。

134 :デフォルトの名無しさん:2015/07/26(日) 14:06:20.87 ID:ihM0rggd
>>132
その「選択と集中」というカルト宗教流行ってるの? 根拠もなんもないくせに
耳あたりだけいい言葉に騙されてない?

選択と集中でおもいっきり原子炉にぶっこんだ東芝はどうなった? 

135 :デフォルトの名無しさん:2015/07/26(日) 20:37:01.68 ID:vJ1KGCO5
さすがにそこで原発でてくんのは謎

136 :デフォルトの名無しさん:2015/07/26(日) 20:44:23.44 ID:vJ1KGCO5
マジレスするとモナド則を満たしてないモナドインスタンスはバグだ
利用者が困る

137 :デフォルトの名無しさん:2015/07/26(日) 20:52:18.39 ID:dkr9+eHq
色々な機能を全部まとめて売りつけようとする奴がいるから
欲しくないものまで買わされて損する場合がある
それよりは欲しいものだけを集中的に買って損する方がマシ

138 :デフォルトの名無しさん:2015/07/26(日) 21:02:49.59 ID:vJ1KGCO5
モナド則満たしてないモナドインスタンスなんて欲しくないもの買わされたって状態だよ

139 :デフォルトの名無しさん:2015/07/26(日) 21:02:55.04 ID:PdaEJy2y
モナド則を満たしていることをコンパイル時に証明する機構がHaskellに望まれる

140 :デフォルトの名無しさん:2015/07/26(日) 23:01:02.42 ID:ooP+OwHf
完全な保証は無理でもQuickCheckあたりでなんとかならんかな

141 :デフォルトの名無しさん:2015/07/27(月) 03:43:19.54 ID:+mQx9Q9E
選択と集中というのは、経済学の用語で比較優位の話だ。

なんでこんな所で選択と集中の話が出てくるの?

142 :デフォルトの名無しさん:2015/07/27(月) 06:11:57.70 ID:3edBlaSG
よくわからないけどモジュールは疎結合が正義って話しかな?

143 :デフォルトの名無しさん:2015/07/27(月) 11:31:50.70 ID:pQHi2myk
exportは天国、importは地獄
特に、間接的なimportを強制されたら最悪

144 :デフォルトの名無しさん:2015/07/27(月) 22:21:38.16 ID:+pmDbRz6
>>137
ジャック・ウェルチが言ってる「選択と集中」とは何の関係もないな

145 :デフォルトの名無しさん:2015/07/28(火) 05:08:55.87 ID:XoUEQPXj
なるほど
ジョブズのようなものがいるんだ

146 :デフォルトの名無しさん:2015/07/28(火) 11:57:02.42 ID:RBpFIWq5
プログラマも経営センスを求められるというお話?

147 :デフォルトの名無しさん:2015/07/28(火) 13:39:01.53 ID:d4M8qnVV
>>132
ジャック・ウェルチの「選択と集中」でもってあなたが何を言わんとしてるか
さっぱりわからないし、「型に特質がある」という言い方も意味不明。
モナド則は値の特質ではなくモナドでラップされた型がどのように振る舞うか
を決めてるのであって、このルールがあるからこそ do 記法を
安心して使える。とにかく地道に勉強しよう。

148 :coolio:2015/07/28(火) 16:34:52.05 ID:n3cGSoaV
Haskellってオワコンなんでは?
なんでJavaScript使わないのみなさん?
普及率も需要もこっちの方が上だし、国際的潮流かとおもうけど

149 :デフォルトの名無しさん:2015/07/28(火) 17:47:57.77 ID:d4M8qnVV
>>148
じゃあまずお前が国際的潮流に合わせて英語か中国語で書き込めよ

150 :デフォルトの名無しさん:2015/07/28(火) 17:50:36.54 ID:Ni9zj/4A
Javascriptやってればいいじゃん
人のことはどーだってよくね?

151 :デフォルトの名無しさん:2015/07/28(火) 21:05:55.89 ID:ROVV0dd8
まるで何でスタバ行かないのって聞かれたような気分

152 :デフォルトの名無しさん:2015/07/28(火) 21:40:55.38 ID:UXOcgM9+
>>149
哦,可以用國語嗎?你看得到呢?

153 :デフォルトの名無しさん:2015/07/28(火) 21:54:20.49 ID:d4M8qnVV
>>152
日本語でOK

154 :デフォルトの名無しさん:2015/07/28(火) 22:15:38.33 ID:uKnSRdVu
我想喝啤酒!

155 :デフォルトの名無しさん:2015/07/28(火) 22:49:30.17 ID:MQ4Zq0Y1
Haskellは無料で遊べちまうけど需要のあるJSは徹底的に課金するべき

156 :デフォルトの名無しさん:2015/07/28(火) 23:02:16.25 ID:2DleteTo
ビールといえば、資源ごみ捨てないと…

157 :デフォルトの名無しさん:2015/07/30(木) 13:15:34.02 ID:XKVzkpKt
ghcの新型出るんですか?

158 :デフォルトの名無しさん:2015/07/31(金) 14:52:35.97 ID:gTceL3gJ
毛の壁また来てるの?
さっさと2chから消えろ

159 :デフォルトの名無しさん:2015/07/31(金) 21:02:27.62 ID:SPFFmEBo
無理だよ、毛は10年前からナンパ書き込みしたりしてるから

160 :デフォルトの名無しさん:2015/07/31(金) 22:59:33.38 ID:Tuqyf3gY
いつどこに誰が来たのかさっぱりわからないし意味不明。

161 :デフォルトの名無しさん:2015/08/01(土) 01:31:31.22 ID:CYsajC4S
ヤングアニマル No.15
アンダーメンバー全員集合 16ページ お祭り騒ぎ

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


皆、短パン・ランニングシャツ姿
堀・らりんのお股
ひめたんの胸

162 :デフォルトの名無しさん:2015/08/01(土) 05:22:40.82 ID:494SgxRt
そういや原発の長文書き込む荒らしがなりを潜めたと思ったら、入れ替わるように毛の壁ブームが起こったな

163 :デフォルトの名無しさん:2015/08/01(土) 10:47:10.94 ID:jD/MwJWz
1人しか敵視しない1bit脳が基本だから
客観的に1人いようが2人いようが主観的には1人しか視えない

164 :デフォルトの名無しさん:2015/08/02(日) 20:21:12.98 ID:htkPKsn5
モナドの合成って難しいことなの?

165 :デフォルトの名無しさん:2015/08/02(日) 20:36:45.90 ID:SLv/zRdd
>>162
原発長文君は効率的な情報収集という意味では有用であった復活を拒絶しない

166 :デフォルトの名無しさん:2015/08/02(日) 20:39:24.29 ID:Iy0keT5I
きーたぽすととかいうけのかべが抹消されたようだ

167 :デフォルトの名無しさん:2015/08/02(日) 21:10:57.21 ID: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 ファイルのどこを直せば良いのでしょうか。

168 :デフォルトの名無しさん:2015/08/02(日) 21:22:35.46 ID:PjsL8G7T
>>167
>doc-index-file: $datadir/doc/$arch-$os-$compiler/index.html

普通に

doc-index-file: $datadir/doc/$arch-$os-$compiler/$pkgid/index.html

じゃいかんの?

169 :デフォルトの名無しさん:2015/08/02(日) 21:23:45.67 ID:PjsL8G7T
あ、 ....../$pkgid/html/index.html かな。パスの途中に "html" 入れ忘れた。

170 :デフォルトの名無しさん:2015/08/02(日) 21:27:13.13 ID:PjsL8G7T
ごめん見当違いだったわ。
総インデックスファイルは確かにそこになきゃダメだ。

171 :デフォルトの名無しさん:2015/08/02(日) 22:14:50.22 ID:5gB+ySz/
>>164
モナドは自己関手なんで、関手を合成することができるが、
そうしてできた合成関手は一般にはモナドにならない。

172 :デフォルトの名無しさん:2015/08/02(日) 23:43:12.86 ID:htkPKsn5
>>171
合成関手はモナドになり得ると思うが。。。
モナドの合成は一般にはモナドにならないということね?
なぜそうなのか、まだよく分かってないのだが、
そもそも合成できないっていうのはモナドが圏的でないということね?
それって結構困ったことなのでは?

173 :デフォルトの名無しさん:2015/08/03(月) 01:17:03.15 ID:kH5++B+D
>> 167
見当違いかもしれないけど、俺の手元の~/.cabal/configは
htmldir: $docdir/html
になってた。貴方のは
htmldir: $dicdir/html

174 :デフォルトの名無しさん:2015/08/03(月) 07:24:39.84 ID:UJ5SIf4H
>>173
すいません、ただの書き間違えです。
私の方でも正しくは

htmldir: $docdir/html

です。

175 :デフォルトの名無しさん:2015/08/03(月) 11:59:33.09 ID:C3iL4RK8
>>172
モナドFとGについて、合成関手FGに対して適切なηとμを、
「一般には」構成できない。FとGがよほど相性が良い場合は別だけど。

176 :デフォルトの名無しさん:2015/08/03(月) 17:24:38.72 ID: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 `(_、_)   /  \´  )゚
 \_)    `ヽ   : :;;*:;   : : : |    (_ノ
         人__;;:;;、___ノ          ヽヽ        ヽヽ
             ;:;;:;;:;,,           ──┐ |  |   ──┐ |  |
          ∬ ;;:;::.;::.::;::..:;:..: ∬          /  |  |      /.  |  |
      ・〜   ;::;.:;:;:;:;:.:;:.:::.;:;:;.:.:.:          ノ    ノ  ┐ ノ    ノ  ┐
          ∬;;;:::;;;:;:.:;:.::.:;;.:.;.:;.:; ∬                 ┴    ヽヽ     ┴
              :"

177 :デフォルトの名無しさん:2015/08/04(火) 07:05:53.89 ID:fTn2TRnu
もし敵の武器をコピーする能力があったら
意味不明すぎてコピーできない武器を使えばいい

178 :デフォルトの名無しさん:2015/08/04(火) 09:50:58.91 ID:Jii/ZMO+
>>175
了解。
モナドが合成できないということは、代数的議論としてはそうだと言ってればいいんだろうが、
プログラミングとしては、致命的なのではないの?

179 :デフォルトの名無しさん:2015/08/04(火) 18:16:37.45 ID:Qc8p5PG4
>>178
代数的な議論とか言ったって簡単に情報系の議論に移せるよ。

Fという文脈に、さらにGという文脈をつけたものは、先にG、それをFでかぶせたものとは
同一視できない。

もう少し具体的に言えば、Maybeと状態モナドStateを考えたとき、Maybe State s a と State s Maybe a
を何も制約つけずに同一視できるほうがプログラミングとしては致命的だよ。

180 :デフォルトの名無しさん:2015/08/04(火) 20:22:00.28 ID:T0ZfeL7S
すいませんハスケル初級者で質問なのですが
ハスケルでは「=」は代入ではなく束縛だという事で

関数定義
func :: Int -> Int
func x = func (x - 1) 
それを使った式
func 100

と書いた場合無限に減算を繰り返す理由は
「=」は代入ではなく束縛だから
ハスケルがfunc xに該当する唯一の値を求めて処理を繰り返すという
仕組みになっているという理解でよろしいでしょうか。

181 :デフォルトの名無しさん:2015/08/04(火) 20:46:26.59 ID:8q1xh6ui
代入とか束縛とか関係ない

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

int x = func(100);

Cでこう書いたって無限再帰

182 :デフォルトの名無しさん:2015/08/04(火) 21:03:02.69 ID:Jii/ZMO+
>>179
可換でないといけないとは言っていない。
合成ができないのが致命的と言ったのだが

183 :デフォルトの名無しさん:2015/08/05(水) 08:30:57.49 ID:XaoKQAnn
素数と素数の積が素数でないのは致命的じゃないが
モナドとモナドの合成がモナドでないのは致命的か?

184 :デフォルトの名無しさん:2015/08/05(水) 08:31:02.84 ID:8IuY4/EZ
>>180 それは
x = x - 1
とかの場合の話じゃない?

185 :デフォルトの名無しさん:2015/08/05(水) 09:20:55.44 ID:PKbBdrRV
>>182
なぜ致命的なのかさっぱりわからない

186 :デフォルトの名無しさん:2015/08/05(水) 11:55:37.34 ID:6JvEd9Ae
>>183 >>185
> 素数と素数の積が素数でないのは致命的じゃないが
それは素数の本質からの帰結だが、モナドの場合はそうではない。
もし整数と整数の積が整数にならないとすると、それは整数概念にとってかなり致命的。
群とまでいわなくても圏すらなさない概念はふつう使い物にならない

187 :デフォルトの名無しさん:2015/08/05(水) 12:21:47.56 ID:/t+jhWZx
>>178
>モナドが合成できないということは、代数的議論としてはそうだと言ってればいいんだろうが、
>プログラミングとしては、致命的なのではないの?

そりゃモナドでプログラミングしたことなきゃわかんないよな

188 :デフォルトの名無しさん:2015/08/05(水) 13:35:33.66 ID:WyZxE69I
>>186
よくわからんが仮に「モナド」が使い物にならないなら
「素関手」みたいな、素数に似た名前の新しい概念を提案すればいいんだろ?

189 :デフォルトの名無しさん:2015/08/05(水) 14:44:47.74 ID:6JvEd9Ae
>>188
今は、素でないといけないと言ってるわけじゃないし(むしろ素しかないのは変だなと言ってる)
名前を問題にしてるわけでもないんだが

190 :デフォルトの名無しさん:2015/08/05(水) 15:47:37.18 ID:WyZxE69I
ただ名前を提案するだけでも、何も提案しない奴よりマシになれるからね
コストは最小化した方が良いし

191 :デフォルトの名無しさん:2015/08/05(水) 19:06:59.33 ID:nSk5CAms
ハスケルで実用的なプログラム組みたい
具体的にはエロ画像サイトのスクレイピングやりたい

192 :デフォルトの名無しさん:2015/08/05(水) 20:35:22.09 ID:3EIw/aJp
>>191
やったらいいじゃん

193 :180:2015/08/05(水) 20:35:53.33 ID:++LOioZG
>>181 >>184
すいません代入束縛関係なく無限再帰の構文でした。

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

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

x = x - 1でもやってみます。

194 :デフォルトの名無しさん:2015/08/05(水) 23:13:16.26 ID:/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>> となって中断される。
基底部のない再帰はそうならない。

195 :デフォルトの名無しさん:2015/08/06(木) 15:22:18.11 ID:gwZmdoaP
>>187
ほんとこれ。 モナドの積がモナドにならないことがなぜ致命的なのか、全然言えないんだよねこの人。

196 :デフォルトの名無しさん:2015/08/06(木) 16:19:38.61 ID:hE+0lNLB
あれこれ空論には饒舌でも結局コード書かない奴は何をやってもダメ

197 :デフォルトの名無しさん:2015/08/06(木) 20:09:37.57 ID:QVat9e3X
でもまあ何をやってもダメな奴は
自分は何もやらず安く買って高く売るだけの能力に全振りしてるんじゃないか

198 :180:2015/08/06(木) 20:35:31.96 ID:9HWheWsA
>>194
ありがとうございます。
試してみて止まらないのを確認しました。
xが無限ループに束縛される様な感じです。

199 :デフォルトの名無しさん:2015/08/07(金) 09:35:35.60 ID:qqVIQMo+
>>188
素関手ってのは、あらゆる関手がそれらから合成できるときに使う言葉だ。
モナドは全然そんなものじゃないだろ?

>>195 >>196 >>197
モナドっていうのは、ごく限られた単純局面でのみ使えるプログラミング技法だっていう自覚はないの?
その意味で、関手はもちろんメジャーだが、モナドはニッチなんだよ。
もっと実用の「コード書いて」いくとそれがわかってくると思うが

200 :デフォルトの名無しさん:2015/08/07(金) 10:39:25.62 ID:aKStrfm+
>>199
御託はいいんだよ。モナドってのは自己関手が作り出す「文脈」を引き継いで
どんどん計算してく、そういう発想をカタチにしたものなわけ。そういう具体的な
思想と具体的な実装を持っていて、Wadlerが示したように do 記法を通じて
参照透明性を壊さずに命令型のプログラミングができることは示された。

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

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

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

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

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

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

モナドの合成の話は頭が痛い問題で、まだ十分な解決策をだれも見いだせてない。でも
それで喚き散らして「欠陥品」と罵ってるのはバカでもできる。知性がある人間は君が喚き散らしてる
間も圏論の本を読みながら「いくらかマシなアイデア」をひねり出そうとしてるの。

201 :デフォルトの名無しさん:2015/08/07(金) 13:10:20.13 ID:qqVIQMo+
>>200
力のこもったコメントありがとう
> 御託はいいんだよ。
もっと冷静にw
> 参照透明性を壊さずに命令型のプログラミングができることは示された。
それは関数型にとって宿命的課題。だが、モナドはそのためのものでもないし、モナドだから解決できるわけでもない
> んなこたあ誰だって知ってるんで
もっと冷静に。合成できないことは知っててもその意味が分かっていない
>「馬車は不便」を内燃機関による自動車が解決した
その場合の自動車は、限界はあっても、本質的技術進歩なんだよ。
その他あまたのそもそも成立しない技術とは区別しないとな。
合成できないというのは成立し得ない兆候なのよ。
> でも、「こんな致命的な欠陥があるから問題外」という考えは知性の放棄なの。
いやいや、致命的な欠陥があればそれはもうそれでだめなのよw
> モナドの合成の話は頭が痛い問題で、まだ十分な解決策をだれも見いだせてない。
それが分かっているなら、少し救いだが
> 君が喚き散らしてる間も圏論の本を読みながら「いくらかマシなアイデア」をひねり出そうとしてるの。
圏論の本を読みながらw
そもそもモナドが圏論から形式的にひねり出したアイデアだから、プログラミングでは使えないんじゃないのかい?

202 :デフォルトの名無しさん:2015/08/07(金) 20:18:30.98 ID:/Xr5U2Jc
あれこれ空論には饒舌でも結局コード書かない奴は何をやってもダメ

203 :デフォルトの名無しさん:2015/08/07(金) 22:14:14.99 ID:CgCkvu6a
合成するならモナドじゃなくて、モナドに供する関数でやってくれってことかねぇ。

モナドでパイ生地宜しく抽象レイヤ重ね出したら、結局手続き型と同じ業を背負い込むんじゃねーの?
という素朴な疑問がある。

204 :デフォルトの名無しさん:2015/08/08(土) 07:32:51.12 ID:OWyBYzJT
手続き型言語がーってのは的外れだな
この流れなら普通は自然言語に疑問をもつ
自然言語なんて空論記述言語にすぎないんじゃねーかと

205 :デフォルトの名無しさん:2015/08/08(土) 09:16:43.49 ID:SyZUU7PY
>>204
意味不明w
自然言語だからか?w

206 :デフォルトの名無しさん:2015/08/08(土) 10:03:20.67 ID:OWyBYzJT
都合が悪いようだな
自然言語を理想とする理想主義が否定されれば高級言語や人工知能の大部分が崩れるから

207 :デフォルトの名無しさん:2015/08/08(土) 10:56:41.88 ID:fC37rrhT
>>206
逆だよ。ラッセルのような論理主義は自然言語が曖昧性を持ち、真理を記述するのに不適格だと
考えて記号論理を推進した。そのラッセルが生み出した型理論を(大幅に)修正したものが
強い型を持つ言語の基盤になっている。

自然言語による真理記述に興味を持ち続けた学者もいるけど、少数派(間違いだといいたいわけじゃない)
で、今日のプログラミング言語には全く影響を与えていない。

208 :デフォルトの名無しさん:2015/08/08(土) 14:05:14.68 ID:OWyBYzJT
低級言語に曖昧性はない
高級言語は曖昧性がないことに加えて更に別の理想を追求している
おそらく一度あきらめた理想を取り戻そうとしている

209 :デフォルトの名無しさん:2015/08/08(土) 15:28:39.84 ID:TgCfkrij
毛の壁みたいなこと言ってないでコード書けよ

210 :デフォルトの名無しさん:2015/08/08(土) 15:52:47.27 ID:mk1m6mga
Haskellでまともなコードが書ける日本人なんていないでしょ

211 :デフォルトの名無しさん:2015/08/08(土) 16:16:44.90 ID:TgCfkrij
あっそう(ハナホジー

212 :デフォルトの名無しさん:2015/08/08(土) 17:24:31.84 ID:CVdJzgpn
都合のいいサンプルを出してるだけだ

213 :デフォルトの名無しさん:2015/08/08(土) 17:25:05.09 ID:CVdJzgpn
>>200みたいな評論のことね

214 :デフォルトの名無しさん:2015/08/08(土) 17:31:44.38 ID:9n35IarN
ガラパゴスなおまえらには無理

215 :デフォルトの名無しさん:2015/08/08(土) 18:46:17.01 ID:i6VMh23W
haskell なんて簡単だよ
ひたすら型を複雑にすれば勝手に精密なプログラムになってくれるんだぜ?
あんな楽な言語、他に無いよ

216 :デフォルトの名無しさん:2015/08/09(日) 09:57:54.75 ID:Goie4Pfe
仕事でも趣味でも普通に世界でバリバリHaskell書いてる日本人たくさんいるけどな

217 :デフォルトの名無しさん:2015/08/09(日) 10:15:53.22 ID:z+nEtG9u
理想の言語を選べ
1 自然言語 ←コード書かない
2 型を書くだけ ←コード書かない
3 短い (一行とか) ←コード書く

218 :デフォルトの名無しさん:2015/08/09(日) 10:19:57.32 ID:yc5ubK7v
>>216
日本人が普通に世界でバリバリHaskellで書いたアプリケーションをたくさん紹介してくれ

219 :デフォルトの名無しさん:2015/08/09(日) 11:07:30.63 ID:uWrNjf8R
>>217
この3つの中では
1しかないかな?
2と3は論理的にありえない

220 :デフォルトの名無しさん:2015/08/09(日) 12:47:58.32 ID:fLWMExWl
>>218 外資金融系とか。

221 :デフォルトの名無しさん:2015/08/09(日) 15:46:05.53 ID:IcT2pazV
>>220
金融屋だけどHaskellは実務ではあんまり使わないよ
金融業界で使われている有名なライブラリがOcamlで書かれてるから、Ocamlが多い
あとは、F#だっけ?なんか、Ocaml互換のプログラミング言語

222 :デフォルトの名無しさん:2015/08/09(日) 16:06:00.55 ID:q2cZe2Ik
>>221 知らないんだったら黙っててね

223 :デフォルトの名無しさん:2015/08/09(日) 16:07:28.11 ID:t8Adpj37
言語名間違えてる時点で完全にモグリ。

224 :デフォルトの名無しさん:2015/08/09(日) 17:14:22.35 ID:IcT2pazV
>>222
普通に現職の俺より詳しいというなら、なにかそれらしい反論してみろって

>>223
OCamlだったか、すまん
特定のドメイン領域でしか使わないし、俺は普段使わないから間違えたの

225 :デフォルトの名無しさん:2015/08/09(日) 17:56:53.34 ID:jZAMYmB+
エアコーダーさんは黙ってね

226 :デフォルトの名無しさん:2015/08/09(日) 20:15:02.83 ID:yc5ubK7v
どうせ紹介してくれるのならオープンソースの方がいいな。
まともに動く Haskell アプリのソース全体が見れる機会ってなかなかないんだ。
日本人が書いたなんて意地悪なことはもう言わんから、紹介してくれないか。

github 漁っても、実験的なものやサンプル、ライブラリくらいしか見あたらん。
なんか小粒な Web アプリはやたら出てくるが、なんだろ。
流行ってるのか?

227 :デフォルトの名無しさん:2015/08/09(日) 21:01:04.74 ID:0a1Qk31r
Hskellは金融で使われているよ
まぁ下請けだったけどね
元受の会社は誰でも知ってる大会社
ヒントだけ書くと、ソー○ネク○ト

228 :デフォルトの名無しさん:2015/08/09(日) 21:19:45.38 ID:0nk6UHsv
金融ってMATLABで数値計算ガリガリというイメージだがな。

229 :デフォルトの名無しさん:2015/08/09(日) 21:22:35.31 ID:bxjvjJcB
cabal replのCtrl-Pがshellと違って連続で同じコマンド使ってても1つ前のコマンド出すから
間違える→Ctrl-Pの連打数が増える→間違えるの繰り返し辛い

230 :デフォルトの名無しさん:2015/08/09(日) 22:57:12.53 ID:PuCXERZp
>>228
数値計算につかうわけじゃない
ADTで金融商品の記述のDSL作って使う

231 :デフォルトの名無しさん:2015/08/10(月) 08:18:32.34 ID:5dby/keT
おまえらは「机上の空論」の世界でしか生きられない、ガラパゴスエアコーダー。言語の一つも作ってみろ、卑怯者

232 :デフォルトの名無しさん:2015/08/10(月) 10:22:50.55 ID: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]
となってしまい、明らかに
この定理は成り立たないと思うのですが、どこか誤解があるでしょうか?

233 :デフォルトの名無しさん:2015/08/10(月) 10:23:33.03 ID:h0Losqum
ヘア告訴しか出来ない卑怯者がブンブンうるさいね

234 :デフォルトの名無しさん:2015/08/10(月) 10:32:54.55 ID:mZ18nlaN
>>232 rの型が違う

235 :デフォルトの名無しさん:2015/08/10(月) 10:45:40.66 ID:6CToalvR
>>234
> rの型が違う
どう違うのでしょうか? 気が付きません

236 :デフォルトの名無しさん:2015/08/10(月) 11:02:23.74 ID:dDBl8Ksv
>>235 HaskellかMLのプログラム書いたことある?

237 :デフォルトの名無しさん:2015/08/10(月) 11:20:23.87 ID:6CToalvR
どこが違うかを直接指摘してくれるとありがたいです

238 :デフォルトの名無しさん:2015/08/10(月) 13:39:27.85 ID:Mr6uGRV9
232の謎の言語のコンパイラはどこにあるんだろう
もしかしてコンパイラがなくても型が見える人なのかな

Haskellも自分が使うためじゃなくて型が見えない人のために作っただけ
そう考えるとHaskellでアプリを作っている気配がないのも辻褄が合う

239 :デフォルトの名無しさん:2015/08/10(月) 14:07:42.71 ID:3agS2rXW
>>232
Wadlerの論文のどこの話をしてるの?

240 :デフォルトの名無しさん:2015/08/10(月) 14:33:14.35 ID:qNcURq9A
岡部健さんこんにちは

241 :デフォルトの名無しさん:2015/08/10(月) 14:40:16.50 ID:08na6m/L
>>239
http://ttic.uchicago.edu/~dreyer/course/papers/wadler.pdf
Introductionの話だと思う

>>232が何を言いたいのかは分からないけど

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

>>232みたいに型ごと値ごとにアド・ホックな対応を付けて
r を構成することはできない(任意の型のリストの任意の値を
取らなきゃいけないんで計算可能にならない)。

243 :デフォルトの名無しさん:2015/08/10(月) 15:23:45.69 ID:6CToalvR
>>239 >>241
そこです。
そこにある例では、odds関数の説明がよく分かりません。
「これは(定理の)反例にはならない。なぜなら、oddsの型が∀X. List(X) -> List(X)
ではなく、より特定的な List(Int) -> List(Int)であるので」と言うのですが、
oddsの型が∀X. List(X) -> List(X) になっていないとなぜ言えるのでしょうか?
φ(A)であってさらに∀X.φ(X) でもあることはあり得ることではないのですか?

244 :デフォルトの名無しさん:2015/08/10(月) 15:29:36.39 ID:3agS2rXW
>>241

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

というわけで、どんな型のリストにも適用できる関数は
特定の型の値を具体的に見て処理できないので
リストの構造を弄ることしかできない、ということよ

245 :デフォルトの名無しさん:2015/08/10(月) 15:29:57.17 ID:3agS2rXW
あ、アンカー間違えた。>>241じゃなくて>>243

246 :デフォルトの名無しさん:2015/08/10(月) 15:31:01.54 ID:6CToalvR
>>242
> 型ごと値ごとにアド・ホックな対応を付けて
> r を構成することはできない(任意の型のリストの任意の値を
> 取らなきゃいけないんで計算可能にならない)。
その条件が明記されているのはあまり見たことがないのですが、
暗黙の常識なのですか?

247 :デフォルトの名無しさん:2015/08/10(月) 15:32:35.38 ID:3agS2rXW
>>246
この文脈での「関数」が計算可能関数じゃなきゃいけないのは常識。

248 :デフォルトの名無しさん:2015/08/10(月) 15:39:35.42 ID:6CToalvR
>>244 >>247
すれ違いすみません。
> "odds"はIntについてしか定義できないだろ。
> 他の型についてどうやって定義すんだ?
Int以外についてはidにする、とかすればいいのではないですか?
そうしたときには
> この文脈での「関数」が計算可能関数じゃなきゃいけないのは常識。
計算可能でもあると思うのですが?
それに「この文脈」というのは今のような場面では少しいい加減な感じがしますが

249 :デフォルトの名無しさん:2015/08/10(月) 15:42:48.51 ID:3agS2rXW
まあ、こりゃアド・ホック多相の話をしてない、ってだけだな。

250 :デフォルトの名無しさん:2015/08/10(月) 15:46:02.23 ID:6CToalvR
>>249
「アド・ホック多相」という概念があって、
ここでは「ただしアド・ホック多相でないこと」という条件が暗黙に付いている
ということですか?

251 :デフォルトの名無しさん:2015/08/10(月) 16:08:40.11 ID: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.

252 :デフォルトの名無しさん:2015/08/10(月) 18:26:41.48 ID: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)」だけではその意図を正確に形式化できていないのではないか?
と疑問なのですが。。。

253 :デフォルトの名無しさん:2015/08/10(月) 19:25:00.79 ID:aurF6Aj8
ML多相はad hoc多相ではないし、プログラミング言語理論でpolymorphismと言ったらデフォルトでparametric polymorphism。Cardelliのチュートリアルから読み直せ。

254 :デフォルトの名無しさん:2015/08/10(月) 19:25:52.09 ID:aurF6Aj8
ついでに、∀でad hoc多相表すほうが稀だから。

255 :デフォルトの名無しさん:2015/08/10(月) 19:27:08.10 ID:xfbTbnyl
形式化はイントロ以外の本論か、普通の型理論の入門書を読み直そう。

256 :デフォルトの名無しさん:2015/08/10(月) 19:32:28.40 ID:G+nIt1Sd
associated data type は日本語では何と言うのが通例でしょうか。

257 :デフォルトの名無しさん:2015/08/10(月) 19:44:04.49 ID:yZ3j9jzU
どっかの大学のレポート課題?

258 :デフォルトの名無しさん:2015/08/10(月) 20:02:43.98 ID:G+nIt1Sd
>>257
私(>>256)への質問でしょうか。
勘違いでしたらすいません。

普通の社会人です。

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

単純に「関連データ型」でググっても associated data type に関連する記事は見当たりませんでした。

259 :デフォルトの名無しさん:2015/08/10(月) 20:31:37.97 ID:P/rKXiwW
VBAでもやってろよ

260 :デフォルトの名無しさん:2015/08/10(月) 20:54:08.85 ID:yZ3j9jzU
ある程度以上のプログラミングを日本語で勉強しようというのが無理なので英語のままで検索することをおすすめする

261 :デフォルトの名無しさん:2015/08/10(月) 21:23:30.78 ID:G+nIt1Sd
>>260
誤解させてしまったようです。
勉強のために日本語訳を訊いたのではなく、
単に日本語ならなんて言うのだろうかと思っただけです。

262 :デフォルトの名無しさん:2015/08/10(月) 22:11:23.36 ID:6CToalvR
結局、「r: ∀X. List(X) -> List(X)」という定式化ではパラメトリック多相性の意図を
正確に形式化できていないのではないか?という疑いは解けていないまま。。。

263 :デフォルトの名無しさん:2015/08/10(月) 23:19:26.21 ID:08na6m/L
どのように書かれていたら ID:6CToalvRは「正確に形式化できている」と判断するのだろうか

264 :デフォルトの名無しさん:2015/08/11(火) 00:48:36.91 ID:35SQIDRW
俺が悪いんじゃない、Wadlerの書き方が悪いんだ、と言いたいのかもな

265 :デフォルトの名無しさん:2015/08/11(火) 06:26:59.37 ID:hdf2tNQK
∀型の意味はSystem Fとして厳密に形式化されている。「型システム入門」にも書いてある初歩。

266 :デフォルトの名無しさん:2015/08/11(火) 06:30:12.53 ID:hdf2tNQK
Wadlerの論文でも4節のFigure 2でちゃんと定式化の復習してるじゃねーか。読まずに書くなよ

267 :デフォルトの名無しさん:2015/08/11(火) 06:36:13.99 ID:l/j/VTng
>>262

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

0255 デフォルトの名無しさん 2015/08/10 19:27:08
形式化はイントロ以外の本論か、普通の型理論の入門書を読み直そう。
ID:xfbTbnyl(1)

268 :デフォルトの名無しさん:2015/08/11(火) 08:39:19.79 ID:cH2UxrcD
パラメータ多相はtemplateのようなものに型名を渡すだけで実体化する

アドホック多相は実体化する前に
["a", "b"] |-> ["a", "b", "b"],
[1, 2] |-> [2, 1]
のような単相のコードを仕込んでおかないと実体化できない
つまり型名だけでなくコードとか色々な情報を注入している

269 :デフォルトの名無しさん:2015/08/11(火) 21:39:29.31 ID:csNtDDNc
パラメータ多相とかアドホック多相とかいろいろ出てるが
それらに共通の「多相」って何か言ってみろよ

270 :デフォルトの名無しさん:2015/08/12(水) 10:32:15.38 ID:E9Tw94sD
>>269
君はなぜ自分より知識や教養が上の相手にタメ口なんだ

271 :デフォルトの名無しさん:2015/08/13(木) 12:02:19.75 ID:mwGqyG64
>>270
答えられないのか?
ところで君はこのスレをご主人と崇める番犬なんだな?w

272 :デフォルトの名無しさん:2015/08/13(木) 15:16:34.02 ID:M3nW2qvP
基本的用語の検索もできない自称プログラマって生きてて恥ずかしくないの?
https://en.wikipedia.org/wiki/Polymorphism_(computer_science)

273 :デフォルトの名無しさん:2015/08/13(木) 15:18:03.14 ID:d32APRUA
大学1年生か2年生の課題とかじゃない?

274 :デフォルトの名無しさん:2015/08/13(木) 15:24:02.22 ID:Po5dRgtj
多相を分かりやすく言うと「単相ではない」という意味です
単相は昔からみんな知ってたやつなので分かりやすい

275 :デフォルトの名無しさん:2015/08/13(木) 15:52:21.18 ID:Gt0qYtbN
>>271
おまえみたいなダメ学生のレポート代筆を誰が手伝うかってことです。

276 :デフォルトの名無しさん:2015/08/13(木) 16:02:02.25 ID:Gt0qYtbN
田舎の秀才というか、狭い世界で褒められてるうちに
自我が肥大してしまっていつしか
「わからなくてもコツコツ勉強するのは大事」
「世の中わからんこともある」
「わからんのは、教え方が悪いからとは限らず、自分の知力の限界かもしれない」
というようなことを認めようとしないまま中途半端な歳まで来ちゃうと限りなくアウトに
近い。

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


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


たまに親切な誰かが丁寧に教えてやっても礼の一言も述べず
「ふーん、なんか結局モナドって合成できないからプログラミングにとって致命的じゃん」
とか、言ってる本人にも意味不明なワードサラダめいたポエムを投げることしかできない。

277 :デフォルトの名無しさん:2015/08/13(木) 19:19:34.10 ID:mwGqyG64
>>276
君どうしちゃったんだ?w
本題についてだけ静かに語ればいいんだよ

278 :デフォルトの名無しさん:2015/08/13(木) 19:56:35.31 ID:Gt0qYtbN
>>277
まあそんなに落ち込むな。

279 :デフォルトの名無しさん:2015/08/13(木) 20:09:47.48 ID:kVSCQFgg
自演して一人盛り上がってるアホを見た

280 :デフォルトの名無しさん:2015/08/13(木) 20:16:46.88 ID:cFZHcgXb
長文自己紹介とか草

281 :デフォルトの名無しさん:2015/08/13(木) 23:59:10.02 ID:/TT2ZElL
>>276
毛の壁宛なんだろうが、なんとなく流れ弾に中った感がある

282 :デフォルトの名無しさん:2015/08/14(金) 06:57:25.05 ID:UKR1Ens3
体育会系がルールにこだわるのは
ルールがなければ勝ち目のない相手にもルールを守らせれば勝てるからなんだよな

283 :デフォルトの名無しさん:2015/08/15(土) 12:23:13.66 ID:fL/PzS3/
そんなことってあるか?

284 :デフォルトの名無しさん:2015/08/15(土) 14:50:11.24 ID:U2H5mvyM
常識でしょ
「勝ちたいのならルールを作る側になれ」てよく言うじゃん
そういう意味で体育会系を束ねるのは楽だけどな

285 :デフォルトの名無しさん:2015/08/15(土) 16:27:38.46 ID:fL/PzS3/
「常識でしょ」

286 :デフォルトの名無しさん:2015/08/15(土) 19:01:57.66 ID:ijksDLQO
「選択と集中」だとか「勝ちたいのならルールを作る側になれ」とか
カモリーマン相手の自称ベテランコンサルタントが言いそうな言葉っすね。

そういうゴミみたいな言葉を頭に突っ込むとゴミみたいな考えしか出てこないゴミ頭になります。

287 :デフォルトの名無しさん:2015/08/15(土) 19:48:49.12 ID:LE4LycT3
別に俺俺型クラス作ってもいいんやで

288 :デフォルトの名無しさん:2015/08/15(土) 20:18:09.10 ID:R9hEcy+E
うおおお いつの間にかhackageにあるソースコードがリッチになってる!
http://hackage.haskell.org/package/base-4.8.1.0/docs/src/GHC.Base.html#local-1627391929
どうやって作るんだこれ…

289 :デフォルトの名無しさん:2015/08/15(土) 21:16:49.43 ID:2DqmJ2ZC
仕様を作る側って素人でもなれるんだろ
プロは他人が作る仕様 (変更) を予知するべき

290 :デフォルトの名無しさん:2015/08/16(日) 03:11:32.19 ID:uK7XPl3A
ちょっと何言ってるか判らない

291 :デフォルトの名無しさん:2015/08/16(日) 06:31:17.72 ID:aYrENx1a
ワロタ
すげぇなw

https://dl.dropboxusercontent.com/u/7687891/join_to_Monad/join_to_Monad.html

292 :デフォルトの名無しさん:2015/08/16(日) 18:29:05.94 ID:Vkg3e5dl
>>291
若干長いけど良い記事だよね。

293 :デフォルトの名無しさん:2015/08/17(月) 23:42:32.36 ID:E8Zlkk8d
>>291 >>292
とても素直な気持ちのいい記事だね

294 :デフォルトの名無しさん:2015/08/18(火) 17:03:51.11 ID:j5KExTo2
いろいろHaskellが変わったらしいけど
今だとHaskellの入門書としてお勧めってどれになるんです?

295 :デフォルトの名無しさん:2015/08/18(火) 22:53:30.76 ID:1H/7a1LX
>>294
いろいろとか言っても Monad が Applicative になったとかそんな程度じゃないの?

296 :デフォルトの名無しさん:2015/08/19(水) 03:34:39.76 ID:fY37jawe
ねえ

Monad m => m (m a, m b) -> (m a, m b)
ってできるっけ?

297 :デフォルトの名無しさん:2015/08/19(水) 03:58:30.08 ID:fY37jawe
失礼。自己解決しました。
join . liftA (uncurry (liftA2 (,)))

298 :デフォルトの名無しさん:2015/08/20(木) 02:59:44.72 ID: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が要らない。

299 :デフォルトの名無しさん:2015/08/20(木) 07:37:43.38 ID:hMgOl3Ol
人には右利きと左利きがあって、左利きは「間違ってないか?」とよく言われるが
その問いに正解はない

300 :デフォルトの名無しさん:2015/08/21(金) 01:40:51.70 ID:fXEaGRk/
リトルエンディアン: しばしばビッグエンディアンより優れているとされる
ビッグエンディアン: しばしばリトルエンディアンより優れているとされる

301 :デフォルトの名無しさん:2015/08/21(金) 22:08:23.86 ID:oak8Xfw5
Wikipediaのエンディアンの項目を見ていて一番ばからしいと思ったのは、
エンディアンを切り替えられるバイエンディアンプロセッサ。

302 :デフォルトの名無しさん:2015/08/22(土) 00:31:10.13 ID:EXDcUcnU
なんか、すごいの来たー!!!
ttp://www.amazon.co.jp/圏論-原著第2版-Steve-Awodey/dp/432011115X/

あとこれも、
ttp://www.amazon.co.jp/圏論の歩き方-圏論の歩き方委員会/dp/4535787204/
以前の数学セミナー(だっけ?)の連載のまとめだと思うけど。

{- 間違えて sc の方に書き込んだら、まるっきり反応がなかった。 -}
{- で、.net で再投稿 -}

303 :デフォルトの名無しさん:2015/08/22(土) 01:20:33.93 ID:OQor0U0W
Wikipedia
>圏論を初期の学部生に教授することは強い反対にあっている。

にわかに圏論の勉強を始めない方が良い?

304 :デフォルトの名無しさん:2015/08/22(土) 01:53:23.77 ID:PkWehqCK
買うわ

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

他方、本当に計算の理論(例えば表示的意味論を展開する数学的構造な枠組みとしてのScottらの領域理論など)を
勉強して理解し将来的にはその分野で学術誌か国際会議に論文の1つでも通したいのならば、圏論の勉強は不可欠
(Scott理論の古典的で基礎的な部分の学習だけならば別に圏論を知らなくとも一応はできるけれどね)

306 :デフォルトの名無しさん:2015/08/22(土) 07:42:28.65 ID:pHk1lnIK
>>305
その説明もなんか変なんだよな
いい恰好したいなら金持ちか政治家になればいいのに
なんで批判する側もされる側も学者を標的にするのかさっぱりわからない

307 :デフォルトの名無しさん:2015/08/22(土) 10:28:17.35 ID:bUf5bCJ1
一言で言うと、自動車を運転するために熱力学や内燃機関について知る必要は全くないし
知っていても何の訳にもたたない。つまり熱力学だとかカルノーサイクルを勉強してるやつは
カッコつけたいだけのファッションバカにすぎない。

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

原理厨はなにかとあれこれ勉強しないとわからん言って脅してくるけど、俺達は反知性主義の
旗を掲げて徹底抗戦だ。

308 :デフォルトの名無しさん:2015/08/22(土) 10:33:20.58 ID:XZXv5ALV
例えがまるで的外れだ

309 :デフォルトの名無しさん:2015/08/22(土) 10:39:12.14 ID:Hb7eGyOr
「一言で言うと」で始まる長文を書いてる時点で

310 :デフォルトの名無しさん:2015/08/22(土) 11:04:44.83 ID:bUf5bCJ1
反知性主義自体には共鳴してくれるでしょ。圏論要らない。

311 :デフォルトの名無しさん:2015/08/22(土) 11:07:41.75 ID:Hb7eGyOr
「全く〜ない」
とか
「〜だけ」
とか
「〜にすぎない」
が多用されてる文章は確かに反知性主義的な感じがする。

312 :デフォルトの名無しさん:2015/08/22(土) 12:08:13.94 ID:pHk1lnIK
要らないというのはミニマリストの言葉なんです
ミニマリストが反知性の手口を学べばそっくりそのまま応用できる可能性が高い

313 :デフォルトの名無しさん:2015/08/23(日) 09:18:45.96 ID:bL4DWVex
>>302
宣伝乙(良い意味で)

314 :デフォルトの名無しさん:2015/08/23(日) 09:57:28.55 ID:LhCUqlmj
Haskell分かっても圏論が分かったことにはならないの?
どこで違いが出てくるの?

315 :デフォルトの名無しさん:2015/08/23(日) 11:44:34.87 ID:28kORioT
>>314
Haskは圏のなかでもやや特殊。型付のラムダ計算なんかを抽象化して得られる
圏と近い。例えば、Hask圏では A, B という対象に対して A->B という対象を作れるが、
このような性質は「一般の圏」にはない。

316 :デフォルトの名無しさん:2015/08/24(月) 02:49:24.38 ID:UcMD+ccy
まぁhaskellの学習に圏論必要ないってのはほんま

317 :デフォルトの名無しさん:2015/08/24(月) 08:58:11.78 ID:kCQmOeKa
圏論ワードに外来語的なニーズがあるというコンセンサス

318 :デフォルトの名無しさん:2015/08/24(月) 11:27:43.78 ID:/WF09MBN
Haskellの学習に圏論は必要ないし、そもそもプログラミングを学ぶ必要すらない。
俺達先進国の人間はベトナムの優秀なIT技術者を時給50円で死ぬまで使えば良いからだ。
そもそも何かを学ぶということは人間の自然に反する。言語を捨て、文明を捨て、原始に回帰すること
こそ人類の究極の目標である。

319 :デフォルトの名無しさん:2015/08/24(月) 11:43:02.32 ID:OjRQ25eS
知識がどうとかは、個人ベースの話なので、まったくどうでもいいし、着眼点がずれている
個人の人生のテーマなんぞは、本人にしか関係ないし、他人からしたらどうでもいいこと
お前が知識が要らないと考えるなら、そうすればいいし、俺らには関係ない、お好きにどうぞ

機能性を追及することが、人類の永遠のテーマなのです
分かりやすく言えば、100人の人間が集まって、その100人で、どういう機能を果たすか、ということ
昨今コミュニケーション能力が高らかに叫ばれるのは、そういうこと
ここで、知識は手段に過ぎず、目的になりえない

320 :デフォルトの名無しさん:2015/08/24(月) 12:00:06.78 ID:kCQmOeKa
100人がコミュニケーションすると80人が嘘をつき合計マイナス60人になる場合もある
マイナス60人は1人よりも小さい

321 :デフォルトの名無しさん:2015/08/24(月) 12:08:55.77 ID:OjRQ25eS
そうならないようにするのが、人類のテーマなんです

322 :デフォルトの名無しさん:2015/08/24(月) 13:50:02.35 ID:1q9FvsVI
ワクテカ
http://haskellformac.com

323 :デフォルトの名無しさん:2015/08/24(月) 13:50:44.81 ID:twgtagYC
mac 用IDE がもうすぐリリース

324 :デフォルトの名無しさん:2015/08/24(月) 13:51:24.77 ID:twgtagYC
すまん、かぶった

325 :デフォルトの名無しさん:2015/08/24(月) 19:00:25.78 ID:pjiRa/zc
>>318 建設会社でも行ってこい、

326 :デフォルトの名無しさん:2015/08/24(月) 19:03:26.28 ID:/WF09MBN
>>325
圏論厨を滅ぼすまではダメです

327 :デフォルトの名無しさん:2015/08/25(火) 02:06:08.16 ID:YISO+qUP
>>326 ワロタ、あれは生き残るパターンや。プログラミングの機械化がすすむ以上、おまいらが将来つかうことになるからな

328 :デフォルトの名無しさん:2015/08/25(火) 02:10:41.85 ID:YISO+qUP
そもそも真の圏論厨はlispで独自実装しそうなもんだが

329 :デフォルトの名無しさん:2015/08/25(火) 07:15:28.00 ID:oMRqhMXw
Lispと圏論は全然関係ないからやめろよ
C++使えよ
マクロじゃなくてテンプレートを使うんだぞ

330 :デフォルトの名無しさん:2015/08/25(火) 10:27:27.34 ID:Vmm9Vscj
>>315
それはむしろHaskellをやればCCCがすぐ分かるということだ
Haskellをやっても圏論は分からないという例はないの?

>>316
いやその逆で、圏論の学習の替わりにhaskellが使えるか?ということなんだが

331 :デフォルトの名無しさん:2015/08/25(火) 11:52:16.03 ID:oMRqhMXw
例というか、PerlのOOPが異端視されるのと同じ
Perlをいくら完璧に学習しても「OOPを正しく理解していない」と見做される

332 :デフォルトの名無しさん:2015/08/25(火) 12:14:07.00 ID:Vmm9Vscj
OOPと圏論を同列に並べるのはいかがなものか
OOPは茫漠とした思想みたいなもんだが圏論は違うだろ?

333 :デフォルトの名無しさん:2015/08/25(火) 13:33:39.80 ID:oMRqhMXw
違うだろ?ってみんなで答え合わせしないと確信を持てない時点でかなり怪しい
みんなで共有する知識はそういう怪しいものばかり
なので個人で頑張る

334 :デフォルトの名無しさん:2015/08/25(火) 14:11:55.34 ID:nys8WXaq
>>333
Haskellの話に圏論絡めてくる奴は皆殺しにしろとか言い出す
僕みたいな反知性主義者が「答え合わせ」に参加すると結論が歪む。

335 :デフォルトの名無しさん:2015/08/25(火) 15:35:47.03 ID:YISO+qUP
>>334 とりあえず通報しときました。

336 :デフォルトの名無しさん:2015/08/25(火) 21:13:15.88 ID:nys8WXaq
>>335
つうほうせんといてや〜

337 :デフォルトの名無しさん:2015/08/26(水) 01:43:51.18 ID:fE8RXalP
圏論やるより型クラス勉強してモナド使うほうがhaskellの勉強になるから

338 :デフォルトの名無しさん:2015/08/26(水) 08:31:04.41 ID:NnDRip21
>>337
そうやな!圏論いらんわ。
だいたいあいつらちょっと数学が得意だからって調子こいてるよな。

339 :デフォルトの名無しさん:2015/08/26(水) 12:27:26.78 ID:W/3BVY4r
いらんってことはないけどな。
圏論だと思って使わなくても圏論の概念は使うことになるし。
逆に言えばわざわざ圏論を学ばんでもどうせ触れるっつー話でもある。

俺ら日本語の文法をわざわざ学んでから喋っとるわけちゃうみたいに、
実用から入っていけばなんとなく自然な使い方もわかるようになるで。
まあ、どっちから入門してもかまへん。
ただ、圏論から入っていくやつをあえてディスるんはやめよで。

340 :デフォルトの名無しさん:2015/08/26(水) 13:44:56.04 ID:31UMARGP
私は関西人ではないのですが、『やめよで』は『やめような』という意味の関西弁として正統なのでしょうか?

341 :デフォルトの名無しさん:2015/08/26(水) 14:45:58.21 ID:gQwT5cTu
圏論は頭の体操にもなるし論文書いたり新しい技法を開発するレベルまでやりたいなら止めはしないが、
haskellのモナドを人に教えるときに圏論の話を絡める奴は全く信用できん、という程度の話。

342 :デフォルトの名無しさん:2015/08/26(水) 14:54:08.52 ID:H1SEqDeZ
>>337
>>338
>>339
君たち、
「Haskellやモナドを使うのに圏論を知っておく必要は全然ない」てのはよく聞くけど
それって、「そんなの知らなくてもできる仕事は一杯あるからね、下流底辺に。
上流の仕事は圏論が分かる層がやるから気にしなくていいよ。」ってニュアンス?

343 :デフォルトの名無しさん:2015/08/26(水) 15:30:11.46 ID:W/3BVY4r
>>342
「最初からハードル上げるな」という話。
Haskell でプログラミングするだけなら圏論を意識することはない。

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

先に Haskell を実用している人が圏論みても、
あ〜このパターンってこういう名前がついてんのね〜、ってくらいの感想だろうよ。

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

上手く使えるようになったつもりでもさー、全然知らなかった概念が頭の中に湧いて出てくるってことはないんだよ。
たとえ話で言えば、字を早く書きたくてペンの性能を目いっぱい追求して満足な結果が出るとするじゃん?
そしたら世の中には実はタイプライターがありました、ワードプロセッサがありました、っていう感じ。

345 :デフォルトの名無しさん:2015/08/26(水) 16:14:34.56 ID:9WcNfeqJ
目的や目標とするレベルが各人バラバラだから話が噛み合わない

346 :デフォルトの名無しさん:2015/08/26(水) 16:39:39.65 ID:U9Ynnj38
参考文献を書く義務とそれを読む自由と読まない自由があるけど
342のように自由というニュアンスを理解できない人が多い
で、自由ってよくわからんから全部義務にしようということで圏論まで強制されてしまう

347 :デフォルトの名無しさん:2015/08/26(水) 16:50:54.29 ID:W/3BVY4r
高度なことをしようと思えば高度な知識が必要だし、
ほどほどでいいならほどほどの知識でいいっていう当たり前の話だよな。

文章にきちんとまとめて発表しようとすると使う言葉が圏論の世界のものに
なってしまうからどうしてもそういう言葉を目にしてしまうだけで。

348 :デフォルトの名無しさん:2015/08/26(水) 21:07:20.44 ID:2om2SE56
数学界のデザパタの前にHaskellのデザパタを知りたい

349 :デフォルトの名無しさん:2015/08/26(水) 21:21:20.27 ID:6+xCvXdx
モナドだろ

350 :デフォルトの名無しさん:2015/08/26(水) 22:58:54.24 ID:H1SEqDeZ
>>346
自由とか義務とかの問題じゃないだろw
能力の問題
>>347
やっぱりHaskellより圏論の方が高度wってことね

351 :デフォルトの名無しさん:2015/08/26(水) 23:36:27.51 ID:NnDRip21
反知性主義者を代表して言わせてもらうが

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

以上です。

352 :デフォルトの名無しさん:2015/08/26(水) 23:47:35.06 ID:H1SEqDeZ
>>351
反知性主義者か。ええなあ。がんばってや

353 :デフォルトの名無しさん:2015/08/27(木) 05:45:42.82 ID:hpMNnVK0
>>351
その圏論を知らずにモナドを自由に使えているあなたが仮に圏論を学べば、
モナドを人に上手く教えたりもっと
自在にモナドを操れるようになるのかも知れないね。

354 :デフォルトの名無しさん:2015/08/27(木) 05:55:16.94 ID:V7YRDu0j
必要に足りてるならそれはそれでいいよ。

355 :デフォルトの名無しさん:2015/08/27(木) 07:04:42.40 ID:gHMFOOrZ
>>353
その例を一つ二つ挙げてみてよ

356 :デフォルトの名無しさん:2015/08/27(木) 07:15:24.26 ID:MMHzsuN9
べつにチューリング完全な言語を超えるような未知の能力を研究してるわけじゃないから
ただ型推論を使って動的型付け言語のレベルに追いつけるかどうかの問題

357 :デフォルトの名無しさん:2015/08/27(木) 07:48:02.01 ID:2fn5iyFt
何言ってんだこいつ?

358 :デフォルトの名無しさん:2015/08/27(木) 07:58:41.43 ID:MMHzsuN9
難聴乙

359 :デフォルトの名無しさん:2015/08/27(木) 08:41:46.96 ID:TbOH8VLZ
静的型付け言語がまるで動的型付け言語に劣っているかのような誤解を招く書き方ですね

360 :デフォルトの名無しさん:2015/08/27(木) 08:53:04.69 ID:2fn5iyFt
チューリング完全の枠を出ないと、超一般的な前提を言いながら、
ffiで各々が呼びだせば解決する程度の話をする頭の悪さ

361 :デフォルトの名無しさん:2015/08/27(木) 09:24:03.24 ID:MMHzsuN9
頭の良さってほんのわずかの差で一喜一憂するところが放射能に似ているよね

362 :デフォルトの名無しさん:2015/08/27(木) 09:57:44.93 ID:8/UVeoJ+
動的型つき言語は、再帰型のある静的型付き言語のサブセットだぞ

363 :デフォルトの名無しさん:2015/08/27(木) 11:07:03.44 ID:2fn5iyFt
>>361
すまんが放射能語ではなくて日本語で頼む

364 :デフォルトの名無しさん:2015/08/27(木) 12:31:59.92 ID:a/U6YIqa
haskellにどんなモナドがあって、どういう使い方をすればいいのかは圏論を学んでも分からんよ。
Freeモナドが、Stateが、Parsec.ParsecTが、あるいはXMonad.Core.Xがどういうモナドなのか、圏論が教えてくれることはない。

VisitorとSingletonとIteratorと各々を学ばなきゃ使えないのに、デザインパターンという言葉の意味にだけ耽溺する奴とよく似ている。
よっぽど学術的なことをしたいか、さもなければ馬鹿だ。
俺は「純粋関数型言語で副作用はどう書けばいいのか」という初学者の質問に「IOモナドがー」と馬鹿な答を書く馬鹿がこのスレにいたのをよく覚えている。
ttp://blog.jle.im/entry/io-monad-considered-harmful
スノッブ共からモナドや圏論の言葉を取り戻さないといけない。

365 :デフォルトの名無しさん:2015/08/27(木) 12:51:13.31 ID:a/bxJDEM
Stateモナドとかスタック作るまでのチュートリアルがほとんどで
結局どう使うかはほとんど説明されてなかったり

366 :デフォルトの名無しさん:2015/08/27(木) 12:59:12.92 ID:SD+R1pbM
>>365
実際あんまり使わないからだと思う。
それに、本当に状態操作が欲しいなら素直にSTモナド使うほうがいい。

367 :デフォルトの名無しさん:2015/08/27(木) 14:07:36.44 ID:V7YRDu0j
>>364
どういうモナドかは当然それぞれの性質があるんだろうけど、
共通する性質があってそれをモナドというパターンに当てはめてるんだから、
モナドがどういうものかは知らんと話にならんだろう。

デザインパターンに過剰にこだわるのが害悪の場合はあるが、説明に使う言葉に何を使えばいいっていうんだ?
っていうか、基礎的な質問ならキーワードとなる言葉を与えてウェブ検索させるってのは普通のことだろう。
共通認識できる「名前」が重要で、それが圏論由来のものであろうがそうでなかろうが重要じゃない。
既についている名前があるなら新しい言葉を発明することにどれだけ意味があるっていうんだ?

368 :デフォルトの名無しさん:2015/08/27(木) 15:20:33.74 ID:/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.

369 :デフォルトの名無しさん:2015/08/27(木) 15:33:29.45 ID:sT+Vb4An
>>364
うんうん、それもまた反知性主義だね!

反知性主義者たちがどんどん集まってきてうれしい。
Haskell界で声がでかい人で圏論にハッキリ嫌悪感を示してる人って山本センセぐらいしか
いないんで、貴重な同士だわ〜

370 :デフォルトの名無しさん:2015/08/27(木) 15:38:27.37 ID:sT+Vb4An
>>368
なんか糖衣にくるんで圏論に誘導しようとしてるような感じがして嫌だな。
参考文献に悪名高いMoggi(こいつのせいで調子こいて圏論言うやつが計算機科学に入ってきた)
が挙がってるし、ろくなもんじゃないだろ。

そもそも反知性主義者である俺は英語論文を読むなどというスノビズムに染まった行動には断固として反対なのだ。
日本男児なら日本語で語れ!

371 :反知性主義者:2015/08/27(木) 15:40:14.71 ID:V7YRDu0j
dg非jドアsポあjふぃおs打ksgふぁ: 打sjgdl:s
dscじょぎkdさkjgdskげj子rイオdsgkあd祖gsだ

j御k自ソアdgjポdsjgぴおdsあぽgだぽあ

372 :デフォルトの名無しさん:2015/08/27(木) 15:44:45.48 ID:a/bxJDEM
>>366
まあStateモナドは確かにそうなんだけど
そういう意味じゃなくてSTモナドも含めてきっちり実用面まで含めて状態計算関連の説明してる所ってほとんどないよね、ってことが言いたかった
ソース読めって言われればそれまでだけど

373 :デフォルトの名無しさん:2015/08/27(木) 15:48:48.19 ID:sT+Vb4An
だいたいね、

``It is doubtful that the structuring methods presented here would have been
discovered without the insight afforded by category theory.''

とか言い出してるあたりで、「あーこいつ自分が圏論を知ってますアピールしとるな」
と分かるじゃん。心の底では「Moggiくらいお前ら読めよ」とか思ってるわけ。
自分では圏論信者なんだけどそれは小乗の教えだとか密教だと思ってるわけ。
それで、大乗というか大衆バージョンの教えとして「ほら経典なんか勉強しなくても
この車輪を手で回すだけで救われますよ」とか大衆をバカにした布教をしてるんだよね。

そういう態度がいちいち鼻につくからね、圏論厨はキモいんですよ。

374 :デフォルトの名無しさん:2015/08/27(木) 15:59:38.82 ID:V7YRDu0j
じゃあどうするっていうんだ?
圏論的背景があるのはどうしたって動かせないだろう。
真髄を理解したければ圏論は必要じゃないか。

真髄は必要ない、ただ使えればいいっていう人向けの情報が嫌なら
もう Haskell 使うなよとしか言いようがないよ。

375 :デフォルトの名無しさん:2015/08/27(木) 17:02:40.00 ID:SD+R1pbM
>>372
STモナドはIOモナド理解してればそのまま使えるよね?
そして、IOモナド・STモナドの仕組みは原理としては別に難しくない

376 :デフォルトの名無しさん:2015/08/27(木) 17:06:24.88 ID:6g/R3ZXu
逆にわたくし、haskellしばらく勉強してきまして
そろそろ裏でどういう理論づけがあるのかなーみたいなことを知りたくなってきたのですが、
何かしらおすすめのルートはございますか(普通に圏論に入門してみればいいの?)

377 :デフォルトの名無しさん:2015/08/27(木) 17:37:41.46 ID:a/U6YIqa
反知性とかそういうのじゃなくてな、haskell初学者を惑わせるだけの圏論の話なんて必要無いってだけなんだ。
初心者が聞く「モナドって何?」っていう質問に圏論的な説明はじめるのは迂遠過ぎてhaskell難しいっていう印象しか残せない。

単に「中の値を直接取り出せないようなコンテナ型であっても、その中身を(安全に)操作、合成するための技法」の1つであると言えばいいのに、
それを「何故モナドという名前なのか」という意味に曲解し、そこだけ説明したり訂正したりする奴がいるから、haskellの真髄は圏論であると勘違いする人が出てくる。

圏論じゃなくて型付けラムダ計算あるいはSystemFがhaskellの基礎でしょ。
Control.MonadやControl.Categoryはあくまでも利便性を高めるためにあるもの。無くても不便なりに使える。
>>376 なので、haskellのコアな部分というなら型理論を学べば良い。ライブラリの中には圏論をベースにしたものがあるから、そっちの理論的背景を学びたいなら圏論を学べば良い。
圏論は間違ってもマクレーンの本からはじめない方がええ。最近ならもっといい(例が数学的過ぎない)文書がネット上にもある。
日本語だったら前スレにも出てた↓とか。
http://nineties.github.io/category-seminar/#/

378 :デフォルトの名無しさん:2015/08/27(木) 18:03:40.63 ID:sT+Vb4An
>>377
自分は反知性主義を掲げて圏論厨を批判してるけど、「なぜモナドという名前なのか」とか言い出す
圏論厨は見たことない。

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

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

ほらね、圏論ってのは意味がないんです。やめましょう。

379 :デフォルトの名無しさん:2015/08/27(木) 18:34:38.62 ID:75t8dyUl
Haskellの真髄は(->)
型クラスがなくても(->)は存在する
(->)がなければMonadもCategoryもない

380 :デフォルトの名無しさん:2015/08/27(木) 18:35:35.68 ID: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 だね」と返せるようになります。

381 :デフォルトの名無しさん:2015/08/27(木) 20:00:44.71 ID:kht9K5Vg
>>361 その前に頭の良さの定義を頼むw

382 :デフォルトの名無しさん:2015/08/27(木) 20:03:43.73 ID:gHMFOOrZ
>>380
反知性主義者というので期待してたが
結構知ってるよ的なので、ガッカリしたw

383 :デフォルトの名無しさん:2015/08/27(木) 20:18:05.69 ID:kht9K5Vg
お前ら人間なめんなよ、子供の算数を集合論ではじめときゃいいんだよ。

384 :デフォルトの名無しさん:2015/08/27(木) 21:38:54.38 ID:gHMFOOrZ
>>364
> VisitorとSingletonとIterator
これらデザパタはクソなのだが、モナドも同類なのか?
>「純粋関数型言語で副作用はどう書けばいいのか」という初学者の質問に「IOモナドがー」
Moggiはじめ皆そう言ってきてるんだが違うの?
> ttp://blog.jle.im/entry/io-monad-considered-harmful
これモナドを全否定してるかと思ったらそうでもないので期待外れ

>>377
> 圏論じゃなくて型付けラムダ計算あるいはSystemFがhaskellの基礎でしょ。
圏論は後者とどう違うという認識?

385 :デフォルトの名無しさん:2015/08/27(木) 21:59:24.02 ID:b8i3sMHc
>>377 >>380
ありがとうございます。
なんかある程度勉強してからだと「あ、そういうことね」っていうふうになれそう
というのに最近出会ってちょっと悔しかったので、やってみます

386 :デフォルトの名無しさん:2015/08/27(木) 22:16:22.24 ID:kht9K5Vg
tapl

387 :デフォルトの名無しさん:2015/08/27(木) 22:41:39.44 ID: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"
なんかを見ると良いと思います。

388 :デフォルトの名無しさん:2015/08/27(木) 23:45:18.92 ID:SD+R1pbM
圏論ねえ。数学的興味からHaskelltoha関係なく勉強したのだが、
Haskellに関する限り、Ekmettが何してるのか理解したい時に
少し役に立つ程度だと思う。

389 :デフォルトの名無しさん:2015/08/27(木) 23:58:49.19 ID:Rek5NYGp
Haskellと圏論の関わりなんて、IOを無矛盾に扱うために言語に追加導入できる最良の道具だったってだけのことで、
ラムダ計算とLisp・一階述語論理とPrologのような、その生い立ちに根源的に関っているもんじゃないからね
オナニーの道具としては最高なんだろう

390 :デフォルトの名無しさん:2015/08/28(金) 04:26:11.78 ID:SsK9tv39
普通andとorとnotしか使わないから述語論理も要らないな

391 :デフォルトの名無しさん:2015/08/28(金) 10:12:07.75 ID:ngZ5utA1
鹿児島県の伊藤祐一郎知事に言わせれば
「高校教育で女の子にサイン、コサイン、タンジェントを教えて何になるのか」
「社会の事象とか、植物の花とか草の名前を教えた方がいい」
ということになる。

392 :デフォルトの名無しさん:2015/08/28(金) 14:21:25.95 ID:UpW/wiba
>>390
普通∀や∃も使うだろう

393 :デフォルトの名無しさん:2015/08/28(金) 14:56:36.00 ID:SsK9tv39
>>391
関数の名前は知ってるけど内容は知らないんだろ
植物の名前でも同じことだ
名前ばっかり宣伝するのは本当に無意味だからやめればいい

394 :デフォルトの名無しさん:2015/08/28(金) 16:13:34.32 ID:hUebxbgg
ひゃっほーう stack 環境下でエディタの補完が効くようになったぜ!

395 :デフォルトの名無しさん:2015/08/28(金) 20:02:41.16 ID:UpW/wiba
圏論とHaskellとモナド。。。。。
ちょっと話が面白くなってる気がするな
反知性主義者や山本さんやらが出てきて。
勿論知性主義者が出てきてもいいよ
あれを読めとか何かを教えてやったとかつまらんこと言わずに
自分の見解を言ってくれ

396 :デフォルトの名無しさん:2015/08/28(金) 21:14:35.56 ID:YaVx9p2L
圏論なんてそんなに構えて勉強する、なんてスゴイものじゃないよ
おれはバカンス先のホテルで2冊も読んだらだいたい分かったよ

397 :デフォルトの名無しさん:2015/08/28(金) 22:12:50.40 ID:UpW/wiba
>>396
「スゴイ」とか「分かった」という語句を使う点がなんだかなと思うが。。。
すぐに分かったと言うあなたとなかなか分からん奴とは何が違うと思うか語ってみてくれないか

398 :デフォルトの名無しさん:2015/08/29(土) 14:46:46.88 ID:bSBiDVBZ
「C++完全に理解した」

399 :デフォルトの名無しさん:2015/08/29(土) 23:11:48.82 ID: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 を指定する項目は見あたらないようです。

不可能なのでしょうか。

400 :デフォルトの名無しさん:2015/08/29(土) 23:27:12.74 ID:UzL1ueYp
>> 399
たぶん、haddockセクションの html-location の項がそれ。

401 :デフォルトの名無しさん:2015/08/29(土) 23:38:33.21 ID:VDxSZNt2
>>400
そこに文字列を入れ、いろいろなパッケージをインストールしてみましたが、
何も変わりませんでした。

402 :デフォルトの名無しさん:2015/08/30(日) 00:01:23.79 ID:U2/m8tQL
ひょっとして、コメントアウトを外してない、なんてことはないかい?

-- html-location:

html-location: hoge
にしないといけないよ。

403 :デフォルトの名無しさん:2015/08/30(日) 00:21:30.92 ID:XpmQg4Hy
>>402
もちろん、コメントは外しています。

404 :デフォルトの名無しさん:2015/08/30(日) 00:38:28.61 ID:XpmQg4Hy
>>403
ちなみに、cabal install --haddock-html-location='・・・' で直接指定しても何も変わりませんでした。

405 :デフォルトの名無しさん:2015/08/30(日) 02:57:07.12 ID: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などを試したけど何も変わらず)

406 :デフォルトの名無しさん:2015/08/30(日) 10:45:14.93 ID: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 内のリンクだけがおかしいのです。


もう少しアプローチを変えて調べてみます。
ありがとうございました。

407 :405:2015/08/30(日) 11:56:14.08 ID: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を指示しても無視されるみたい)。

408 :デフォルトの名無しさん:2015/08/30(日) 12:43:47.11 ID: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 の挙動について詳しく解析していただいたのに活用できなくて申し訳ありません。
ただ、その解析方法や情報についてはとても勉強になりました。

ありがとうございました。

409 :デフォルトの名無しさん:2015/08/30(日) 13:07:09.40 ID:U2/m8tQL
おめでとう。
haddockのバグだったのか(cabalではなく)。
haskellのツール周りは色々混み合っててよくわかんないなあ。

410 :デフォルトの名無しさん:2015/08/30(日) 16:07:36.51 ID: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 関数を仕込んで調査したい時とか。

411 :デフォルトの名無しさん:2015/08/30(日) 21:36:21.87 ID:/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 }

412 :デフォルトの名無しさん:2015/08/31(月) 00:21:09.78 ID: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
--}

413 :412:2015/08/31(月) 00:22:07.09 ID: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)

414 :デフォルトの名無しさん:2015/08/31(月) 20:29:14.75 ID:YNC36to9
>>411 >>412
ありがとうございます。
そのままでは使えないのですが、考え方を参考にさせていただき、応用してみます。


ちなみに、さすがに Umai 型クラスにも、Nasu データ型にも手を加えずに実現する方法はないですよね。

415 :デフォルトの名無しさん:2015/08/31(月) 21:06:33.97 ID:BIyPIWGf
それならデフォルトの実装は別の場所に書いた方がよさそう
手を加えてはならない場所に書くのはリスクが大きすぎる

416 :デフォルトの名無しさん:2015/08/31(月) 21:21:39.09 ID:YNC36to9
>>415
すいません、そういう意味ではなくて、
Umai 型クラスに相当するものがライブラリで提供されていて、
こちらでは手が加えられないのです。

もし方法がないなら、ライブラリのソースはあるので、
アドバイスを参考に改変しようかと思います。

417 :デフォルトの名無しさん:2015/09/02(水) 01:39:18.87 ID:MPctfeu0
質問。infix pattern synonym の結合性って弄れないの?

418 :デフォルトの名無しさん:2015/09/02(水) 23:39:30.67 ID:VgKb5GV5
>>395
なんで君はいつも上目線なんだ

419 :デフォルトの名無しさん:2015/09/03(木) 05:35:30.84 ID:OYAV2gHU
謙虚月間です。皆さん九月は、他人の落ち度より自分の異常を優先して疑い、相手を尊重しましょう

420 :デフォルトの名無しさん:2015/09/04(金) 12:32:49.27 ID:5HbwgMaM
GHC が出力する実行バイナリがえらいデカいんやけど、これどうにかならんの?

421 :デフォルトの名無しさん:2015/09/04(金) 17:36:40.07 ID:KCyhzv12
atomの端末から起動しないとghc-mod使えない不具合辛い

422 :デフォルトの名無しさん:2015/09/04(金) 21:44:05.44 ID: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

423 :デフォルトの名無しさん:2015/09/05(土) 17:50:27.56 ID: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の関数を作り出せてしまうのは、
カリー化の考え方から見て矛盾があると思います。
どういう理屈でこれは成り立っているのでしょうか?

424 :デフォルトの名無しさん:2015/09/05(土) 18:08:50.90 ID:NPRaO0u1
中置演算子の部分適用は、適用する引数をどちらからも選べる特殊な機能で、
普通の部分適用と区別して「セクション」と呼ばれている。
いずれにせよ、実体は (¥str -> siplus str 2) のようなラムダ式作るのと変わらん。

425 :デフォルトの名無しさん:2015/09/05(土) 18:33:26.79 ID:zbNENDxs
>>424
なるほど、つまり中置記法の右側に値を置いたものは、
カリー化とは無関係で単にラムダの糖衣構文ってことなんですね。

426 :デフォルトの名無しさん:2015/09/05(土) 18:40:53.83 ID:NPRaO0u1
まあ、(flip siplus) 2 の糖衣だと思うんでもいいと思うけどな。

427 :デフォルトの名無しさん:2015/09/06(日) 00:53:10.15 ID:wfrbDpC5
二項演算子は後置演算子とみつけたり

428 :デフォルトの名無しさん:2015/09/06(日) 08:00:48.38 ID:SMmxtXxm
Haskellは二項演算子を愛し過ぎてる
1+が綺麗に書けるけど、そんなにこだわる機能じゃないと思う
むしろ二項演算子無くして前置に統一したほうがよく無いかな?

429 :デフォルトの名無しさん:2015/09/06(日) 08:29:11.83 ID:wfrbDpC5
>>428

a * x + b

なんてのをまともに書けない言語はアカンでしょ

430 :デフォルトの名無しさん:2015/09/06(日) 08:41:14.99 ID:SMmxtXxm
>>429
>a * x + b
つ (+ (* a x) b)

431 :デフォルトの名無しさん:2015/09/06(日) 09:30:37.52 ID:wfrbDpC5
>>430
そういうのが好きならLisp使えばいいじゃん。。。

432 :デフォルトの名無しさん:2015/09/06(日) 09:44:06.70 ID:Vj9nK5xC
>>427
それは嘘です
後置演算子の直後の二項演算子はセーフ x! * y
二項演算子の直後の二項演算子はアウト x + * y

>>419
「本当か嘘か」を優先して考え「謙虚か傲慢か」などという雑念は捨てました

433 :デフォルトの名無しさん:2015/09/06(日) 09:45:15.82 ID:OmMBsRo+
煽ってるのをオマエラじゃんw

434 :デフォルトの名無しさん:2015/09/06(日) 10:14:27.94 ID:wfrbDpC5
>>432
うーん、その例と「二項演算子は結合強度最弱の単項後置演算子とみなせる」
がどう矛盾するのかよくわからないです。

435 :デフォルトの名無しさん:2015/09/06(日) 10:31:40.00 ID:Vj9nK5xC
>>434
結合強度を変えてもsyntax errorを覆すことはできません

436 :デフォルトの名無しさん:2015/09/06(日) 10:59:37.29 ID:wfrbDpC5
>>435

x + * y 

によってあなたが何を例示したのか正直まったく理解できないのです。


元ネタは外国のブログ記事だった気がするけど見つからないので自己流解説すると、
なんか二項演算子(算術に限らない。ここでは (#) とする。)があって、そのシグネチャは

(#) :: X -> Y -> Z

だとしますね。そうすると x : X に対して作られるセクション x # は Y -> Z という型を持つわけですね。
そうすると、結局「あたかも」

postfix #
(#) :: X -> (Y->Z)

と定義されていた「かのごとく」見れますねという話をしてるつもりです。
(Haskellでは自前の後置演算子は作れないので上のは嘘コードですが)。

437 :デフォルトの名無しさん:2015/09/06(日) 17:00:24.15 ID:Vj9nK5xC
カリー化ですべての関数が単項演算になるはずだったのですね
ところが構文解析を見ると二項演算が存在する証拠が出てきたので理解できないと

438 :デフォルトの名無しさん:2015/09/06(日) 20:34:02.72 ID:2q2onHzV
概念の話をしてるのに実装の話をされても困りますね
ちょっと上のレスに出てるように二項演算子だと
# x
っていうように後ろの引数だけ適用もできることになってるからこれは後置単項演算子とは別物だよね

439 :デフォルトの名無しさん:2015/09/07(月) 06:23:10.52 ID:+vVUVgP4
素直に実装の話をされて困ることなんてないよ
実装の話じゃないから困らないよな?と言われて困ることはある
{-# LANGUAGE #-} とか

440 :デフォルトの名無しさん:2015/09/07(月) 21:31:00.77 ID:mXAJW74L
二項演算子は単項後置演算子みなせるよね
に対して
構文解析では二項演算子が分けてあるんだよ
と言われても はあそうですか としかならないがな
なぜ構文解析上分けてあるかの理由まで示されると納得しそうだが

441 :デフォルトの名無しさん:2015/09/07(月) 23:06:47.81 ID:+gBmAsnf
>>436
Applicativeスタイルを使うときに出てくる「途中の式」はそうやって考えるとわかりやすいね。

442 :デフォルトの名無しさん:2015/09/07(月) 23:35:52.84 ID:saV1gx5W
>単項後置演算子
今日はじめて知ったんだが、実は出来るぜ。
{-# LANGUAGE PostfixOperators #-}

data Currency = Yen Int deriving Show

(¥) :: Int -> Currency
(¥) = Yen

main = print (105 ¥)
{--
> :main
Yen 105
--}

443 :デフォルトの名無しさん:2015/09/08(火) 00:02:16.96 ID:FdaSRh76
>>440
それが後置演算子だとすると
(2 +)と(+ 2) で(+)が別の演算子だということになってしまう。
数式の構文解析で(-)が単項演算子と二項演算子の両方に使われるせいで
BNFが無駄に複雑化するの知ってるでしょ?
同じことが(-)だけでなく二項演算子一般について大規模に生じてイヤなわけ。

444 :デフォルトの名無しさん:2015/09/08(火) 04:52:37.64 ID:5w88oMs5
>>440
構文は理由より人気を優先した方がいい
どんな理由を示してもおそらくライバルの1.05倍くらいのメリットしか出てこない
一方、理屈抜きで人気投票すれば1000倍とか差がつく可能性がある

445 :デフォルトの名無しさん:2015/09/08(火) 21:51:21.00 ID:1BhJxNoG
「モナドは値を箱の中に入れるので外からは見えない、だから安全だ」
っていう話をよく聞くけど、納得いかない。

例えばMaybeモナドの中に値を入れても、fromJustで簡単に取り出せるし、
入れる時もJustで簡単に入るじゃん。

こんなユルユルの箱に入れたところで何が安全なの?

446 :デフォルトの名無しさん:2015/09/08(火) 22:00:09.71 ID:KAkZMLHa
入れたままで扱えるから便利なんだよ。
(IO は別)

447 :デフォルトの名無しさん:2015/09/08(火) 22:03:02.01 ID:gWCBxnxw
>>445
箱の喩えでいうなら、その箱から中身を取り出したままでいられる仕組みは
モナドの範疇ではないよ。

Monad 型クラスのインスタンスであるその型に付随された
モナドとは何の関係もない機能だ。

448 :デフォルトの名無しさん:2015/09/08(火) 22:04:03.13 ID:FdaSRh76
>>445
>「モナドは値を箱の中に入れるので外からは見えない、だから安全だ」
>っていう話をよく聞くけど、

そんな話を聞いた覚えがないのだが……

449 :デフォルトの名無しさん:2015/09/08(火) 22:11:56.24 ID:CPV+4Ywq
自分も聞いたことないな
安全だって言ってる文献を教えて欲しい

450 :デフォルトの名無しさん:2015/09/08(火) 22:15:43.73 ID:1BhJxNoG
>>447
でも取り出す機能を簡単に付けられるのであれば、箱としての堅牢性は無いに等しいじゃん。
一回入れたらもう出せない!ってのならわかるけど。

>>448-449
IOモナドなんかそんな風に言われるじゃん。
でもIOモナドに入れた値だってfromJustで取り出せる。

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

???
まず前半、聞いたことがない。そういうこと言ってる実例挙げられる?
後半、意味がわからない。

452 :デフォルトの名無しさん:2015/09/08(火) 22:18:26.87 ID:CPV+4Ywq
もしかしてMaybeなどのモナドを使うことで付く分岐による安全性を
「モナドは外からは見えないから安全」という話に思い込んだんじゃ?

453 :デフォルトの名無しさん:2015/09/08(火) 22:20:00.08 ID:1BhJxNoG
出直してきます

454 :デフォルトの名無しさん:2015/09/08(火) 22:20:30.14 ID:CPV+4Ywq
どうやら根本から勘違いしてただけだったか・・・

455 :デフォルトの名無しさん:2015/09/08(火) 23:38:38.43 ID:vkbbpybQ
まあ気持ちはわかるわ。俺もはじめの頃は、Maybeモナドは腑に落ちんかった。
パターンマッチでいつでも値取り出せるじゃん。って。

モナドはデストラクタを隠蔽するのが肝なんだよな。
だからparsecとかIOとかをみて、初めてありがたみがわかった。

456 :デフォルトの名無しさん:2015/09/08(火) 23:44:27.36 ID:FdaSRh76
>>455
>モナドはデストラクタを隠蔽するのが肝なんだよな。

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

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

うーん、その感覚はさっぱり
隠蔽云々とは関係なくリストモナドだろうがIOモナドだろうがありがたいけどなあ

457 :デフォルトの名無しさん:2015/09/08(火) 23:52:35.54 ID:FdaSRh76
Maybeモナドの場合なら、return (つまりJust)に突っ込んで得られない
Maybe a の値、つまりNothingによって集合aを拡大していることになるわけで、
この拡大された集合a+上の計算を、元々のaの計算から自然に与えることが
できるようなそういう拡大の仕方とその構造のことをモナドというわけ。
Maybeほどストレートではないけど、他のモナドも基本は一緒。

これはデータ構築子が公開されててパターンマッチできるかどうか、とか
或いはそれと等価な関数が公開されてるかどうか、とかとは関係のない話。

458 :デフォルトの名無しさん:2015/09/09(水) 00:06:36.58 ID:EJNsNdDh
関数型言語ってのは
要するに
OOPでクラス関数で主に記述するってことと同じでしょ?
メンバ関数・変数をなるべく使わずに

何がすごいのかさっぱりわからない

459 :デフォルトの名無しさん:2015/09/09(水) 00:14:15.49 ID:15Wbqaqp
あなたがそう思うならそれでいいんじゃないの
誰が関数型言語使えと頼むじゃなし使わないと死ぬわけでもなし

460 :デフォルトの名無しさん:2015/09/09(水) 00:50:04.74 ID:+WsBDtot
荒くれ者のC++erがHaskellやると
バグめっちゃ減るんすよwwww
その代わりコンパイル通りににくくなるんで慣れるまでめっちゃ苛々するんすけど
実行時にヘマするくらいならコンパイル失敗した方がマシだってことを学ぶんすよwww

もうC++は体力続かない
三ヶ月前のコードとか読みたくないでしょ
歳取ったらHaskellが良いって解りますよ
Haskellなら三ヶ月前のコード、また読んでみてもいいかなって、それはとっても嬉しいなって

461 :デフォルトの名無しさん:2015/09/09(水) 01:57:38.90 ID:rpodVdIT
>> 457
なんていうか上手く言えないんだけど、例えば、
データ構築子がreturnとbindしか無くて、一方分解子、runの類いがたくさん提供されてるデータを考えてくれ。
どうだいそれって滅茶苦茶役に立たないだろ?

462 :デフォルトの名無しさん:2015/09/09(水) 02:07:49.07 ID:15Wbqaqp
>>461
>データ構築子がreturnとbindしか無くて、一方分解子、runの類いがたくさん提供されてるデータを考えてくれ。

なにが言いたいのか理解できないが、いずれにせよreturn とbind があれば
他のはそれから定義できるんだからなにも問題ない
runXXの類がたくさん提供されてる、というのもよくわからんが、
それで有用性が損なわれるとはちっとも思えない

463 :デフォルトの名無しさん:2015/09/09(水) 02:09:55.95 ID:15Wbqaqp
あと、データ構築子とreturn/bindは違うものなんでそこのところ宜しく
もし、returnでしか当該データ型の値が作れないならrunXX云々以前にそりゃ役には立たない
m a 型の計算が実質的に a 型の計算そのものに崩壊するからな

464 :デフォルトの名無しさん:2015/09/09(水) 02:28:58.80 ID:rpodVdIT
そうそう。そんな感じ。
だからモナドにするならreturn以外にカスタムコンストラクタをたくさん提供するべき。
逆にコモナドなら、コンストラクタは少なくていい。けど、デストラクタはextractだけじゃだめ。

(俺は_ -> Hoge のヤツをHogeのコンストラクタ、Hoge -> _ をデストラクタって呼んでる。異端かもしれんが)

465 :デフォルトの名無しさん:2015/09/09(水) 02:39:48.87 ID:15Wbqaqp
>>464
>だからモナドにするならreturn以外にカスタムコンストラクタをたくさん提供するべき。

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

しかもなんで「べき」なわけ?
Maybe型が役に立たなかったことなんかないだろう
あと、勝手な自分用語振り回されても理解できない(するきになれない)

466 :デフォルトの名無しさん:2015/09/09(水) 02:57:08.05 ID:rpodVdIT
オレオレ用語で分かりにくくて、すまんかった。共通の言葉遣いは大事だよね。データ構築子はdata Hoge a = Hoge ... の奴でいいよね?

ところでさ、ライブラリを作っていて、データの内部表現を公開したくない時があるじゃない?
あとでチューニングしたいときとか。そういう時にデータがモナドなら主に ... -> Hoge a を、コモナドなら Hoge a -> ... を提供する。
return / extract に加えて。

理由は、えー… 逆だと使いづらいから。
(たとえばMaybeなら、fromJustってあんまり使わないでしょ?)

467 :デフォルトの名無しさん:2015/09/09(水) 02:58:54.11 ID:FLIFW6sl
なんか変な主張と独自用語のレスが続くね…
荒らしかな

468 :デフォルトの名無しさん:2015/09/09(水) 03:07:23.01 ID:rpodVdIT
あ゛ーそのつもりはないんだけど… スレ汚してスマンね。

理由が弱いので、もう少し考えると、
例えば、doの途中でrunして値を取り出して、その値で分岐して別のモナディックアクションにつなぐのは、計算量が無駄。
それを避けるためにモナド(手続きの抽象)がある、と俺は理解している。

469 :デフォルトの名無しさん:2015/09/09(水) 03:13:59.62 ID:15Wbqaqp
データ構築子を公開したくない、というのはわかる
パターンマッチで実体取り出されたくないとき
(実体に依存した利用をされたくないとき)、というのはあるからな

だが、「return に加えて」は意味不明だ

作ろうとするモナドが恒等モナド以上の何かであろうとする限り、
returnでは作れないようなモナド値を構成する方法を提供しなければならない
これは内部表現の隠蔽云々とは何の関係もない
そうしないと使いづらいからではなく、そうしないと恒等モナド以上の
機能を有し得ないから、だ

fromJustを使わない(データ構築子 Just のパターンマッチも使わない)、
というなら、コード全体がモナディックになってしまう
(もちろんnon-monadicなコードは恒等モナドによってまったく等価な
 monadicなコードとして書けるが、普通はそんなことはしない)

はっきりいって、何が言いたいのか本当にわからない……

470 :デフォルトの名無しさん:2015/09/09(水) 03:14:53.69 ID:FLIFW6sl
>>468
こっちもすまん、>>466見る前に書き込んだから

471 :デフォルトの名無しさん:2015/09/09(水) 03:20:21.85 ID:15Wbqaqp
>>468
>例えば、doの途中でrunして値を取り出して、その値で分岐して別のモナディックアクションにつなぐのは、計算量が無駄。
>それを避けるためにモナド(手続きの抽象)がある、と俺は理解している。

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

-- オーダー以外の意味で「計算量」を使われるのも違和感があるが

472 :デフォルトの名無しさん:2015/09/09(水) 03:21:55.11 ID:FLIFW6sl
>>468
>例えば、doの途中でrunして値を取り出して、その値で分岐して
>別のモナディックアクションにつなぐのは、計算量が無駄。
>それを避けるためにモナド(手続きの抽象)がある、と俺は理解している。
別のモナディックアクションにつなぐのが計算量の無駄というのが、
わからんのだけど
よく言われるように、用途の文脈を明確にしたい場合に使ってる事が多いし

473 :デフォルトの名無しさん:2015/09/09(水) 03:27:24.33 ID:15Wbqaqp
>>472
Reader モナドで、逐一runReaderを使い r->a 型関数に戻すのが手間だ、
くらいの意味だろう。そりゃモナドの中で計算を合成できる方がいいしが、
指摘の通り、手間や関数適用コストの僅かな定数的増大よりは、文脈を切らずに
連続させることの利益が目的でdo 記法を使うはずだ、と私も思う。

474 :デフォルトの名無しさん:2015/09/09(水) 04:04:10.81 ID:FLIFW6sl
読み直したけど主張が纏まってないのと、レスが補強になってない
少し落ち着いて

>>473
それで意味がわかりましたが、自分も正に>>471と同じ事を思いました
モナド無くていいじゃん、と

475 :デフォルトの名無しさん:2015/09/09(水) 05:16:14.00 ID:k6Vctrbh
>>467
「計算は論理の物質化である」

476 :デフォルトの名無しさん:2015/09/09(水) 06:53:19.57 ID:5v/OlT8A
>>458
OOPがわかってもC++がさっぱりわからないのと同じ

C++がわかればstaticメンバが何の役に立つのかわかる

477 :デフォルトの名無しさん:2015/09/09(水) 07:44:14.88 ID:yxoakRA/
なんでMonadはApplicativeのインスタンスじゃないの?

478 :デフォルトの名無しさん:2015/09/09(水) 11:27:05.24 ID:Gx2jhnq1
いまはApplicativeだよ

479 :デフォルトの名無しさん:2015/09/09(水) 11:44:28.09 ID:15Wbqaqp
Monadにはできない(或いは非効率)だけど、Functorよりは強い構造を
持ってる有用なデータ型が多いことがHaskellでのプログラミングの進展に
よって後になってから判明したから

後付で用意されたんで、元からあるMonadの定義には手を付けなかった

480 :デフォルトの名無しさん:2015/09/09(水) 15:58:18.64 ID:Q+d8J0F/
>>445
藁人形を殴るのやめろ

481 :デフォルトの名無しさん:2015/09/09(水) 18:35:43.48 ID:wpO/WxMy
RTS上のデータ域に直接的にアクセスできるらしいな
unboxedが最速かと思ったがもう一つ隠し玉があるのか

482 :デフォルトの名無しさん:2015/09/09(水) 20:47:23.14 ID:yxoakRA/
<*> <*>

483 :デフォルトの名無しさん:2015/09/09(水) 20:48:31.78 ID:15Wbqaqp
FFIのためにCに揃えてメモリ剥き出しでデータ配置してる場合のことでしょ

484 :デフォルトの名無しさん:2015/09/11(金) 17:09:38.98 ID:yMgx5TOb
StateはStateT Identityとして定義されてるのに、なぜMaybeはMaybeTを使って定義されていないのでしょう?

485 :デフォルトの名無しさん:2015/09/11(金) 18:51:03.18 ID:KUqdYwfe
>>484
Stateは、状態をあとづけでつける場合に使われるからモナド変換子なのかなぁ。。。?

486 :デフォルトの名無しさん:2015/09/11(金) 19:36:27.09 ID:v/2h2RVh
MaybeはEitherを使って定義されなかったという前例がある

487 :デフォルトの名無しさん:2015/09/11(金) 20:01:00.74 ID:2FuYRHxl
そらそうだろ、という気もするのだが、

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

みたいな話?

488 :デフォルトの名無しさん:2015/09/11(金) 20:39:04.30 ID:v/2h2RVh
unitはidentityに似てるからいいんじゃね

489 :デフォルトの名無しさん:2015/09/12(土) 09:02:59.99 ID:8GXyupq5
よく頭のおかしいバカが「スケーラビリティ」とほざくが
大抵それは「前例のない規模で前例を踏襲する」ことだ

490 :デフォルトの名無しさん:2015/09/12(土) 09:43:20.01 ID:UPPQquvW
>>489
「前例のある規模で前例を踏襲することができない」よりはいいんじゃね

491 :デフォルトの名無しさん:2015/09/12(土) 20:12:10.06 ID:XAqQ9sMD
そんなになんでも簡単にスケールしてもらってはエンジニアがご飯が食べれなくなるので困る
軽トラをCADで拡大して4tトラックになるんだったら仕事なくなる
実際には現実世界の各種係数があって、そっちはスケールしないので無理なわけだが
CAD内でデータを拡大しても、重力やら鉄の剛性やら法律やらetcの
現実世界まで一緒に拡大されるわけではないからな、不整合が起こる

492 :デフォルトの名無しさん:2015/09/12(土) 22:59:42.17 ID:8GXyupq5
不整合そのものを認識できないバカは少ない
拡大できない現実が悪いか、拡大できると言う虚言癖が悪いかを判断できないバカが多い

493 :デフォルトの名無しさん:2015/09/13(日) 13:03:42.57 ID:kiB/x+KN
えー

494 :デフォルトの名無しさん:2015/09/13(日) 14:50:26.51 ID:mhOIQ8p/
○○されると仕事がなくなるというのは現実的にあるとしても、
だから○○は止めろとグチを言って前へ進まないのはただの甘えです。


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

ステージクリア型のゲームを作っていると、ステージプレイ中はGCを止めて、
クリアしたりミスしたタイミングで一気にゴミ回収したいことってありませんか?
他にも、3DCGツールを作っていて、レンダリング中ではなく完了後にゴミを回収したい、とか。

495 :デフォルトの名無しさん:2015/09/13(日) 15:44:15.42 ID:x1dh+v5m
>>494
GC止めるのはできないはず
System.Mem以下の関数で明示的に起動することはできる

RTSオプションの -I フラグ辺りを見るといいのかもしれない

496 :デフォルトの名無しさん:2015/09/13(日) 17:52:56.94 ID:m/zohjMN
>>494
あるある
入力待ちに入る瞬間に軽くGCしといて欲しいとか考える

497 :デフォルトの名無しさん:2015/09/13(日) 22:09:38.34 ID:mhOIQ8p/
>>495
ユーザーガイドを見てみました。

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

試してみます。
ありがとうございました。

498 :デフォルトの名無しさん:2015/09/17(木) 15:51:54.68 ID:B1grEVzP
近頃ホットなライブラリは?

499 :デフォルトの名無しさん:2015/09/18(金) 01:29:26.35 ID:wjuvkHJc
tanakahってネトウヨなのか

500 :デフォルトの名無しさん:2015/09/18(金) 13:33:55.01 ID:YvxDAq3A
そんなことはない。彼は六年前に衆議院総選挙で民主党に投票した過去がある。よほど懲りたとみえる

501 :デフォルトの名無しさん:2015/09/18(金) 15:57:30.16 ID:hYbUwCNL
民主に騙されてアホウヨになってしまったんだね

502 :デフォルトの名無しさん:2015/09/18(金) 17:03:07.30 ID:4VBZsKU6
どんな嘘に騙されたのか知らんが
騙されたというならもっとこう、嘘を絶対に許さない的な理念があるべきじゃないのか
人を分類して煽り合うだけでは嘘は無くならないだろう

503 :デフォルトの名無しさん:2015/09/18(金) 19:10:38.07 ID:YvxDAq3A
Haskellでこの世から嘘をなくせるのか?
プログラミングの話をしてくれ

504 :デフォルトの名無しさん:2015/09/18(金) 22:09:52.30 ID:dOXUeH6Y
嘘を見抜くソフトを開発すればいい

うまい嘘をつくためにも使えちゃうか

505 :デフォルトの名無しさん:2015/09/18(金) 23:39:24.36 ID:hYbUwCNL
tanakahがおかしいのは昔からだ

506 :デフォルトの名無しさん:2015/09/18(金) 23:58:08.05 ID: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 を覚えておいたり、構築中の巡回置換リストを保存するなどのために
いくつものアキュムレータを付けた再帰関数を作っている事。
もうひとつは、置換前リストや置換後リストから要素を探すときにいちいち先頭から順に探している事。

宣言的とはとても言えないコードになってしまうなですが、良い方法はないでしょうか。

507 :デフォルトの名無しさん:2015/09/19(土) 03:37:04.08 ID:ygsDvVju
Hideyuki Tanaka ‏@tanakh
憲法守れ!検閲反対!憲法守れ!検閲反対!

検閲する側の人間を支持していてこれか
脳みそ入ってないでしょ

508 :デフォルトの名無しさん:2015/09/19(土) 08:31:20.34 ID:oTM0A26u
ここはHaskellのプログラミングについて語るスレです。プログラマ個人について語るスレではありません

509 :デフォルトの名無しさん:2015/09/19(土) 09:58:08.46 ID: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)

510 :デフォルトの名無しさん:2015/09/19(土) 11:38:35.20 ID:9U4PsEMd
めっちゃ素朴で雑談的な疑問: 長い函数合成書く時に、ついAしてBして…っていうふうに考えてしまって
右から順に書いてしまう (極端には filter even 書いてからその左に length . って書き加える)
んですが、これは慣れてもそういうもの?
それともそのうち「最終的に欲しいのはこれだから」みたいに左から書くようになる?

511 :デフォルトの名無しさん:2015/09/19(土) 11:55:02.12 ID:uMEyIMVB
自分も同じ疑問感じるわ
今はタイプするのが楽だから左から書いてるけど
一度右からの流れを思い浮かべてから逆順をたどるように書くみたいにしかできてない
左から考えられるようになるものなのか?そもそもなるべきなのか?どうなんだろう

512 :デフォルトの名無しさん:2015/09/19(土) 12:03:35.61 ID:dgpmJE92
>>510
右から左に思考の順番通り書くので何の問題もない。
カーソルの戻りがイヤで左から右にしたいなら

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

とか

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

とかを使えばいいよ。

簡単な短いものはボトムアップで考えて関数合成の連鎖で直接書いてしまうし、
複雑な関数は「欲しいのはこれだから」みたいにトップダウンで定義を考えて
(where節がどんどん入れ子になる感じで)書いていく。

513 :デフォルトの名無しさん:2015/09/19(土) 12:36:41.64 ID:UoEBemSS
左に書き加えるとかはHaskellではなくVimの話題のような気がする

514 :デフォルトの名無しさん:2015/09/20(日) 00:25:40.61 ID:6c+MIwD/
田中さん完全にネトウヨなんだな

515 :デフォルトの名無しさん:2015/09/20(日) 09:21:19.17 ID:ZXXgaQ/P
>>509
レスが遅くなってすいません。

その関数 f の意図が今一分からないのですが、
例えば f 2 [(2, 4), (3, 2), (1, 1), (4, 3)] とやってみると結果は
Just (4, [(3, 2), (1, 1), (4, 4)]) となるのですが、
これは意図通りの結果でしょうか?

516 :デフォルトの名無しさん:2015/09/20(日) 09:23:48.87 ID: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)]) になります。

517 :デフォルトの名無しさん:2015/09/20(日) 10:33:01.14 ID:nVyOckkY
>>516
[(2, 4), (3, 2), (1, 1), (4, 3)]の先頭の(2, 4)はfを使わなくても処理できるので
そこでfを使う意図はありません
次の段階でf 4 [(3, 2), (1, 1), (4, 3)]のような使い方を意図しています

518 :デフォルトの名無しさん:2015/09/20(日) 11:37:14.05 ID:629ydc81
脳みそ入ってるか入ってないか判らないときはMaybeモナドに包んで処理って習った

519 :デフォルトの名無しさん:2015/09/20(日) 12:05:14.46 ID:OSUmrGRk
>>506でやりたいのっていわゆる強連結成分分解じゃないの
ググればしっくりくる解き方があるんじゃないかな

520 :デフォルトの名無しさん:2015/09/20(日) 12:24:31.09 ID:oJTeEA6y
宣言的なコードをあきらめればいい

521 :デフォルトの名無しさん:2015/09/20(日) 12:40:33.83 ID:629ydc81
シンプルに総当りしてマッチしたものを返せばいい

522 :デフォルトの名無しさん:2015/09/20(日) 13:13:36.11 ID:ZXXgaQ/P
>>517
すいません、やはり意味がよく分かりません。

関数 f の各引数と戻り値の意味を教えていただけないでしょうか。

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

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


>>521
総当たりというのが具体的にどのような処理を指しているのか分かりませんが、
それは結局 >>506 になるのではありませんか?

524 :デフォルトの名無しさん:2015/09/20(日) 16:52:06.13 ID: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回やるより速い方法が絶対あると思う(メモ化するとか)

525 :デフォルトの名無しさん:2015/09/20(日) 17:24:46.74 ID:9hEz0Smr
みんなもう買ったか?

文芸誌「新潮」4千部増刷 筒井康隆さんの長編小説掲載
http://www.asahi.com/articles/ASH9K61F1H9KUCVL01X.html

新潮社は17日、文芸誌「新潮」10月号(初版8900部)の4千部の増刷を決めた。
同号には筒井康隆さんの長編小説「モナドの領域」が掲載され、本人がツイッターで「わが最高傑作にして、おそらくは最後の長篇(ちょうへん)」とつぶやくなど話題となっていた。

526 :デフォルトの名無しさん:2015/09/21(月) 00:14:56.43 ID: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]]

527 :デフォルトの名無しさん:2015/09/21(月) 00:49:50.78 ID: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')

528 :デフォルトの名無しさん:2015/09/21(月) 12:16:42.04 ID:/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 も、集合が整数の連続した列と一対一に対応できること前提なのですね。
まぁ、集合をリストで表現できる時点で要素に番号付けは可能なので、
テーブルか何かでも作っておけば、理論上は整数の巡回置換のリストから元の要素へ戻せますが、
手間と処理時間は少しだけ増えそうです。

529 :デフォルトの名無しさん:2015/09/21(月) 12:18:24.09 ID:/2p4upNw
>>527
h (zip xs xs') の簡約をノートに書いていって、処理がやっと理解できました。

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

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

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


みなさん、いろいろな方法でアドバイスくださり、ありがとうございました。
参考にします。

530 :デフォルトの名無しさん:2015/09/21(月) 13:35:14.19 ID:/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 をどうにかしたいところですね・・・

531 :デフォルトの名無しさん:2015/09/21(月) 13:40:59.32 ID:/2p4upNw
>>530
と思ったのですが、iterate (map (ns !!)) [0 .. n-1] の部分で O(n^3) でしたね。

連投失礼しました。

532 :デフォルトの名無しさん:2015/09/21(月) 18:54:41.45 ID:gEmyCLgu
>>514
(´・_・`)自分が思ったことを素直に表明してるだけで、特段ネトウヨに加担してるつもりはないと思うよ

533 :デフォルトの名無しさん:2015/09/22(火) 01:49:24.05 ID:xlNSF2Nb
デマによる誹謗中傷
レッテル張り
相手を馬鹿にした言動
完全に田中はネトウヨでしょ

534 :デフォルトの名無しさん:2015/09/22(火) 06:06:26.79 ID:3/1FxAoT
レッテル貼りは一回だけならほとんど問題ない
同じことを何回も言うのはそれがレッテルであろうがなかろうが問題がある
レッテルを貼ることが問題だというのは多分嘘だろう
本当の問題は連呼すること

535 :デフォルトの名無しさん:2015/09/22(火) 07:17:58.47 ID:rRTVDkU9
田中はもう何年もずっとだろ

536 :デフォルトの名無しさん:2015/09/22(火) 15:24:02.83 ID:cGE1lXHQ
(´・_・`)他人の意見を鵜呑みにするより自分で考えてるだけでネトウヨというレッテルを貼られるなんて辛すぎでしょ。

537 :デフォルトの名無しさん:2015/09/22(火) 18:49:33.73 ID:cCHjzu4f
>>536
>他人の意見を鵜呑みにするより自分で考えてるだけでネトウヨ

いや、まさに他人の意見を鵜呑みにしてるだろw

538 :デフォルトの名無しさん:2015/09/22(火) 20:56:50.42 ID:ADm2wL+1
関プロ実入の194Pの図4.1の一番右側にあるtarai、間違ってませんかね?

539 :デフォルトの名無しさん:2015/09/22(火) 20:59:08.65 ID:ADm2wL+1
毛の壁に触ったがために田中さんも災難だなぁ

540 :デフォルトの名無しさん:2015/09/22(火) 21:29:48.50 ID:cCHjzu4f
taraiは2ヴァージョンある

541 :デフォルトの名無しさん:2015/09/23(水) 13:39:43.66 ID:18dgrDRG
>>510
fmapとかnewtypeコンストラクタとかは最終的に欲しいものというよりむしろ
欲しくないものを検出するために書いてるだけだから
慣れないと感じるのは順序とは別の問題かもしれない
欲しいものの記述のみに集中できる言語があればいいんじゃないか

542 :デフォルトの名無しさん:2015/09/23(水) 13:44:57.16 ID:OAr0MdsU
>fmapとかnewtypeコンストラクタとかは最終的に欲しいものというよりむしろ
>欲しくないものを検出するために書いてるだけだから

543 :デフォルトの名無しさん:2015/09/23(水) 23:08:22.19 ID:mLvEhcU8
(´・_・`)民主党政権時代より今の自民の政治がマシだと思っただけでネトウヨ扱いなんですかねえ

544 :デフォルトの名無しさん:2015/09/24(木) 00:22:27.55 ID:NkCijieZ
すみません。
反復関数系でフラクタル図形等に応用される
サンプルがあったので研究してみたのですが

値構築子の関数に固有の法則を持たせて
値構築子のタプルの値を使って演算する様ですが
構築子の値に関数をCONSで繋げるという手法が理解できず
何か参考になる文献を知っていましたら教えて下さい。

data Decision = (Int, Double) :-> DecFun
type DecFun = Int -> [Int]

d1 :: Decision
d1 = (1, 0.25) :-> \f -> []
dList = [d1,d2.....](このリストを処理する関数内でDecFunを匿名関数にして処理)

545 :デフォルトの名無しさん:2015/09/24(木) 04:46:59.67 ID:ZG5YRh3S
田中さん実質実効為替レートとか知らなさそう

546 :デフォルトの名無しさん:2015/09/24(木) 05:50:31.24 ID:eomUiX/2
毛の壁本当うぜーな
関係ない話は自分のブログでやってろボケ

547 :デフォルトの名無しさん:2015/09/24(木) 08:34:06.00 ID:Z+e1DhYA
実名と自然言語がうぜーから無名関数プログラミング

548 :デフォルトの名無しさん:2015/09/24(木) 08:52:18.74 ID:Uo3c7c9s
>>544
元のサンプルplz

549 :デフォルトの名無しさん:2015/09/24(木) 17:39:46.80 ID:wr9fetd/
思っているだけじゃなくてレッテル貼り、中傷、デマ
色々やってんじゃん

550 :デフォルトの名無しさん:2015/09/24(木) 18:00:44.34 ID:t2o+8nOY
Haskellの話して。それがHaskellとどう関係あるの?

551 :デフォルトの名無しさん:2015/09/24(木) 19:16:38.77 ID:9+DIf2hV
マ板でtanakhスレでも立ててそっちでやれ

552 :デフォルトの名無しさん:2015/09/24(木) 20:30:38.41 ID: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)])

553 :デフォルトの名無しさん:2015/09/25(金) 05:08:31.79 ID:LEPedfxV
一人二人見かけてそれを全体として語っちゃうような感じ

554 :デフォルトの名無しさん:2015/09/25(金) 07:23:04.47 ID:JLRSSQVw
(非終端記号, 確率) :-> (意味値 -> [終端記号または非終端記号])
こうですか?わかりません

555 :デフォルトの名無しさん:2015/09/25(金) 07:35:12.90 ID:4M3b8xA3
右寄りのマスコミまで左寄りに見える極右脳
もう産経くらいしか見れるものがない

556 :デフォルトの名無しさん:2015/09/25(金) 08:02:54.93 ID:791H3qBg
なんでソースの全体示さないで、一部分だけ貼り付けてんの?

557 :デフォルトの名無しさん:2015/09/25(金) 08:28:12.92 ID:8yN1LKRy
確率的構文ツリー生成なんかな

558 :デフォルトの名無しさん:2015/09/25(金) 08:41:47.24 ID:JLRSSQVw
宗教上の理由でオープンソースを認めたくない人もいるかもしれない

559 :デフォルトの名無しさん:2015/09/25(金) 17:27:22.42 ID:VsxADiNC
エントロピーの計算って p log p とか p log p/q とかいっぱい足し合わせるからpやqの大きさに依ってあり得ない数値になることがあります
合計値が非負であることが数学的に証明済みの計算結果が負になることもあります
困りました

560 :デフォルトの名無しさん:2015/09/25(金) 19:08:14.22 ID:8yN1LKRy
>>559
Haskell関係ないよね。どっちかというと数値計算の話題だと思う。

561 :デフォルトの名無しさん:2015/09/25(金) 19:28:04.32 ID:VsxADiNC
>>560
Haskellにそういの巧いことやってくれるライブラリありませんか?

562 :552:2015/09/25(金) 21:21:39.52 ID:1bSV3maE
>>554 >>556 >>557
どうもありがとうございます。
もっとハスケル学習してから解読してみます。
パタンマッチ用に記号を鰓が出ない範囲で構成しただけなのかもしれません。

563 :デフォルトの名無しさん:2015/09/25(金) 23:01:07.26 ID:8yN1LKRy
>>561
Haskell万能だと思いすぎじゃね?

564 :デフォルトの名無しさん:2015/09/26(土) 00:37:50.07 ID:wQKcUgTw
ぼく「Haskellに夢を見過ぎた」

565 :デフォルトの名無しさん:2015/09/26(土) 06:29:16.50 ID:b2xSHmqn
Haskellやりすぎるとネトウヨになる
彼女もできない

566 :デフォルトの名無しさん:2015/09/26(土) 12:13:32.50 ID:NeyxRrj3
>>561
君がそのライブラリを作ればいい。(ドヤッ)

567 :デフォルトの名無しさん:2015/09/26(土) 15:17:28.36 ID:9aiso459
>>561
浮動小数点使わずに計算を進めて最後の最後に浮動小数点にすればいい。
data Logarithm = Log Ratio
みたいな型と、Logarithmに関する計算法則を関数で定義してやればいいだけ。
後はインターフェースを使いやすくしてライブラリとして公開だ!

568 :デフォルトの名無しさん:2015/09/26(土) 18:49:49.80 ID:NeyxRrj3
>>567
logsumexp みたいな問題ってそれだけで解決するんだろうか(疑問)

569 :デフォルトの名無しさん:2015/09/27(日) 11:14:14.50 ID: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 が両立できるでしょうか。

570 :デフォルトの名無しさん:2015/09/27(日) 13:42:31.02 ID:A9loNygE
stack new、もう少し便利になるといいな。
ライセンスファイルまで作ってくれるのはいいけど、テンプレートいじらないとBSD固定だし。

571 :デフォルトの名無しさん:2015/09/27(日) 21:10:40.71 ID:4V+mGekM
テンプレートを一度弄るだけで済むなら十分便利だと思うが……

572 :デフォルトの名無しさん:2015/09/28(月) 20:50:38.43 ID: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 ではそのような事はしてくれないのでしょうか。

573 :デフォルトの名無しさん:2015/09/28(月) 21:59:53.85 ID:zeW+fSKN
stackでghc入れないからそうなる

574 :デフォルトの名無しさん:2015/09/28(月) 22:15:50.09 ID:7GFvCUeK
>>573
今の状態からはもう直せないのでしょうか。

575 :デフォルトの名無しさん:2015/09/29(火) 03:02:05.70 ID:EIRExeCg
自分でいれたghcをpathから外して、stack setup

576 :デフォルトの名無しさん:2015/09/29(火) 03:03:41.97 ID:EIRExeCg
すればstackからghcいれられるけど、望む結果になるかはわからん。

577 :デフォルトの名無しさん:2015/09/29(火) 04:11:33.49 ID:2Slpmx/K
main = do
[x,y] <- span (\i -> i < 3) [1 2 3 4 5]
print y

みたいに、spanの結果を束縛したいんだけど、型が合わない。
doの中で、モナドじゃない普通の関数の戻り値を束縛する方法を教えて下さい。
<$>とか<*>で頑張ればできるんでしょうか?

578 :デフォルトの名無しさん:2015/09/29(火) 05:03:04.88 ID: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

579 :デフォルトの名無しさん:2015/09/29(火) 05:17:34.09 ID:Pz1/YzO9
あとwhere、インデントは適当にあわせくれ

main = do
print y
where
(x, y) = span (\i -> i < 3) [1..5]

580 :デフォルトの名無しさん:2015/09/29(火) 05:59:19.36 ID:cx9spjlF
プログラマーの朝は早い。

581 :デフォルトの名無しさん:2015/09/29(火) 15:10:52.01 ID:2Slpmx/K
> 578
> 579
そうか、無理にIO ([a],[a])にしようとしないでletを使えばよかったのか・・・。

早朝から回答ありがとうございました。
そして書き込み直後に寝落ちしてごめんなさい。

582 :デフォルトの名無しさん:2015/09/29(火) 16:05:00.10 ID:2Slpmx/K
span :: (a -> Bool) -> [a] -> ([a], [a]) に注意
の意味がやっとわかりました。
タプルだったんですね。

main = do
 (x,y) <- (span (\i -> i < 3)) <$> return [1..5]
 print y
でできました。

583 :デフォルトの名無しさん:2015/09/29(火) 20:19:07.38 ID:QEsaWW2p
>>582

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

あと、細かいことだが

¥i -> i < 3

とは書かずに

(< 3)

と書く(中置演算子のセクション記法による部分適用)。

584 :デフォルトの名無しさん:2015/09/29(火) 21:47:48.05 ID:7/IBEyg8
何故do中のletにはinが不要なのですか?

585 :デフォルトの名無しさん:2015/09/29(火) 21:53:11.97 ID:GFX2Obud
>>584
do 構文というものはそうだからとしか言いようがない。
Haskell Language Report とかちゃんと見てる?

586 :デフォルトの名無しさん:2015/09/30(水) 00:13:44.19 ID:lhq6Kj3a
>>584
let ... in を使いたければ do 構文に先行して書く必要がある。
というか、do 構文中に出現するletは do構文に先行するlet ... in の糖衣構文。
なんでそうなってるのかというと、大雑把にはdo構文の解糖を簡単にするため。

# where派より

587 :デフォルトの名無しさん:2015/09/30(水) 00:43:40.23 ID:7+kRPL7S
whereは好きじゃない。当方はlet派です。
F#由来の |> 演算子もいいと思う。

588 :デフォルトの名無しさん:2015/09/30(水) 01:54:07.34 ID:VeSxtbXl
F#の |> ってなんだろうと、ググろうとしたけど、記号がググれない。Hoogle的なものはないのか、F#よ。

589 :デフォルトの名無しさん:2015/09/30(水) 11:12:27.89 ID:YNt8mKMb
forward pipe operatorだよ

590 :デフォルトの名無しさん:2015/10/01(木) 03:27:55.14 ID:tMJ2X2AQ
tanakhネトウヨオフ会やるでー

591 :デフォルトの名無しさん:2015/10/01(木) 15:39:45.50 ID: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)
}

しかし制約のついた型をファンクタやらモナドやらの枠組みで扱いたいことってあるんですけど、
どうにかしてうまいことすりぬける技とかってないですかね。

592 :デフォルトの名無しさん:2015/10/01(木) 21:58:04.58 ID:J0wqCUi1
データ宣言に型クラス制約つけるのって非推奨ないし禁止されてなかったっけ

593 :デフォルトの名無しさん:2015/10/02(金) 04:55:22.76 ID:UReGaTQg
それは知ってるんですけど、でもどうしても制約つけたいときあるじゃないですか。
やっぱりなじまないから非推奨扱いなんですかね。

594 :デフォルトの名無しさん:2015/10/02(金) 17:31:14.47 ID:FPOS40TH
もともと人間のミスを探すためにつけた制約だからエラーになったら人間のミスでしょ
人間ではなくシステムの工夫が足りないと言い出したらなんのための制約かわからない

595 :デフォルトの名無しさん:2015/10/02(金) 21:11:53.24 ID:xHUlQErn
代替手段ないの? どうしてもどうしてもどうしてもそれやりたいの?

596 :デフォルトの名無しさん:2015/10/03(土) 10:59:58.12 ID:+dNnssqW
Windowsでタスクトレイに常駐するタイプのプログラムを作ろうと思ったらgtk2ksでいいの?

597 :デフォルトの名無しさん:2015/10/03(土) 11:00:27.88 ID:+dNnssqW
×gtk2ks
○gtk2hs

598 :デフォルトの名無しさん:2015/10/04(日) 03:27:47.87 ID:ToJIIXd8
Michael Barr, Charles Wells, "Category Theory for Computing Science"って誰か読んだことある人いる?
http://www.math.mcgill.ca/triples/Barr-Wells-ctcs.pdf
良い本ならタダだし読みたいんだけど

599 :デフォルトの名無しさん:2015/10/04(日) 03:38:24.08 ID:ToJIIXd8
> でもどうしても制約つけたいときあるじゃないですか。

俺も以前はあるような気がしていたし、Haskellの設計者たちもそうだったんだろう
でもよく考えると、ありそうでないんだよなぁ。だから非推奨になった
データ型での制約は無意味、関数で制約をつければ十分

600 :デフォルトの名無しさん:2015/10/04(日) 10:46:06.92 ID:6Gez6s+W
パラメータ多相はダックタイピングに肯定的な雰囲気
アドホック多相は否定的な差別意識のようなものを助長する

601 :デフォルトの名無しさん:2015/10/04(日) 10:46:25.50 ID:7g0ECNdk
1要素のリストを作るとき、[x]ではなく[] xのような書き方を
したいときがあります。(\x' -> [x']) x とか return x は気に入らないです。
この対策となる手短な演算子、関数あります?

602 :デフォルトの名無しさん:2015/10/04(日) 10:49:06.91 ID:2p1Fakm9
>>601
return

603 :デフォルトの名無しさん:2015/10/04(日) 10:50:45.65 ID:2p1Fakm9
すまぬ、「return x は気に入らないです」を見落とした

604 :デフォルトの名無しさん:2015/10/04(日) 11:44:55.55 ID:DjeWLfiE
>>601
(:[]) x ダメ?

パクッと食べる感じで私は好きですが

605 :デフォルトの名無しさん:2015/10/04(日) 12:05:49.96 ID:6Gez6s+W
ていうか感情論じゃなくて客観的な動機を設定してほしい

606 :デフォルトの名無しさん:2015/10/04(日) 14:15:53.93 ID:fDLINyyR
>>604
いいね。採用です。

>>605
(\x' -> [x']) x 見た目に冗長 (でも、ついさっきまで使っていた)
return は、多目的に利用されていて、
特に「IOモナドにいれる」という雰囲気が強い。
単要素リストのために使いたくないです。

607 :デフォルトの名無しさん:2015/10/04(日) 18:32:08.45 ID:6Gez6s+W
モナドがIO専用になったら型クラスにする意味がない
演算子はいくらでも作れるから演算子オーバーロードの需要も少ない

608 :デフォルトの名無しさん:2015/10/04(日) 22:02:02.06 ID:ZUTIhruE
Applicativeのpureがreturnよりはいい名前だと思うが
この目的なら>>604の書き方が一番クールに見える

609 :デフォルトの名無しさん:2015/10/04(日) 22:44:20.33 ID:Bf0N6nIe
というか、普通は>>604で書くもんだろ。
非決定性計算の話をしてる時はreturnに決まってるが

610 :デフォルトの名無しさん:2015/10/05(月) 00:10:48.14 ID:GrmouQHI
>>609
そういう事は初めはなかなか気づけないものなんですよ。

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

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


あと、このタイミングで「非決定性計算」という単語を出しても、
return に対して IO モナドと強く結びついた印象を持っている話し相手には、
たぶん何のことだか分からないと思いますよ。
この単語を出すのなら、もう少し噛み砕いて言わないと。

611 :デフォルトの名無しさん:2015/10/05(月) 00:43:59.72 ID:kDxLTVRe
リストをリストとして扱うか、モナドとして扱うかの違いですか

612 :デフォルトの名無しさん:2015/10/05(月) 06:37:18.73 ID:07AYgejN
とりあえず***演算子を使ってみてほしい
Arrowとして扱わないから使わないなんてもったいない

613 :デフォルトの名無しさん:2015/10/05(月) 09:45:35.34 ID:yzUqWBwX
(>>>)はともかく(***)の出番なんてそんなあるか??

614 :デフォルトの名無しさん:2015/10/05(月) 11:28:48.81 ID:pbV8Etye
>>148
ただ賢くなりたいってためにやってるんだと思うよ
筋トレと同じ
目的がなくただプログラミングが詳しくなりたいって人がやってるだけ
だから使えない知識なんだよ

615 :デフォルトの名無しさん:2015/10/05(月) 13:21:54.61 ID:07AYgejN
目的は人それぞれ
これを知らない人は同調圧力をかけて計画経済をやろうとするので
そういう意味でとても重要な知識だよ

616 :デフォルトの名無しさん:2015/10/09(金) 07:42:19.60 ID:FkJ7bVyJ
>>583
>純粋な値をわざわざ return して <- で束縛(正確には違うけど)するのはよくない。
>純粋な値の束縛にはlet を使おう(whereでもいい)。

これはコンパイルエラーのメッセージが分かりづらくなるから?
それとも遅くなる?

正直Haskellのコードがどういうアセンブラにコンパイルされるのか全然イメージできてない。

617 :デフォルトの名無しさん:2015/10/09(金) 12:11:11.69 ID:sh3xoE2A
確かに関数適用分のコストは生ずるが、そういう問題じゃない。
モナドじゃないものをわざわざモナドの中に突っ込むとわかりにくくなる。

618 :デフォルトの名無しさん:2015/10/09(金) 12:13:09.65 ID:sh3xoE2A
あ、あとラムダ式のネストが一段深くなるのものコストか。
だが、コストの問題よりは意味の問題。

619 :デフォルトの名無しさん:2015/10/09(金) 13:39:19.70 ID:kuWdcal8
1. モナドから中身を取り出して
2. なんか純粋な計算をして
3. モナドに戻す
これらを疎結合的に書けるのに、純粋な値をreturnでラップして繋げちゃうと
密結合になっちゃってよくない、という話だと理解していた

620 :デフォルトの名無しさん:2015/10/09(金) 15:51:18.91 ID:SHMAXyUq
Haskell使ってる時点でC++より遅いのは今更なこと
低バグ、3ヶ月後に読んでうんざりしないコードが書きたくてHaskellを使うのだろう?

621 :デフォルトの名無しさん:2015/10/09(金) 22:08:25.16 ID:9aZeSACJ
低バグはいいが、3ヶ月後に読んでうんざりしないは保証しかねるかな
意外と冗長なほうが読みやすいこともある

622 :デフォルトの名無しさん:2015/10/09(金) 22:44:34.08 ID:uiMXim+R
可読性を最大化する言語を決めてから一つの言語で書き続ける
これはウォーターフォール的なやり方

どんな言語が与えられてもまあまあ読めるような書き方を覚えてから言語を適当に選ぶ
というやり方があってもいいと思う

623 :デフォルトの名無しさん:2015/10/09(金) 23:13:43.06 ID:sJZRLwqr
3ヶ月後に仕様が変わっていて大幅書き直しを要求されることも…
言語拡張なんていうクソほども信用できないものを使った自業自得だが、これには参ったです

624 :デフォルトの名無しさん:2015/10/10(土) 09:00:52.54 ID:k6/3wbQ3
目的のためなら互換性を犠牲にする言語と、目的も犠牲もない言語を使い分ける

625 :デフォルトの名無しさん:2015/10/14(水) 10:07:56.26 ID:6zz3+ZrR
Tカードやマイナンバーの
定期的に番号変えても行動パターンが同じだったら結局同定されてしまう問題って

関手から隠されているはずの対象の性質がわかっちゃうんだよって
圏論的に秘匿性に限界があるってことを指摘できちゃうんじゃないの?
役人馬鹿なの?

626 :デフォルトの名無しさん:2015/10/14(水) 11:04:49.72 ID:HE0NXWt0
ヤケクソワロタ

627 :デフォルトの名無しさん:2015/10/15(木) 16:45:01.88 ID:UdQzikyH
>>625
>Tカードやマイナンバーの定期的に番号変えても行動パターンが同じだったら
>結局同定されてしまう問題って

行動パターン?

公開鍵暗号方式で公開鍵を規則的に変えると秘密鍵も同じ規則でかわるの?

628 :デフォルトの名無しさん:2015/10/15(木) 18:00:22.88 ID:8y87T4ny
線形に変化すると特定されるので非線形の暗号アルゴリズムを使用しなければならない

629 :デフォルトの名無しさん:2015/10/17(土) 13:50:41.43 ID:oxF0LCT1
最近ホットなライブラリは?

630 :デフォルトの名無しさん:2015/10/18(日) 17:32:04.94 ID: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 が表示されます。

この挙動を見てストリーミングの意味がよく分からなくなったのですが、こういうものですか?

631 :デフォルトの名無しさん:2015/10/18(日) 17:43:42.05 ID: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 のように期待通りになりません。
「期待」の方が間違っているでしょうか?

632 :デフォルトの名無しさん:2015/10/19(月) 18:31:35.21 ID:D0TieV9y
sbvって実行時証命? コンパイル時証命してくれる機能はないの?

633 :デフォルトの名無しさん:2015/10/22(木) 01:58:37.48 ID:7Ovl9dzN
Data.ListとData.Array.Repaをimportとするのに困っています
・Repaをfull importする -> map,zipWithが衝突する
・Repaをqualifiedにする -> :. も修飾しろと言われる
両方qualifiedにするしか回避方法がないのでしょうか?

634 :デフォルトの名無しさん:2015/10/22(木) 02:12:31.41 ID:kknqMtK3
import Data.Array.Repa (:.)
import qualified Data.Array.Repa as R

635 :デフォルトの名無しさん:2015/10/22(木) 02:15:03.82 ID:kknqMtK3
或いは

import Data.Array.Repa as R

とRepaをqualifiedせずにいったんフルに開いてしまい、
衝突するmapやzipWith は R.map R.zipWith とする。

636 :デフォルトの名無しさん:2015/10/28(水) 01:22:53.11 ID:JEFLc7P8
>>634
同じモジュールを2回importしてもいいんですね

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

これで思っていた感じになりました
ありがとうございました

637 :デフォルトの名無しさん:2015/10/29(木) 21:24:47.10 ID:DfqrGTRw
いまだに forall がよく分からん。

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

関数 f と g の違いって何?

638 :デフォルトの名無しさん:2015/10/29(木) 21:31:26.31 ID:MKBh71hJ
ライブラリのサンプルでラムダ式の4重ネストとか見かけるけどそういう書き方って普通なの?
jsのコールバック地獄と何一つ変わらない気がするんだけど

639 :デフォルトの名無しさん:2015/10/29(木) 23:35:31.17 ID:e9INJKYU
>>637
なにも違わない

640 :デフォルトの名無しさん:2015/10/30(金) 01:13:23.74 ID: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拡張)の意義だよ。

641 :デフォルトの名無しさん:2015/10/30(金) 21:13:55.52 ID: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 の役割も記事の文脈が分からないと何とも言えないかな。

642 :デフォルトの名無しさん:2015/10/31(土) 10:46:17.74 ID:dbQDbY0R
>>637
Haskellが今どうなってるか知らないが一般的にトップレベルのforallは省略できる
局所的なforallは省略できない
例 (forall a. (b -> a) -> a) -> b

643 :デフォルトの名無しさん:2015/10/31(土) 11:22:59.89 ID:v6Gqs4tJ
モナドの別名を作りたいです。型におけるnewtypeのように、専用のモナドにして、
既存のモナドと混ざらないようにしたいです。

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

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

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

作る方法あります?

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

645 :デフォルトの名無しさん:2015/10/31(土) 13:04:49.04 ID:VBW/ZV1E
>>643

newtype MyMonad a = MyMonad { runMyMonad :: SomeMonad SomeType a }
deriving (Functor, Applicative, Monad)

とかすれば?

646 :デフォルトの名無しさん:2015/10/31(土) 14:02:44.15 ID:mkYHJB27
定義としては、こんな感じかな。。
モナド変換子の扱いが厄介だと思ったが、あっさり成功しました。
まだ使ってない・・。

{-# LANGUAGE GeneralizedNewtypeDeriving #-}

newtype ErrorLogT m a = ErrorLogT { runErrorLogT :: WriterT [String] m a }
deriving (Functor, Applicative, Monad)

647 :デフォルトの名無しさん:2015/10/31(土) 14:45:40.36 ID:+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 を明示的に書いておいたのだと思う。
だが、なんで将来エラー扱いになるのかが分からんな。
明示しないとどんな不都合が起こるんだろ。

648 :デフォルトの名無しさん:2015/10/31(土) 15:08:37.45 ID:VBW/ZV1E
>>647
んー、確かめたら局所量化じゃなさそうだね。
= の右に左に出てこない型変数をforallなしで書くなってことなんだろうけど
でもこれデータ型宣言じゃなくて型シノニムだもんね。

649 :デフォルトの名無しさん:2015/10/31(土) 20:13:28.97 ID:VBW/ZV1E
>>638
>ライブラリのサンプルでラムダ式の4重ネストとか見かけるけどそういう書き方って普通なの?
>jsのコールバック地獄と何一つ変わらない気がするんだけど

よくわからん。

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

それなら単に複数引数のλを周りくどい表記で書いてるってだけだ。
或いはdo構文をdesugarした形で明示的に書いてるとかかな。
いずれにせよ関数定義内で局所的に変数を定義するのと同じなんで地獄とも思えない。

650 :デフォルトの名無しさん:2015/10/31(土) 20:39:17.39 ID:fFBIHpK6
もしhaskellじゃなかったらごめんなさい
うろ覚えだけどabcマシン?なるマシン語を下地になんか作る本があったきがするんだけど
何の本かわかります?

651 :デフォルトの名無しさん:2015/11/01(日) 02:39:58.12 ID:35r9qLcL
すみませんhaskell学習のためにIDE使おうと思い試しに
intellijにhaskforceプラグイン入れて
winghci向けにテキストエディタで作っていた物を実行した所
cabalのhackageライブラリへの接続設定が上手くいかないみたいで
エラー連発となったのですが
どなたかintellij活用していて解る方いましたら教えて下さい。

参考URL
https://carymrobbins.github.io/intellij-haskforce/

652 :651:2015/11/01(日) 11:32:51.24 ID:35r9qLcL
すみません.cabalファイルの
build-depends設定が必要でした。
お騒がせしました。

653 :デフォルトの名無しさん:2015/11/02(月) 00:08:37.14 ID:BuossX5P
>>650
わからん。
Haskellはcmmで書かれてるらしい。

654 :デフォルトの名無しさん:2015/11/02(月) 00:55:43.62 ID:+TdI2Qwj
abcマシンってこの人が記事にしてるやつ?

http://d.hatena.ne.jp/lethevert/20060424/p2

655 :デフォルトの名無しさん:2015/11/02(月) 01:05:24.39 ID:+TdI2Qwj
察するにHaskellじゃなくConcurrent Cleanなる関数型言語がABCマシンからなるVMを使っているようだが

656 :デフォルトの名無しさん:2015/11/02(月) 01:17:27.14 ID:+TdI2Qwj
昔は2chにConcurent Cleanのスレがあったらしい

http://d.hatena.ne.jp/quox/20080809/p4

657 :デフォルトの名無しさん:2015/11/02(月) 02:19:27.64 ID:3aJacJQZ
いまは単にCleanという。Concurrentの部分は黒歴史認定された。

658 :デフォルトの名無しさん:2015/11/02(月) 20:29:53.84 ID:iqlL+d1G
cleanかー。確かに昔cleanのpdfファイルを読んだ覚えがある。cleanのスレもたまに見てた
haskellじゃなかったのね、ありがとう

659 :デフォルトの名無しさん:2015/11/02(月) 20:33:46.97 ID:6V7frwcR
import Data.Array
import Data.Map

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

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

もし (!) が、Array と Map がともにインスタンスになっている共通のクラスのメソッドなら、
ちゃんとどっちの型のものか推論してくれるのに。

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

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

ほぼ同じ状況のレコードのフィールドは
列多相にする拡張がGHC 8.0でついに入るようだ。

661 :デフォルトの名無しさん:2015/11/02(月) 22:29:42.30 ID:BI35UJR0
多相な関数ってのとたまたま同じ名前がついた関数が複数あるってのは条件が違うんだな。

662 :デフォルトの名無しさん:2015/11/02(月) 23:30:27.13 ID:6V7frwcR
>>660
名前が衝突してたって、a と i の型で (!) がどっちのものか特定できるじゃん。

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

クラスメソッドなら同じく a と i の型から推測するわけだから、
同じように推測すればいいのに。

663 :デフォルトの名無しさん:2015/11/02(月) 23:36:48.35 ID:3aJacJQZ
>>662
多相性抜きだと (!) に型がつかないから。
あと、同じ型シグネチャを持った複数の(!)があったらいずれにせよ解決できない。
おとなしく最初からモジュール名で修飾して特定できるようにしとけ、というのは理にかなった方針。

664 :デフォルトの名無しさん:2015/11/03(火) 09:06:22.82 ID:6b9tjAll
>>663
うーん、正直なところまだ納得できん。

これだけ教えてくれ。
>>659 の状況で (!) が Data.Array モジュールで定義されたものだと特定するのは、理論的に不可能なのか?
それとも、たまたま今の ghc に特定する仕組みが備わっていないだけなのか?

665 :デフォルトの名無しさん:2015/11/03(火) 09:43:56.42 ID:9Nk73qdO
>>664
理屈としては可能なんじゃないかな。効率がわるいから
やらんだけで。

666 :デフォルトの名無しさん:2015/11/03(火) 12:15:21.68 ID:47MAD1yd
>>664
観点による。現在の環境にある(!)という名前の全部をテーブルから探してきて、
引数位置の型に合うヴァージョンを同定するということ自体はもちろんできる。

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

察するに構造的部分型が欲しいのかもしれないが、Haskellにはない(OCamlにはある)。

667 :デフォルトの名無しさん:2015/11/04(水) 11:53:03.71 ID:8WRcFuaF
具体的に考えるんだ
x の型が一意に決まらないとき show x はどうなるかとか

668 :デフォルトの名無しさん:2015/11/04(水) 20:49:16.04 ID:YGBxZpF/
>>667
どうなるの?

669 :デフォルトの名無しさん:2015/11/05(木) 12:04:56.34 ID: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の関係を無視できない

670 :デフォルトの名無しさん:2015/11/07(土) 05:01:31.73 ID:e/JIsCJ0
13:00
〜21:00
チャンネル 関数型ストリーム処理勉強会

lv241026970

671 :デフォルトの名無しさん:2015/11/08(日) 15:12:58.87 ID:ZXpAyz0G
free monadのfreeってどういう意味?
自由とか解放とか、鉛フリーとかのフリー?
monad以外にも何とかフリーってあるの?

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

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

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

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

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

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

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

気分的な解説をこれ以上続けても仕方ないので、興味があったら圏論の本の「随伴」あたりを勉強されたし。
たまに「Wikipedia見てもわからなかった」とか言ってる人がいるけど、Wikipediaは記事によって記述の濃淡が
ばらつき過ぎていて、あれで勉強するというのは全くオススメしないよ。

673 :デフォルトの名無しさん:2015/11/09(月) 00:46:28.67 ID:hXrsgMsb
>>672
ありがと。

圏論 原著第2版 の第9章のタイトルが随伴だそうだから読んでみるわ。
圏論入門者がそこまで到達(理解)するのにどれだけ時間がかかるか分からんが。

674 :デフォルトの名無しさん:2015/11/10(火) 15:18:42.59 ID:GBT1w9xC
モナドって離散信号を一回連続に直してからフーリエ変換して離散に戻すみたいな感じですか

675 :デフォルトの名無しさん:2015/11/10(火) 20:05:26.23 ID:ZeRtqP7q
モナドは自己関手なので離散から連続に直すみたいな感じではありません

676 :デフォルトの名無しさん:2015/11/11(水) 00:04:10.91 ID:CaB3I9+U
>>674
床下配線でどうたら、という解説から想像をたくましくしてはいけない

677 :デフォルトの名無しさん:2015/11/11(水) 07:01:19.07 ID:ECN7vnC1
あえて抽象的な喩えで言うなら、
「モナドは文脈」という考え方が私はわかりやすかった。

ある関数を使うときに文脈によって意味 (戻り値) がかわることもあるし、
文脈にそぐわない関数を使うことは出来ないように型で制約されている感じは、
まさに文脈って感じがする。

678 :デフォルトの名無しさん:2015/11/11(水) 08:45:56.58 ID:+7UgY0Lp
つまりモナドを説明する前に多相型を説明しろってことだ
多相型は文脈によって意味がかわる

679 :デフォルトの名無しさん:2015/11/11(水) 22:41:55.01 ID:CaB3I9+U
>>678
そういう意味での文脈、じゃないよ。

たとえばMaybeは「中に何も入ってないかも知んない文脈」だし
リストは「なんか値が複数にバラけてるっぽい(し何もないかもしれない)文脈」なんだよ。
具体的にはFunctorでラップされてる型ならなんでもそのFunctorに応じた文脈だと言える。

Functorを考えるとき、

X -> F Y と Y -> F Z を合成したい場合がある。
(しなくても済む場合もありますが)

そういう「合成」がうまくいくためには FY と Y->FZ を受け取ってFZを
返してくれる演算があると便利だなぁということになる。それが (>>=)だね。
そういう演算が「うまく行く」ことを保証するのがモナド則。

680 :デフォルトの名無しさん:2015/11/12(木) 06:44:47.02 ID:169dDeUZ
「文脈」なんて言わずにおとなしく「計算効果」といっておけばよかったんだよ

非モナディックな値を単純にreturnでモナドに投入するだけでは作れないような
モナディックな値がその計算効果の意味を表現している
MaybeならNothingだし、Listならシングルトン以外の全てのリスト、
IOなら実行しても定数しか返さないようなもの以外の全てのIOアクション

そういう計算効果を、do構文の中にいるときのようにある種自然に
取り扱えるようにするのが、モナドの持つ構造つまりモナド則。

681 :デフォルトの名無しさん:2015/11/12(木) 12:19:12.19 ID:92MD0hMh
モナドがない言語にもListはあります
モナドがなくてもListの計算効果はあります
Listを知らない人にモナドを教えるのは早すぎるし
知っている人に計算効果を教えるのは遅すぎる

682 :デフォルトの名無しさん:2015/11/12(木) 19:03:08.30 ID:UTL+VBaF
昔、継承がなければポリモーフィズムもないと思ってたんだが
ダックタイピングすれば継承がなくてもポリモーフィズムがあると気付いて
継承を理解するには静的型付けを知るべきだと思った

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

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

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

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

いや普通にリストモナドとかLispで実装して使うから。
そういうLisperは既に静的型付けを知っている!みたいな話なのかもしれんけど。

684 :デフォルトの名無しさん:2015/11/12(木) 21:24:49.38 ID:UTL+VBaF
>>683
リストモナドというけど、Haskellと全く同じ仕様をLispで実装したとは思えないから
モナドの定義が微妙に違うんだろうな
オブジェクト指向の定義が何通りもあるのと同じようにね

685 :デフォルトの名無しさん:2015/11/12(木) 21:50:28.93 ID:169dDeUZ
「モナドの定義が微妙に違う」#とは

ふつうにreturn, fmap, bind (or join) を用意して
do構文に似せたマクロにするだけなんだが……

686 :デフォルトの名無しさん:2015/11/12(木) 23:18:40.23 ID:HSTzSi/o
ID:UTL+VBaFが何言ってんのかさっぱり分からん

687 :デフォルトの名無しさん:2015/11/13(金) 00:16:45.89 ID:S1si1Bvf
嘘を言うよりよっぽど安全だが
まあどんな小さなリスクも見逃さない努力が必要ってことか

688 :デフォルトの名無しさん:2015/11/13(金) 07:28:57.94 ID:z10Svt7p
そもそも継承と部分型関係は関係ないからな。
ID:UTL+VBaF (>>687もかな?) の言ってることは尽く意味不明。

689 :デフォルトの名無しさん:2015/11/14(土) 16:08:25.00 ID:eusaGjJ0
>>681
(>>=)のような組み合わせ方法を議論のビルディングブロックに
もってきたのがHaskellの(というかワドラーの)偉さなんだけど、
この「偉さ」は静的な型がしっかりした世界でのみ意味を持つのであって
そういう意味では他の言語では(所謂関数型言語の仲間であっても)
モナドを論じる意味は全くない。

690 :デフォルトの名無しさん:2015/11/14(土) 16:32:22.06 ID:99hLr/Ur
>>689
>この「偉さ」は静的な型がしっかりした世界でのみ意味を持つのであって

まったく勘違いしてる
計算効果は型付けの静的動的とはなんの関係もない

691 :デフォルトの名無しさん:2015/11/14(土) 17:06:11.27 ID:naUAJjzL
自分が書いたものでも他人が書いたものでも、
ぱっと見これは宣言的じゃないなと感じるコードってあるよね。

俺は自分で無計画に思いつくままにプログラミングしてて、
let や where でやたら数珠繋ぎに値が加工されているときに、
こりゃアカンわと思うんだが。
where
 (x, y) = f a
 z = g x
 w = h y z


おまえらはどう?
どういうコードを見たときに非宣言的だと感じる?

692 :デフォルトの名無しさん:2015/11/14(土) 20:09:24.23 ID:e1nh6RLI
let や where の変数の値は実行時まで分からないことが多い
分からないことは宣言できない
余計な変数を作らないようにして分からないことを目立たなくすることはできる

693 :デフォルトの名無しさん:2015/11/14(土) 23:38:38.09 ID:99hLr/Ur
>let や where の変数の値は実行時まで分からないことが多い
>分からないことは宣言できない
>余計な変数を作らないようにして分からないことを目立たなくすることはできる

意味不明過ぎる。
局所定義でなくトップレベルに書いたらいいとでも?

694 :デフォルトの名無しさん:2015/11/15(日) 00:16:27.42 ID:1MD+X9xB
宣言的ってナニ?

695 :デフォルトの名無しさん:2015/11/15(日) 06:56:56.90 ID:QRVxROzt
Excelは宣言的だと聞いたことがある

696 :デフォルトの名無しさん:2015/11/15(日) 09:11:10.12 ID:5yN0loUP
囲碁やソリティア、大戦略などのような2次元の広がりのある升目型ボードゲームを作る場合、
ボードのデータ構造は Haskell でもやはり Data.Array 系でしょうか。

697 :デフォルトの名無しさん:2015/11/15(日) 10:02:09.42 ID:rgLL3QSn
>>696
immutableでやるんならData.Mapでもさほど問題はないよ。数百要素程度だし。
mutableで行くとシンプルに割りきってMArrayを使ってもいいんじゃないかな。
もし盤面を行列と見た計算が必要ならRepaを使う。

698 :デフォルトの名無しさん:2015/11/15(日) 14:07:14.87 ID:0IQFXnOJ
副作用使わない自慢よりは静的型付け自慢の方が無難

699 :デフォルトの名無しさん:2015/11/15(日) 20:49:33.73 ID:5yN0loUP
>>697
ありがとうございます。
参考にさせていただきます。

700 :デフォルトの名無しさん:2015/11/15(日) 21:30:51.67 ID:mV2QWUyr
>>690
私が言ったのは (>>=)を議論のビルディングブロックに持ってくることが
ピンと来るのは静的な型がしっかりしているからだ、と言うことだ。

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

ホゲホゲという言語でモナド作ってみたとかいう記事は腐るほど出てくるが
Haskellっぽい言語以外では「作ってみた」以上の進展はない。
考えることは出来ても(>>=)を議論のビルディングブロックにする旨味が
その導入コストを下回るからだ。

701 :デフォルトの名無しさん:2015/11/15(日) 22:40:50.94 ID: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

702 :デフォルトの名無しさん:2015/11/16(月) 01:03:44.62 ID:86x+5+3M
declarativeと何を対比したいんだ?

宣言的/式志向的

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

を読むだろJK

703 :デフォルトの名無しさん:2015/11/16(月) 01:27:31.81 ID:Dn8++f15
>>701
・宣言的/非宣言的に分けられるという信念はだれに吹きこまれたのか
・宣言的/非宣言的を判定する基準は存在すると思うか。思うとしたら何故か
・そもそも宣言的(ry

704 :デフォルトの名無しさん:2015/11/16(月) 01:52:39.28 ID:O5zwBLaM
よく知らないけど、宣言的と手続き的って矛盾しないの?
対比させてる人が多いけど

705 :デフォルトの名無しさん:2015/11/16(月) 19:26:37.79 ID:sTC4qthO
手続きは機械でできるから人間の仕事は宣言だけになるという噂だよな
手続き的な宣言が存在しないとは言っていない

706 :デフォルトの名無しさん:2015/11/17(火) 02:43:27.80 ID:f2IMGMZY
モナドすら知らない人からするとdo文は手続きに見える

707 :デフォルトの名無しさん:2015/11/17(火) 07:00:14.09 ID:qSlbRl0V
>>706
というかそれでいいんだよ。
純粋な関数型の枠組みの内部で手続き的な構造をもたらすことが
モナドを導入する意図の重要なひとつなんだから。

708 :デフォルトの名無しさん:2015/11/17(火) 21:08:21.39 ID:a/8UTPX3
手続き的な構造を目的にして do 構文を使っちゃいかん。
ソースが見苦しくなる。

手続き的な構造の構築機能としては、
Haskell の do 構文は C 言語などに比べて遥かに不自由なのだから。

709 :デフォルトの名無しさん:2015/11/18(水) 08:39:48.41 ID:yhwFYSiS
main :: IO () の場合がまさにそうだけど、モナドM に対して M なんちゃらって
値を一つのリテラルで書くのが難しい場合に手続き的に do で
構成するような使い方にとどめておいたほうが良いのであって
手続き的にかけるぞやったーとか言ってると全体がIOモナドに
なちゃーうよ。

710 :デフォルトの名無しさん:2015/11/18(水) 12:46:08.66 ID:CKQsS/J8
>>707
> 純粋な関数型の枠組みの内部で手続き的な構造をもたらすことが
> モナドを導入する意図の重要なひとつ
それってどのくらい信用していい?
それじゃあ、モナドを導入する意図のうち重要なものをすべて挙げることができる?
あるいは、モナドを導入する意図全体を簡潔に言える?

711 :デフォルトの名無しさん:2015/11/18(水) 18:32:33.28 ID:yhwFYSiS
>>710
重要な理由の一つを挙げただけの人にどうして
「モナドを導入する意図のうち重要なものをすべて挙げることができる?」
と聞くのかさっぱりわからん。

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

Wadler Monad

でググれば一発目に出てくると思うんだが。あとはその論文でも
引用されてる Moggi 1989 とか。 Moggi 1989 はアイデアの宝庫だよ。
状態や継続が「モナドで表現した計算効果」とみなせることは
Moggiのアイデアだよ。

712 :デフォルトの名無しさん:2015/11/18(水) 19:17:44.11 ID:YqJaO+rH
ttp://www.amazon.co.jp/圏論の技法-中岡-宏行/dp/4535786674
発売日 2015/12/14

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

日本人が書いてるから、言葉的に読みやすいと嬉しいけど。

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

> Wadler Monad
> Moggi 1989 はアイデアの宝庫だよ
それはあなたたちの買いかぶりだよ

714 :デフォルトの名無しさん:2015/11/18(水) 22:39:23.99 ID:yhwFYSiS
↑なんでハスケルスレってこんな人ばっか湧くの?

715 :デフォルトの名無しさん:2015/11/18(水) 22:54:25.73 ID:ELCanc9c
>>707
よく分からんのだが、その構造というのは表現と同義?

単に手続き型言語のプログラムと似たような見た目にできるよって話なのか、
それとももっと深い意味(意義)があるのか。

716 :デフォルトの名無しさん:2015/11/18(水) 22:57:14.04 ID:r+WUaKBg
>>714
しかもこういうのに限ってまともに勉強したことない感じなんだよなあ

Moggi1989をきちんと読んで理解した人間人が
>>710みたいな間抜けな質問をするはずもなく。

717 :デフォルトの名無しさん:2015/11/18(水) 23:01:07.01 ID:r+WUaKBg
>>715
モナドを使って計算効果の表示意味論を与えようという話なんで、
見た目がどうとかじゃなくて、まさに「意味」の話よ。

718 :デフォルトの名無しさん:2015/11/18(水) 23:26:13.39 ID:CKQsS/J8
>>714 >>716
腐るほど居る単なる文献学習生の一人(二人?)なのね?w
しかも今や相当古い文献

719 :デフォルトの名無しさん:2015/11/18(水) 23:32:09.39 ID:r+WUaKBg
うわあイタい

720 :デフォルトの名無しさん:2015/11/19(木) 07:29:01.58 ID:lSpyFHbj
>>717
計算効果の表示的意味論を「何に対して」与えるの?
手続き的な構造をもたらす対象は「何」?

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

構造の意味もいまいち分からんが・・・

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

否定から入るのを避けるのは非効率
明らかに生産性が下がっている

722 :デフォルトの名無しさん:2015/11/19(木) 13:45:26.51 ID:0swJqKqT
関数型言語ってモジュール間の依存性高すぎない?

723 :デフォルトの名無しさん:2015/11/19(木) 14:24:16.18 ID:/zyx7Wn8
大雑把な書き方をするねぇ

724 :デフォルトの名無しさん:2015/11/19(木) 14:25:14.25 ID:zQxckC7S
F#とC#のような言語非依存のモジュールシステムがあったらいいね

725 :デフォルトの名無しさん:2015/11/19(木) 17:36:15.14 ID:vkUnAwZU
C言語出来るだけの素人がhaskell修めるまでどんくらい時間かかりますか?

726 :デフォルトの名無しさん:2015/11/19(木) 20:54:12.06 ID:0e/5E7Hf
修めるだけならチュートリアル読むだけなんだからまったく時間かからんだろ。
マスターする、という意味なら一般にそんな時間の見積もりは不可能だろ。

727 :デフォルトの名無しさん:2015/11/19(木) 22:18:31.37 ID:sCZhhvVw
>>717 >>726
もっとちゃんと答えられんのか

728 :デフォルトの名無しさん:2015/11/19(木) 22:33:37.20 ID:0e/5E7Hf
>>727
「ちゃんと」答えてるじゃないか。
むしろ根拠もないのにこれ以上に具体的な答えを返す方がおかしいわ。

729 :デフォルトの名無しさん:2015/11/19(木) 23:05:29.68 ID:sCZhhvVw
>>728
それは無能ってことよ

730 :デフォルトの名無しさん:2015/11/19(木) 23:06:28.90 ID:NCXIzrQp
有能なら未来予測ができるのか

731 :デフォルトの名無しさん:2015/11/19(木) 23:15:10.43 ID:uB3RBNvP
>>727
きみ、このスレに頻繁に書き込んでるけど、なんでHaskellに執着してるの?

親でも殺されたの?

732 :デフォルトの名無しさん:2015/11/19(木) 23:15:42.54 ID:0e/5E7Hf
>>729
はいはい。お前さんが答えてやりゃよかろ。無能じゃないんだったらな。

733 :デフォルトの名無しさん:2015/11/20(金) 17:56:29.77 ID:hD02raLH
haskellでnumpyのようなライブラリーありますか?

734 :デフォルトの名無しさん:2015/11/20(金) 19:48:44.22 ID:Ub4YKJzu
>>729
あれ、返事待ってたんだけどな…
ほらー有能なんでしょ君? 早く答えてくれないと!
かなり待ってるんだけどなぁ。俺が
死ぬまでにちゃんと答えてくれるんだよね?
ねー早くスマートでクールな答えをよろしく頼むよ!

735 :デフォルトの名無しさん:2015/11/21(土) 11:05:00.50 ID:74J1zl0I
Jカーブ底打ってからあと2年

736 :デフォルトの名無しさん:2015/11/22(日) 13:17:23.26 ID:lKqXG5SA
>>733
bindings-gsl じゃだめですか

737 :デフォルトの名無しさん:2015/11/25(水) 00:31:18.47 ID:4BagtNs6
semantic versioningを厳密に順守するパッケージ間なら、ビルド後の依存関係を緩くしても良さそうなもんだけどな。
base_foo-1.0.0を利用するプログラムは、base_fooがsemantic versioningを満たす限り、
base_fooのバージョンが2未満ならバイナリレベルで互換性があると言えるはず。

738 :デフォルトの名無しさん:2015/11/25(水) 00:46:08.37 ID:mSSfxExm
厳密に維持しているかどうかってのはどう判断するんや。
維持しているつもりが維持できてないってこともよくある話で、
そんなのをアテにするのが土台無理なんだってば。

739 :デフォルトの名無しさん:2015/11/25(水) 00:54:14.39 ID:tNxrewhG
semanticsとなんの関係もないのになんでsemantic versioningっていうんだろう

740 :デフォルトの名無しさん:2015/11/25(水) 21:52:40.53 ID:8QEKlgDl
ソースの意味が分かってないと順守できないし順守されているかどうか判断できないから

741 :デフォルトの名無しさん:2015/11/26(木) 00:48:29.77 ID:EiQ95VPh
パッケージのインストールってなんでファイルを置くだけでOKにできないの

742 :デフォルトの名無しさん:2015/11/26(木) 23:00:17.77 ID:caXSzhxT
>>741
?どういう意味だろう

743 :デフォルトの名無しさん:2015/11/27(金) 20:05:24.18 ID:eLJXztJb
Ambiguous!

744 :デフォルトの名無しさん:2015/11/28(土) 11:22:10.44 ID:ADrw5NIB
諸君、議論したまえ

745 :デフォルトの名無しさん:2015/11/29(日) 09:37:17.49 ID:9VwKMKnd
>>744
またおまえか

746 :デフォルトの名無しさん:2015/11/29(日) 10:55:13.94 ID: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

747 :デフォルトの名無しさん:2015/12/01(火) 00:26:02.77 ID:XiHhDJLB
template haskell つかってるひとはじめてみた

748 :デフォルトの名無しさん:2015/12/01(火) 10:17:37.88 ID:pLCJABYC
そんなこというひとはじめてみた
実用だと使うよね?yesod某とかfile-embedとか

>>746
むしろpersistとconduitの連携とか勉強になった
すっきりしていいと思う

749 :デフォルトの名無しさん:2015/12/02(水) 02:05:09.83 ID:sE+ivAhG
file-embedは便利だけどyesodとかhakyllとかそんな使うかなあ。
まあでもlensでお目にかかってるはずだとは思うけど。

750 :デフォルトの名無しさん:2015/12/02(水) 12:18:37.59 ID:8wtTORdb
lens はいろんなチュートリアルみてもなにやってるか
わからなくて使ってない

751 :デフォルトの名無しさん:2015/12/02(水) 17:37:47.86 ID:PbTtaUvu
Haskellをベースに創られたElmとかいうAltJS言語の話題はここでいいですか?

752 :デフォルトの名無しさん:2015/12/02(水) 22:51:45.37 ID:sE+ivAhG
簡単な文法の話以外ならElmスレ立てたほうがいいと思う

753 :デフォルトの名無しさん:2015/12/04(金) 22:59:21.91 ID:Jt34pK2I
>>711
これ読んでみるわ、サンキューモッギ

754 :デフォルトの名無しさん:2015/12/05(土) 15:12:50.94 ID:r040mJaZ
Monadクラスの中で特に汎用性の高いインスタンスを一つ選び
そのインスタンスだけでほぼ何でもできる、という方向に行かないのは何故なのかな
そうすれば苦労してMonadクラスを理解する必要もなくなるのに

755 :592:2015/12/05(土) 17:54:28.20 ID:e0mSV6nD
>>754
きみがMonadクラスを理解するのに苦労した原因は
それぞれのインスタンスが個々の機能に特化ているからなの?

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

意味が分からん

756 :デフォルトの名無しさん:2015/12/05(土) 19:18:42.16 ID:r040mJaZ
特化しすぎたら価値を理解するのに苦労するのは当たり前じゃないか
例えばアフリカのある国でしか使えない通貨とか

757 :592:2015/12/05(土) 20:10:01.50 ID:e0mSV6nD
>>756
きみにとってアフリカの通貨(インスタンス)の価値は分からなくても
通貨(クラス)の価値は分かるよね

758 :デフォルトの名無しさん:2015/12/05(土) 20:15:13.38 ID:xnZtirmK
モナドは単なる、今のところなかなかの成功を納めているデザインパターンの一つに過ぎないとこのスレで教わった

759 :デフォルトの名無しさん:2015/12/05(土) 20:17:20.10 ID:xnZtirmK
あと、月を指せば指を認むって諺をさっきTwitterから学んだ

760 :デフォルトの名無しさん:2015/12/05(土) 21:06:41.94 ID:GqrmhMyi
>>754
>Monadクラスの中で特に汎用性の高いインスタンスを一つ選び
>そのインスタンスだけでほぼ何でもできる、という方向に行かないのは何故なのかな

なんでわざわざそんなモジュール性がクソになるようなことしなきゃいかんのw

761 :デフォルトの名無しさん:2015/12/05(土) 21:17:53.90 ID: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.
読めないので翻訳お願いします

762 :デフォルトの名無しさん:2015/12/05(土) 21:37:47.93 ID:r040mJaZ
>>760
特化してもモジュールが単純化される保証はない
ポイントカードのように特化して複雑化したモジュールが大量に作られる可能性がある

763 :デフォルトの名無しさん:2015/12/05(土) 22:04:23.53 ID:/HX/hq4Y
promiseを日本語で理解してくると読めるようになると思う

764 :761:2015/12/06(日) 08:58:48.47 ID:d9uqm994
すごいhaskell楽しく学ぼう持ってる人教えてください
205ページに日本語訳が載ってると思います
お願いします

765 :デフォルトの名無しさん:2015/12/06(日) 15:02:16.24 ID:lk97yytv
モナド則をチェックする機能はなぜ作れないのか

766 :デフォルトの名無しさん:2015/12/06(日) 15:05:47.98 ID:B69NHvUF
>>765
一般に与えられた2つの値の等価性を決定する手段がないから(たとえば関数)

767 :デフォルトの名無しさん:2015/12/06(日) 15:16:43.60 ID:43TPMysj
そういうのはチェックではなく証明しないとだめだ。もちろんその証明は人間が書くのだが。

768 :デフォルトの名無しさん:2015/12/06(日) 16:24:47.53 ID:rl6X8EeV
既存のインスタンスは証明済みだよな
既存のに制約を加えただけのインスタンスも証明不要

769 :デフォルトの名無しさん:2015/12/06(日) 19:05:15.11 ID:43TPMysj
mtlのListTがモナドではないと気付かれるまでに少し掛かったので油断は禁物だ

770 :デフォルトの名無しさん:2015/12/09(水) 16:23:41.49 ID:KCuPtV0t
なんだと? 発案者は何らかの責任を取ったのか?

771 :デフォルトの名無しさん:2015/12/10(木) 10:04:31.34 ID: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?

772 :デフォルトの名無しさん:2015/12/10(木) 10:15:13.66 ID:qPm1t7ac
>>770
Cのクソ品質の乱数だって誰も責任とっとらんがな

773 :デフォルトの名無しさん:2015/12/10(木) 10:39:08.93 ID:bjguJgYh
returnの命名者誰なんだろ

774 :デフォルトの名無しさん:2015/12/10(木) 11:53:32.15 ID:b8dKvTYk
たとえば「絶対に儲かる」乱数だとか品質に言及していたら責任問題になるだろうが
作者が何も言ってない値札もついてないものは質が低くても別にいいんじゃないか

775 :デフォルトの名無しさん:2015/12/10(木) 15:50:49.33 ID:C4TvgIE0
名前なんて適当に別名つけたったらええやん。

776 :デフォルトの名無しさん:2015/12/10(木) 17:03:21.77 ID:HOydu8dt
標準を軽視すれば他人に読みにくい糞コードの濫発を招くのではないか

777 :デフォルトの名無しさん:2015/12/10(木) 17:11:09.97 ID:C4TvgIE0
Haskell のコードなんて言語内 DSL の乱発じゃん。 別名くらいイマサラ

778 :デフォルトの名無しさん:2015/12/10(木) 19:10:58.97 ID:97YX12O0
不満があるなら自分で言語を作ればいい
それもできないなら黙ってる事をお勧めする

779 :デフォルトの名無しさん:2015/12/10(木) 19:37:06.78 ID:pF20NpG5
>>777
それは言い得て妙だな。俺も使わせてもらおう。

780 :デフォルトの名無しさん:2015/12/10(木) 20:07:15.77 ID:HRHtpj0X
本当の初心者には

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

って言ってる。
合わせ慣れるとほっといても意味がわかってくるんだよね

781 :デフォルトの名無しさん:2015/12/10(木) 20:22:42.52 ID:IZmXUGd+
近くにHaskellに興味を持ってくれる初心者がいるなんて羨ましい

782 :デフォルトの名無しさん:2015/12/10(木) 22:44:48.71 ID:KZYbcLbE
>>780
どうも理解が全く違ったようだな。撤回するわ。やめとく。

783 :デフォルトの名無しさん:2015/12/11(金) 10:18:36.36 ID:r5Q1R4hd
ハスケルって白鳥になりたいペンギンみたいな言語だな

784 :デフォルトの名無しさん:2015/12/11(金) 19:58:31.12 ID:sot30U5t
Haskellは、海底から見上げたらペンギンも飛べることになるって言語

785 :デフォルトの名無しさん:2015/12/11(金) 22:20:30.68 ID:85l8vb8h
Haskellを何かに例える奴はろくにHaskell使ってないだろw

786 :デフォルトの名無しさん:2015/12/11(金) 22:24:19.25 ID:GOodMDFm
初心者に分かりやすい例えと熟練者に分かりやすい例えは違うし

787 :デフォルトの名無しさん:2015/12/12(土) 13:37:18.60 ID:ujGm9ePq
>>783
>>784
これらの喩えは初心者に分かりやすいのですか?
それとも熟練者に分かりやすいのですか?

私には意味が分からないです。

788 :デフォルトの名無しさん:2015/12/13(日) 00:08:50.71 ID:3pFOKkOt
>>787
間を取って初心者にも熟練者にも意味不明な喩えにしてみました。
どちらにも「同じくらい」納得していただくことを目指した結果なので
何卒ご了承ください。

789 :デフォルトの名無しさん:2015/12/13(日) 11:41:19.28 ID:Osvw0E0t
例え話の目的は、元ネタを知ってる奴なら言わなくても分かることを省略することだな
省略しても何も分かりやすくならない
ただ短くなるだけ

790 :デフォルトの名無しさん:2015/12/15(火) 13:09:03.38 ID:iFi41cde
haskell勉強中です
H本にfoldlが無限リストに対して動作しないと書いてあるのですがfoldrで扱えてfoldlで扱えないとはどういうことですか

791 :デフォルトの名無しさん:2015/12/15(火) 13:16:24.90 ID:sAET7hcQ
後のページを読めばわかるようになる

792 :デフォルトの名無しさん:2015/12/15(火) 15:12:58.62 ID:HsnKelNC
>>790
遅延評価だから

793 :デフォルトの名無しさん:2015/12/15(火) 18:57:39.98 ID:QE2M/7jx
读书百遍、其意自见。

794 :デフォルトの名無しさん:2015/12/15(火) 20:24:17.53 ID:lBHgLkLX
>>791-792
続き読みました
foldl(&&)True(repeat False)だと((&&) ((&&) ((&&) True False)False)False)のように展開され、
foldr(&&)True(repeat False)だと((&&)False ((&&)False ((&&) False True)))のように展開されるので
(&&)の実装通り、"False _ = False"ということでfoldrではFalseが得られるということでした
頭から適用するかケツから適用するかで展開方法が違うからこんなことになってるんですね
ありがとうございました。

795 :デフォルトの名無しさん:2015/12/15(火) 21:33:39.05 ID:X5Kj7v40
「選択と集中」で原発事業に盛大にぶっこんだ挙句不運にも
原発事故の風評被害wをうけて業績超悪化したのを「チャレンジ」で
切り抜けようとしてドブに沈んでいるけど、ハイリスク・ハイリターンてのは
そういうことだよね。

おつかれさん

796 :デフォルトの名無しさん:2015/12/18(金) 23:30:03.19 ID:CNI5JGVG
プログラマはMacを使ってるってマジ?
http://hayabusa3.2ch.net/test/read.cgi/news/1450395043

797 :デフォルトの名無しさん:2015/12/19(土) 08:03:47.30 ID:ZJ0XzZ1Z
すごいわかりにくいが、型に集中して値のことを忘れるって話をしてるんだよな
静的型でリスクが減ることはあっても増えることはないってのは本当か?という話

798 :デフォルトの名無しさん:2015/12/19(土) 18:37:13.41 ID:154W1WqL
金が遊んでたのでゲームを買う代わりに型システム入門 −プログラミング言語と型の理論−

を買ってみたのですが、これ読むとHaskell力増しますかね?

799 :デフォルトの名無しさん:2015/12/19(土) 18:55:01.79 ID:+WfqJ81y
>>798
Haskell力の低い人と高い人で決定的に違うのは何でしょうか。

800 :デフォルトの名無しさん:2015/12/20(日) 00:59:06.94 ID:nJz8/sCp
動的型で嬉しいことがあるとすれば(返り値の?)型の違う関数を許す事になるが果たして…

801 :デフォルトの名無しさん:2015/12/20(日) 01:13:13.68 ID:AMk4fv31
コード弄りながら設計を考えていくタイプの物は動的型の方が楽かな

802 :デフォルトの名無しさん:2015/12/20(日) 03:44:49.47 ID:PpeZ7QXn
>>799
Haskell力が低い人
「読んだ方が良いか?」

Haskell力が高い人
「『ママッ子』なんだよ>>798
 ビビったんだ…。甘ったれてんだ! わかるか? え?オレの言ってる事。
 『型』のせいじゃあねえ。心の奥のところでオメーにはビビリがあんだよ!
 オレたち強いHaskellerはな!
 そこら辺のナンパJavascripterや仲よしクラブで『読んだ方が良いか?』『読んだ方が良いか?』
 って訊いて回って仲間と心をなぐさめあってるような負け犬どもとはわけが違うんだからな。
『読んだ方が良いか?』…そんな言葉は使う必要がねーんだ。
 なぜならオレや、オレたちの仲間はその言葉を頭に思い浮かべた時には!
 実際に本を読んじまってもうすでに 終わってるからだッ!
 だから 使った事がねェ〜〜〜ッ。
 >>798
 オマエもそうなるよなァ〜〜〜〜〜〜〜〜
 オレたちの仲間なら…わかるか? オレの言ってる事… え?
『読み終わった』なら 使ってもいいッ!」

803 :デフォルトの名無しさん:2015/12/20(日) 12:57:25.53 ID:NTC3UnWc
>>802
ほんこれ

804 :デフォルトの名無しさん:2015/12/21(月) 08:53:41.20 ID:p6vwDy5Q
bottomって何だお

805 :デフォルトの名無しさん:2015/12/21(月) 13:59:05.21 ID:UYX3g1H/
あらゆる部分関数を全関数にするための魔法のこと

806 :デフォルトの名無しさん:2015/12/21(月) 15:13:18.71 ID:Nh3sqEqI
和の単位元bottom
積の単位元unit

807 :デフォルトの名無しさん:2015/12/21(月) 21:20:25.06 ID:p/vkOJl0
C から int 型の配列を Haskell に渡して
たとえば Haskell ですべての要素に 1 を足して
足された配列を C に返すってのをやりたいんだけど
いいサンプル知らない?

配列じゃなくて単独の int とか double とかはできるんだけどな

808 :デフォルトの名無しさん:2015/12/21(月) 21:48:27.29 ID:ppP3iBcM
Cでやればよくない?

809 :デフォルトの名無しさん:2015/12/21(月) 22:48:06.17 ID:p/vkOJl0
そりゃ業務だったらそうするけどさ

できたら楽しいなって、それだけだよ

810 :デフォルトの名無しさん:2015/12/22(火) 21:04:57.45 ID:RcXN8h3P
>>807
FFIしたいということですか

811 :デフォルトの名無しさん:2015/12/22(火) 22:08:30.28 ID:JyKdzAuM
本物のプログラマはHaskellを使う 日経ソフトウエア
第58回 Cの配列をHaskellで利用する 2013/08/07
http://itpro.nikkeibp.co.jp/article/COLUMN/20130806/496825/

812 :デフォルトの名無しさん:2015/12/22(火) 22:44:22.74 ID:rB+vmYEN
>>810
そういうことですね

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

とりあえず力技ではできたけど、あんまりスマートじゃないなー
俺の Haskell レベルだと、どうやってリストにすればいいか解らないw
http://pastebin.com/v9q509Pr

813 :デフォルトの名無しさん:2015/12/23(水) 15:44:56.86 ID: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 と表示されるのを期待したんだが。

814 :デフォルトの名無しさん:2015/12/23(水) 20:34:05.51 ID:ar8RTNkN
>>813
http://d.hatena.ne.jp/kazu-yamamoto/20151217

815 :デフォルトの名無しさん:2015/12/23(水) 20:49:10.99 ID:2+dP2nJG
>>814
なるほど

ありがと、助かったよ

816 :はちみつ餃子 ◆8X2XSCHEME :2015/12/24(木) 02:55:04.00 ID:HopzupNL
>>784
どこかで見たネタだと思ったらゆゆ式だった。

817 :デフォルトの名無しさん:2015/12/29(火) 00:17:50.09 ID:9ZoBZ5vT
諸君、議論したまえ。

818 :デフォルトの名無しさん:2015/12/29(火) 10:01:45.65 ID:RBH4v58J
>>817
すっこんでろ

819 :デフォルトの名無しさん:2015/12/29(火) 10:07:19.04 ID:zZSzcFIy
H本でbracketOnErrorのとこまで読みました。
bracketとbracketOnErrorの使い分けどうやってますか?
onerrorの方が効率は良さそうですが。

820 :デフォルトの名無しさん:2015/12/29(火) 10:39:50.46 ID:xUoFMoAl
H本なんて固有名詞ネーヨカス

821 :デフォルトの名無しさん:2015/12/29(火) 11:02:31.87 ID:zZSzcFIy
>>820
あなたがわからないだけでしょ

822 :デフォルトの名無しさん:2015/12/29(火) 11:05:25.98 ID:xUoFMoAl
キチガイだな。 放置でヨロwww

823 :デフォルトの名無しさん:2015/12/29(火) 11:21:31.50 ID:zZSzcFIy
>>822
あんたキチガイだからNGしとくわw
さいならー

824 :デフォルトの名無しさん:2015/12/29(火) 11:24:08.59 ID:xUoFMoAl
>819 名前:デフォルトの名無しさん[sage] 投稿日:2015/12/29(火) 10:07:19.04 ID:zZSzcFIy [1/3]
>H本でbracketOnErrorのとこまで読みました。
>bracketとbracketOnErrorの使い分けどうやってますか?
>onerrorの方が効率は良さそうですが。

どっちがキチガイなんだろうかwwww

825 :デフォルトの名無しさん:2015/12/29(火) 11:39:12.45 ID: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)があるので、見てみてください。
どうでしょう、効率に差があるように見えるでしょうか。

826 :デフォルトの名無しさん:2015/12/29(火) 12:10:34.40 ID:zZSzcFIy
>>825
ありがとうございます。
すみません。まだ初歩の学習中でbracketのソースは読めそうにないです…
bracketOnErrorでも第三引数に第二引数と同等のリソース開放のコードを書くことでこの2つの関数は代替可能だと思ったのですが間違っているでしょうか?
onerrorの方が効率が良いと思ったのは例外が発生しない場合第二引数の関数を呼び出すコストがかからないからと考えましたが大したコストじゃなさそうですね

827 :デフォルトの名無しさん:2015/12/29(火) 13:40:10.25 ID:X0OP3kiA
>>826
たしかに bracketOnError の第2引数は、第3引数で例外が発生しない限り実行されません。
その意味では「例外の無い通常運転では第2引数を実行するコストはかからない」のでその分効率的でしょうね。

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

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

もし bracketOnError の第3引数にリソース解法処理を「必ず行うように」書くのなら、
あなたがメリットだと感じている「例外がなければ第2引数を実行するコストがかからない」
というのは無くなり、処理的には bracket と「ほぼ」同等になりますが、
それなら bracket を使うべきだと私は思います。
同じ処理を実現するなら、手間がかかる bracketOnError より楽に bracket です。

828 :デフォルトの名無しさん:2015/12/30(水) 04:17:15.91 ID:P/Z2Dori
bracketOnError の第一引数が例外となったらどうなりますか?

bracket AB共通後始末 $ bracketOnError planBwith後始末forB\AB共通後始末 planAwith後始末forA\AB共通後始末
こう書けばいいです?

829 :デフォルトの名無しさん:2015/12/30(水) 12:39:36.95 ID:5ugZQDQL
教えて君にエサをやるからこうなる。 だからあれほどスルーといったのにな。

830 :デフォルトの名無しさん:2015/12/30(水) 17:44:17.38 ID:SM7sbKvE
>>828
bracketOnError の第1引数で例外が発生すれば、
その例外はそのまま bracketOnError の外に伝わります。

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

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

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

質問の前に、まずは自分でやってみてください。

831 :デフォルトの名無しさん:2015/12/31(木) 07:48:53.39 ID:qqIJWikB
>>827
結論としてbracketOnErrorとbracketは代替可能ですよね。

ちなみ>>828は私じゃないのでw

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

歯切れが悪い言い方で申し訳ないです。
というのも、正確に言えば両者は代替できない(と思う)からです。
>>827 でも同等性に関して「ほぼ」と断りました。

私が今ぱっと思いつく限りでは2つの異なる点があります。

ひとつは、bracketOnError の第3引数に(わざわざ)書いた開放処理の中で例外が起きれば、
その時点で bracketOnError の第2引数が実行されます。
第2引数でも開放処理が書かれていれば中途半端に二重に実行されます。
どう代替しますか?

もうひとつは外部例外への対処の仕方です(以後、簡単のため正確さは犠牲にします)。

両者の第1引数と第2引数では、外部例外がマスクされます。
一方、第3引数では外部例外のマスクが一時的に開放されます。
外部例外というのは他スレッドから現スレッドに投げられる例外の事だと今は思ってください。
これがマスクされているという事は、外部例外が投げられても処理を最後までやり切る、という事です。

したがって、bracket の第2引数に書いた開放処理と、bracketOnError の第3引数に書いた開放処理は、
外部例外への対応という点に関して異なります。
mask_ という関数を使って外部例外をマスクできますが、それで開放処理を書くのなら、
もうほとんど bracket の第2引数で開放処理を書くのと同義で、代替できると呼べるかどうか。


そもそも、代替できるかどうかに拘る理由が分かりません。
普通、bracketOnError を見たプログラマは、例外が発生しなければ第2引数は実行されない、
という前提でプログラムソースを読むはずです(ドキュメントにそう書かれているので)。
なので、第3引数に開放処理が書かれていれば混乱を生むだけだと思うのですが・・・

833 :デフォルトの名無しさん:2015/12/31(木) 10:32:03.79 ID:W7OP38Mu
>>831
すいません、>>832 で外部例外と言いましたが、言葉が間違っていました。

正しくは「非同期例外」です。

834 :デフォルトの名無しさん:2016/01/02(土) 10:40:11.71 ID: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

835 :デフォルトの名無しさん:2016/01/02(土) 13:02:28.28 ID:qABI05dX
質問の仕方が悪い
バグだからお前は悪くないか、仕様だからお前が悪いの二択

836 :デフォルトの名無しさん:2016/01/02(土) 14:01:08.40 ID:yZAYApNA
これが関数型界隈の人間は冷たいの正体か…

837 :デフォルトの名無しさん:2016/01/02(土) 14:10:02.21 ID:3O/U03ws
「名前そのままのファイル」が作られるんだから仕様だろ
URIを解釈せずにそのままファイル名にする、というのは
きちんと意味のある方針

838 :デフォルトの名無しさん:2016/01/02(土) 14:32:31.40 ID:GEI8yUNi
Sqliteの仕様としてURIが使え、インメモリで名前が使えるよ。
SqliteのC言語ライブラリでも、それをラップした他言語ライブラリでも、
Haskell の sqluie-simple でも問題なく仕様通りの使い方ができる。

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

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


>>837
それがドキュメントに書かれていれば、なるほどと思う。
一応俺なりにドキュメントを精読したつもりなんだが、見当たらない。

839 :デフォルトの名無しさん:2016/01/02(土) 14:47:45.97 ID:Z1J/2moe
関数型の切り口で語る奴はだいたいKだと思ってる

840 :デフォルトの名無しさん:2016/01/02(土) 15:28:52.47 ID:3O/U03ws
そもそもDatabase.Persist.Sql (withSqlConn) がそういう動作をする

persistentのバックエンドのひとつとしてsqliteが使えるというだけで、
sqliteの機能をまるのまま提供する義理があるわけじゃないからな
sqlite特有の仕様は全部切り捨ててるんじゃね

841 :デフォルトの名無しさん:2016/01/02(土) 15:48:49.70 ID:GEI8yUNi
じゃあ、Sqlite の大きな特徴のひとつであるインメモリはなんで使えるんだ?

withSqliteConn ":memory:" は普通に使えてるんだが。

842 :デフォルトの名無しさん:2016/01/02(土) 15:51:15.87 ID:uD+WV8wT
毛の壁うざいな

843 :デフォルトの名無しさん:2016/01/02(土) 16:02:15.60 ID:QMorx62m
もうブームは去った感じだけど、まだ元気にどこかで妄言吐き散らかしてるんだろうか

844 :デフォルトの名無しさん:2016/01/02(土) 17:45:42.15 ID:qABI05dX
>>836
これ質問されてんじゃなくてURI使わせろって命令されてるだけだから
命令を無視されても冷たいとはいえない

845 :デフォルトの名無しさん:2016/01/02(土) 23:33:46.23 ID:GEI8yUNi
誰も知らないようだから、GitHub yessodweb/persistent の issues にあげてみるよ。

846 :デフォルトの名無しさん:2016/01/03(日) 18:32:26.80 ID:6l5P920y
C言語ライブラリでも the URI filename capability is disabled by default
って書いてあるね

847 :デフォルトの名無しさん:2016/01/03(日) 20:43:59.44 ID:LkkfiKGZ
>>846
そう、俺も GitHub の issues に投稿してから気づいた。
自分で Sqlite のサイトのリンクまで載せておきながらね。

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

ただ、URI解釈機能の追加には作者も乗ってくれたみたい。

848 :デフォルトの名無しさん:2016/01/03(日) 20:52:19.95 ID:6l5P920y
sqlite-simple は direct-sqlite に依存する
direct-sqlite.cabal の cc-options の所には -DSQLITE_USE_URI と書いてある

persistent-sqlite.cabal の cc-options にはそれがない

849 :デフォルトの名無しさん:2016/01/04(月) 01:57:02.65 ID:sSvUYJHW
年始早々お邪魔します。
stylish haskellをインストールしてみたのですが
IDEの表示動作には何ら変化が無く
これを導入する事によって何が嬉しいのか解りません。
もし解説してるサイト等を知ってましたら教えて下さい。

850 :デフォルトの名無しさん:2016/01/04(月) 13:18:37.61 ID:FL15/iqU
cabal test の結果を色分け表示するツールって無いかな?

851 :デフォルトの名無しさん:2016/01/04(月) 19:09:54.69 ID:26vt+6G2
>>849
前Vimから使ってたけど単なるコードの整形ツールだよ?そういうことではなく?

852 :849:2016/01/04(月) 22:46:13.38 ID:sSvUYJHW
>>849
ありがとうございます。
単なるコードの整形ツールねのですね。
ハスケルはlet式の中で改行された名前の先頭位置によって
鰓が出たりするので重宝できるかもしれません。

853 :デフォルトの名無しさん:2016/01/05(火) 01:43:11.91 ID:e1QBvQbc
使い方どころか何のためのツールかも知らないでインストールしたのか
このスレに質問しにくる奴は総じてどこかおかしいな
まあ、まともな人間ならStack OverflowやTwitterで答えてもらってるからそれもそうか

854 :デフォルトの名無しさん:2016/01/05(火) 05:45:19.85 ID:cUqgoqn1
総じてどこかおかしい奴用Haskell質問スレ設立の機運が高まる

855 :デフォルトの名無しさん:2016/01/05(火) 08:41:47.32 ID:ikPXVG/Y
総じてっていうか英語読めない/読まない人たちだな

856 :デフォルトの名無しさん:2016/01/05(火) 08:45:29.10 ID:DJzEWfiC
2chに書けばお人好しが教えてくれると思っている

857 :デフォルトの名無しさん:2016/01/05(火) 09:27:48.52 ID:YDRwEOS9
ていうか、おかしいと批判することと隔離することを混同するなよ
批判は自由だが、隔離は自由ではないぞ

858 :デフォルトの名無しさん:2016/01/05(火) 09:51:31.49 ID:tl8m+k9c
『ママッ子(マンモーニ)』なんだよペッシ!
 ビビったんだ…。甘ったれてんだ! わかるか? え?オレの言ってる事。

859 :デフォルトの名無しさん:2016/01/05(火) 11:57:12.00 ID:4ajyxAFr
口語的に書かれても意味が分かりかねますので
もう一度正しい文章構成で書いてもらえますか

860 :デフォルトの名無しさん:2016/01/05(火) 17:46:40.11 ID:e1QBvQbc
>>859
意思疎通する気があるなら安価ぐらい付けたらどうかな

861 :デフォルトの名無しさん:2016/01/05(火) 18:05:51.34 ID:4ajyxAFr
>>860
意思疎通する気は全くありませんでした
謹んでお詫び申し上げます

862 :デフォルトの名無しさん:2016/01/05(火) 19:32:18.30 ID:e1QBvQbc
>>861
年始早々お邪魔しにきたわけだ、なるほど

863 :デフォルトの名無しさん:2016/01/05(火) 20:11:41.05 ID:55Fn/q1S
『話せば分かる』なんて大ウソ!
正解は『離せば分かつ』
毛の壁

朦朧健

864 :デフォルトの名無しさん:2016/01/05(火) 21:26:43.07 ID:4ajyxAFr
>>862
こちらの意図も伝わっていなかったようですが
それも含めて意思疎通する気が無い故仕方がないことと考えております
年始の戯れにお付き合いいただきありがとうございます

865 :デフォルトの名無しさん:2016/01/05(火) 21:45:24.66 ID:HIgjIRNU
AdventCalender書いてない奴が居るせいでHaskellがランキングから外れてて草
総ストック数はそこそこあったのに

866 :デフォルトの名無しさん:2016/01/05(火) 22:44:55.92 ID:+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 の作者はそういった情報も役に立つと思ってるから出力してるんだと思う。
が、俺にはさっぱりわからん、どういう意図なんだろ。

867 :デフォルトの名無しさん:2016/01/06(水) 05:13:36.20 ID:HV2EpPIp
総じてではなく丁寧語で書いてる奴約1名が本当に頭のおかしい奴ってだけだね
>>819と同じ奴っぽいけど一瞬でサイコパスだと見ぬいた>>820何者なんだ…

868 :デフォルトの名無しさん:2016/01/06(水) 07:55:50.59 ID:GReAeoH6
>>866
まあとりあえず言葉通りの意味がわかれば十分じゃないか
逆に何を言われても物足りないと思えば、言葉が何の役にも立たないのは当然だ

869 :デフォルトの名無しさん:2016/01/09(土) 08:12:25.88 ID:nN+q48Tl
諸君、議論したまえ

870 :デフォルトの名無しさん:2016/01/09(土) 09:51:25.24 ID:j1jPLBvu
保守

871 :デフォルトの名無しさん:2016/01/09(土) 10:19:50.09 ID:BmIw5AdJ
それはHaskellのコードをまともに書いたことがないからというだけでは……
似たような型の関数を長大に連鎖してる箇所でそれがなかったら手間もいいとこ

872 :デフォルトの名無しさん:2016/01/09(土) 10:22:14.19 ID:BmIw5AdJ
あ、しばしば予想外の箇所が示されるってのはあるけどな。
型推論が最終的に失敗した箇所とエンバグした箇所が違うことはわりとある

873 :デフォルトの名無しさん:2016/01/09(土) 17:15:15.57 ID:CcDze1VM
>>871
まともかどうかは分からんが、
確かに似たような型の関数を長大に連鎖するのは意図的に避けてる。
やっぱ、そこから逃げてちゃマズいか。

それがなかったらの「それ」が何を指しているのか曖昧だが、
最後の In the first argument of の件か?
それなら、エラーが検出された場所(行と列)が最初に示されるだろ。
それで分かるよね。

874 :デフォルトの名無しさん:2016/01/10(日) 11:57:12.49 ID:wsJCRVkv
ghcの仕事は辻褄が合わないコードを探すことだ
役に立たないコードを探すことではない
役に立つなんて下手に断言して辻褄が合わなくなるより何も言わない方がましだ

875 :デフォルトの名無しさん:2016/01/11(月) 22:38:48.37 ID:SN+G+m/4
毛の壁みたいな奴いるな

876 :デフォルトの名無しさん:2016/01/12(火) 00:48:54.32 ID:cUmJzvMy
ghcをメイクするにはghcが要るんですか?

877 :デフォルトの名無しさん:2016/01/12(火) 01:06:03.30 ID:KMQpPdRt
>>876
要ります
CコンパイラがCで書かれてるのと一緒です

878 :デフォルトの名無しさん:2016/01/12(火) 08:27:15.11 ID:9LHzGZEP
バグったghcを直すためにバグったghcを使うんだよな…

879 :デフォルトの名無しさん:2016/01/12(火) 11:56:28.50 ID:j0Q/nFNr
そういう場合、バグっていなかった最後のバージョンを特定して、それの次のバージョンのソースコード見直してリメイクして次のバージョンをリメイクしてって辿り直すんですか?

880 :デフォルトの名無しさん:2016/01/12(火) 12:09:55.19 ID:ifvCKaAg
もしIDE使ったらエディタのバグやビルドツールのバグも不可避になるのかな

881 :デフォルトの名無しさん:2016/01/12(火) 19:29:52.54 ID:gQfF03pT
Haskellは関数型言語ですから、コンパイルが通った時にはバグが無いことを保証されています。
従ってバグを持つghcは原理的に存在しません。

882 :デフォルトの名無しさん:2016/01/12(火) 20:54:15.23 ID:+sXl4caO
でもHaskellコンパイラ第一号はC/C++なんかで書かれたんでしょ?
そこで埋め込まれた可能性がある

883 :デフォルトの名無しさん:2016/01/12(火) 20:58:13.20 ID:RBb1nE9O
保証されてるのは型の整合性だけだろ

884 :デフォルトの名無しさん:2016/01/12(火) 22:04:04.84 ID:KMQpPdRt
>>879
大抵は新規の拡張とか高度な最適化に関するエンバグなので
それを用いていないGHCを-O1程度でコンパイルするぶんには無問題

885 :デフォルトの名無しさん:2016/01/12(火) 22:05:51.78 ID:KMQpPdRt
あ、よく考えたらそうでもないか。隣家廻りとかもよく壊れてる気がしてきた。
だが、まあ別にGHC自身を普通にセルフコンパイルするのに支障はない。

886 :デフォルトの名無しさん:2016/01/12(火) 22:11:51.98 ID:KMQpPdRt
>>882
Lazy MLという純粋かつ遅延評価なML方言で
GHCのプロトタイプが書かれて、それを使って
ブートストラップしたということらしい。

887 :デフォルトの名無しさん:2016/01/13(水) 07:57:01.82 ID:oCkaPOn/
コンパイルの最終ラインはCでしょ、なあに少しくらいバグが入っていた方が気付けになる

888 :デフォルトの名無しさん:2016/01/13(水) 20:45:24.32 ID:w9GbZ+Jw
Haskellは関数型言語なので並列性が最強です。
メニーコアの時代には全てのソフトウェアがHaskellで書かれるでしょう。

889 :デフォルトの名無しさん:2016/01/13(水) 21:08:44.44 ID:3fMyO6UP
せやろか

890 :デフォルトの名無しさん:2016/01/13(水) 21:26:21.50 ID:4r91zTEF
なるわけない、適材適所だよ
Haskell は強力な原語だけど万能でもなんでもない

891 :デフォルトの名無しさん:2016/01/13(水) 22:42:46.22 ID:0P99nKsm
>>888
rtsがcmmみたいなクソ言語つこうとる間は移植性皆無だし
Haskellがメニーコア時代を制するとか全くの寝言。

892 :デフォルトの名無しさん:2016/01/13(水) 23:17:52.63 ID:J+RphLvP
シングルコア、メニー言語の時代がずっと続いたから
なんでも反対する人に未来を予想させたらメニーコア単一言語になる

893 :デフォルトの名無しさん:2016/01/14(木) 08:43:44.75 ID:PREROaaL
cmmの移植性が皆無#とは

ともあれもうLLVM化がほぼ完了してるんでなあ

894 :デフォルトの名無しさん:2016/01/14(木) 21:36:49.38 ID:lc/juWNa
メニーコア時代のプロセッサはHaskellのために作られます。
従って移植性は必要ありません。
また、Haskellに対して最大の最適化がかけられるので、ただでさえ世界最高速のHaskellが
更に速くなります。

895 :デフォルトの名無しさん:2016/01/14(木) 21:41:27.88 ID:lc/juWNa
スーパーコンピューター京は、当初Cで書かれたジョブを投入していましたが、
あまりにも遅く実力を発揮できなかったそうです。
たまたまHaskellで書かれたコードを実行したところ素直にスケールし、同等のCプログラムに比べて
一万倍以上の速度をたたき出したそうです。
今では、京で実行されるプログラムの8割以上がHaskellで書かれるそうです。
この話を聞いた時、私はメニーコア時代にはHaskell以外すべて淘汰されると確信しました。

896 :デフォルトの名無しさん:2016/01/14(木) 22:16:56.74 ID:cBi4ATG+
@各位 触るな

897 :デフォルトの名無しさん:2016/01/14(木) 22:54:04.38 ID:o0uc+UVB
しれっとフォートラン無視されてて草

898 :デフォルトの名無しさん:2016/01/16(土) 11:31:35.21 ID:uAWxWNtS
メモリさえあれば無限に近い桁数の計算ができるCOBOLがさいつよだって銀行の資料室窓際のおじいちゃんが泣きながらいってた

899 :デフォルトの名無しさん:2016/01/16(土) 13:52:30.64 ID:B2ptzm1e
sparc向けのコード吐けるhaskellコンパイラって存在するの?

900 :デフォルトの名無しさん:2016/01/16(土) 17:47:04.65 ID:KeKHWyn2
>>899
つくればあるよ

901 :デフォルトの名無しさん:2016/01/16(土) 17:58:15.76 ID:0llXe6dZ
さすがにその回答はないわ

902 :デフォルトの名無しさん:2016/01/16(土) 18:02:56.95 ID:KeKHWyn2
GHCのサイトになければないに決まってるんだし、
こういうしょうもないレスを期待されてたとしか思えないんだよね。

903 :デフォルトの名無しさん:2016/01/16(土) 19:20:11.46 ID:pNi7JFmY
>>899は反語だろ多分

904 :デフォルトの名無しさん:2016/01/16(土) 19:28:23.40 ID:o1tKgFaF
SourceForgeやgithub、適当なコミュニティにあるかもしれないんだけどな
10年前なら公式サイト or SFにないなら諦める、だったけど今はどこで作られてるか分かったもんじゃない

905 :デフォルトの名無しさん:2016/01/16(土) 20:48:22.43 ID:0sqpR6Ox
sparcマシン上でソースからコンパイラメイクすればよくね?

906 :デフォルトの名無しさん:2016/01/16(土) 20:58:56.01 ID:0llXe6dZ
ターゲット上でコンパイルすればそのターゲット向け実行ファイルが作られるすばらしいコンパイラのソースをお持ちの方がいるようです

907 :デフォルトの名無しさん:2016/01/16(土) 21:06:56.91 ID:0C9LAeXO
Cを吐くjhcとか使えばいいよ

908 :デフォルトの名無しさん:2016/01/16(土) 21:07:38.08 ID:xP+g/trL
sparcってアーキテクチャとしてどこが違うんだっけ?

909 :デフォルトの名無しさん:2016/01/17(日) 13:57:54.88 ID:po5BkGJ7
Haskellのレベルでもまだ機械語が透けて見える奴と見えない奴がいるね

910 :デフォルトの名無しさん:2016/01/17(日) 14:35:14.34 ID:Nzqff/kH
Haskellなんてそれこそ透け見えちゃいけない言語だしな
元の話だが、sparcクロスコンパイルもダメなんだけか?
今どき少ないがWSの並列のためにありそうなもんだが

911 :デフォルトの名無しさん:2016/01/17(日) 16:43:00.23 ID:snuCDPAE
京でhaskellなんていう妄言に対するただのヤジだったのに、思いの外盛り上がってし待っている

912 :デフォルトの名無しさん:2016/01/17(日) 16:47:33.31 ID:8TKcXYcp
京はやっぱりfortranですかね

913 :デフォルトの名無しさん:2016/01/17(日) 18:30:04.29 ID:6Xbfm/TM
>>907
あれはもう死んだでしょ

914 :デフォルトの名無しさん:2016/01/17(日) 19:17:09.30 ID:EUfsW/B2
>>911
質問の契機が思いの外しょうもなかった

HaskellでもFortranでもどっちでも良いが京では数学者が最適化しやすい方が良いんだろうな
どっちがいいかはプログラマ上がりじゃわかんねーや

915 :デフォルトの名無しさん:2016/01/18(月) 07:26:30.97 ID:lC5RiWYz
>>913
別に死んでないよ
ajhcがコンパイルできなくなってるのは
単にApplicativeがMonadの上に追加されたのに
追従してないだけなんで簡単に直せるよ

916 :デフォルトの名無しさん:2016/01/18(月) 08:10:47.49 ID:z+08kDV+
死んでるじゃん

917 :デフォルトの名無しさん:2016/01/18(月) 08:26:38.17 ID:20Rww3ua
心室細動だよ。まだ死んでない

918 :デフォルトの名無しさん:2016/01/18(月) 08:38:12.76 ID:lC5RiWYz
その程度も自分で直せずに「死んでるじゃん」とか言ってるの……?

919 :デフォルトの名無しさん:2016/01/18(月) 09:44:26.78 ID:2kgu3Wem
その程度の改修も公式に入らないほどにメンテが滞っているのならプロジェクトとしては死んでる、ってことだろ

920 :デフォルトの名無しさん:2016/01/18(月) 11:20:01.95 ID:8cTkl+Hb
所詮研究のためのおもちゃなんだなあ

921 :デフォルトの名無しさん:2016/01/18(月) 12:55:40.37 ID:tos9CkFO
じゃあ研究じゃなくて練習といえばいいだけ
練習もせずにぶっつけ本番なんてとんでもない

922 :デフォルトの名無しさん:2016/01/18(月) 21:36:05.75 ID:JZfdalHf
>>918
Monadがどうこう以前に、GCに関連した処理がどこか
おかしくて、しかもMさんが見てもFixできなかったアレ。

(Mさんも本業の片手間だったかもしれないので
本当はがんばればFixできる可能性はあるけど、
どうも boxing - unboxing の処理が非常に込み入ってるらしく
jhcにちょろっとスケッチしてある程度の事だけを
ヒントにやらないといけないらしく、結局中断してる)

923 :デフォルトの名無しさん:2016/01/19(火) 00:53:18.74 ID:57+hGCwq
研究職以外はオモチャとしてしか扱えんわな
純粋関数の可能性を追求したり、副作用のない環境での理論証明ツールだったり
そんな学術以外への転用がベストではない言語、普通のPGには使う意味ないもの

924 :デフォルトの名無しさん:2016/01/19(火) 02:31:06.01 ID:unNXfSBy
科学技術用ってFortran?

925 :デフォルトの名無しさん:2016/01/19(火) 08:54:34.98 ID:PSMgNBFb
fortranスレで聞け

926 :デフォルトの名無しさん:2016/01/19(火) 09:41:41.72 ID:N1YYkuEv
研究職は基本fortran,Mathematica,mapleから選ぶ感じ

927 :デフォルトの名無しさん:2016/01/19(火) 09:45:48.91 ID:n8RJjF56
数理ではHaskell便利なのになぁ

928 :デフォルトの名無しさん:2016/01/19(火) 10:42:59.62 ID:n/8vNsiZ
一部のアルゴリズムの実装が簡単

929 :デフォルトの名無しさん:2016/01/19(火) 15:53:22.93 ID:2890i3Ni
局所的なアルゴリズムじゃなくて、もっと全体を支配するような仕組み
静的型付けとかデザインパターンとか
デザインパターンはたとえば非決定性やイテレータやモナドや非同期のようなもの

930 :デフォルトの名無しさん:2016/01/19(火) 16:10:57.67 ID:u5xt7rMo
JavaとHaskellどっちが実行速いの?

931 :デフォルトの名無しさん:2016/01/19(火) 18:57:29.11 ID:utvSG+ku
jhcの話してんのにHaskell=おもちゃと読み取ったアホがいるらしい

932 :デフォルトの名無しさん:2016/01/19(火) 19:44:38.35 ID:2890i3Ni
言語は二つ以上覚えるとよい
そのうち一つは玩具といわれても腹の立たない言語
C++, Java, Haskellから二つ選ぶなら重複の少ないものがよいからJavaは選ばない

933 :デフォルトの名無しさん:2016/01/19(火) 19:47:55.74 ID:n8RJjF56
>>929含め何を言ってるのかサッパリ分からないのは関数型脳じゃないからなのか
誰か日本語で訳してくれい

934 :デフォルトの名無しさん:2016/01/19(火) 20:35:11.06 ID:56LgXKla
誰かS式に訳して

935 :デフォルトの名無しさん:2016/01/19(火) 20:43:40.58 ID:9Sv9SZsi
そうなんですよ。
Haskellを初めとする関数型言語は数学者にとって超絶便利。
しかしながら数学がわからない者にとっては難解なだけです。
まあ言ってみれば馬鹿には無理ってことなんですよ。
選ばれた天才が使ってこそ意味のある言語なんです。

936 :デフォルトの名無しさん:2016/01/19(火) 20:49:29.88 ID:1uIbW5OB
K定期

937 :デフォルトの名無しさん:2016/01/19(火) 21:02:43.49 ID:2890i3Ni
デザパタが難しいのは、コードの中にパターン名が明記されている保証がないから
明記しないから正式名称が統一されている保証もない

938 :デフォルトの名無しさん:2016/01/19(火) 21:34:03.32 ID:n8RJjF56
>>936
なるー、翻訳thx

939 :デフォルトの名無しさん:2016/01/20(水) 07:09:49.67 ID:xfIx1JoD
安全工学の知見?

940 :デフォルトの名無しさん:2016/01/20(水) 22:33:36.75 ID:zBNmSvu8
>>994
makiが馬鹿にしてる「安倍首相」って現世にいる安倍首相とは別の人間なんじゃないか、って思うときがある。
なんか自分が妄想してる間抜けの具現した影を殴り倒してはしゃいでる、みたいな。
奴が書き込んでるコメントを見てると根本的な事すら理解してないことが結構ある。

941 :デフォルトの名無しさん:2016/01/20(水) 22:35:37.60 ID:zBNmSvu8
スマン。誤爆したorz

942 :デフォルトの名無しさん:2016/01/21(木) 20:24:13.58 ID:+cVcyY3w
バトルプログラマー☆マキの話ならココで合ってるぜ。

943 :デフォルトの名無しさん:2016/01/24(日) 22:23:49.70 ID:1M5wgVFf
HDBCのexecute関数ってどこで実装されているのでしょうか?
Statement.hsの34行目に型宣言は見つかったのですが、実態が見つかりません。
よろしくお願いします!

944 :デフォルトの名無しさん:2016/01/24(日) 22:40:42.90 ID:1M5wgVFf
x実態
o実体

945 :デフォルトの名無しさん:2016/01/24(日) 22:42:43.90 ID:zJPsJxlD
>>943
Haskellは停止の必要無しにネットワークのむこう側にでさえコードを移動できるのです。
計算の途中で性能の不足を感じたら、性能の高いマシンへイメージを転送し、実行を継続します。
ですから、実装がどこにあるかは問題ではないのです。
Haskellであること、そしてHaskellを使えることが重要なのです。
Haskell使いであることに誇りを持ちましょう。

946 :943:2016/01/24(日) 23:37:58.35 ID:1M5wgVFf
すみません、意味がわかりません。
僕が知りたいのはどのソースのどの行にexecuteの実装があるかです。
よろしくお願いします。

947 :デフォルトの名無しさん:2016/01/25(月) 00:25:15.56 ID:+Q+z/Jp3
>>943 >>946
Javaで言うところのInterfaceみたいなもんだから
各データベース管理システムごとに実装が作られてる
sqlite3ならHDBC-sqlite3に
PostgreSQLならHDBC-postgresqlに

948 :デフォルトの名無しさん:2016/01/25(月) 01:35:24.48 ID:PuP3t03Q
>>945
こんなのに騙される奴がいるのか?
前向きな事を言っているから建設的な議論なんだろうみたいな考えの奴しか騙せないだろ

Haskellはおもちゃという批判の方がまだマシだ

949 :デフォルトの名無しさん:2016/01/25(月) 07:13:34.86 ID:UErqEOmx
>>945
OCamlスレに帰りたまへ

950 :943:2016/01/25(月) 15:13:40.10 ID:jwcC6CKd
>>947
なるほど!ありがとうございます!

951 :デフォルトの名無しさん:2016/01/25(月) 20:55:40.98 ID:bhSAv5/D
このスレ、まだ関数型言語ブーム時のあれこれを引きずってて笑う

952 :デフォルトの名無しさん:2016/01/25(月) 21:32:23.89 ID:FKcC8XYP
引きずってるのは変な虫だけですから

953 :デフォルトの名無しさん:2016/01/25(月) 22:47:29.59 ID:mYLsxkwY
一部の奴が胡乱な書き込みをしているだけで、9割が現実を見ているよ

954 :デフォルトの名無しさん:2016/01/26(火) 01:28:52.09 ID:fLwBjkWJ
ジエネレーティブプログラミングみたいな表現力で考えると、スキャフォルドやテンプレートか、lispのマクロか、全てがs式(データ)か、haskellの遅延評価みたいな選択肢があって、
得手不得手含めて、どれが好きか勝手に選べみたいな感じ。
って、書いてて全く意味が分からないが。

955 :デフォルトの名無しさん:2016/01/26(火) 01:30:15.26 ID:fLwBjkWJ
型の表現力は考慮してなかった。

956 :デフォルトの名無しさん:2016/01/26(火) 08:56:48.33 ID:9z2oQ6YS
>Javaで言うところのInterfaceみたいなもんだから

こマ?

957 :デフォルトの名無しさん:2016/01/26(火) 09:22:36.05 ID:hH8elJ+8
>>956
ざっくりしすぎだけどまあ、気持ちとしては近いんじゃね

958 :デフォルトの名無しさん:2016/01/27(水) 20:33:39.13 ID:tY0EzgE5
わしも昔はHaskellerとして名を馳せたのじゃったがライブラリにArrowを受けてしまってな

959 :デフォルトの名無しさん:2016/01/28(木) 03:10:29.57 ID:s/n+KVu9
後から実装できるのがinterfaceとは違う

960 :デフォルトの名無しさん:2016/01/28(木) 10:55:25.89 ID:oB3jszBn
templateを教えたらHaskell並みに難しいのがバレるからinterfaceしか教えない現実

961 :デフォルトの名無しさん:2016/01/28(木) 11:11:40.25 ID:tTuOSjjQ
重箱の隅をつついてどうでもいいことに華を咲かせるなぁ
言語違うんだから完全一致の概念にはならんだろ
ざっくりした気持ちで受け止めとけ

962 :デフォルトの名無しさん:2016/01/28(木) 19:20:31.31 ID:V4rb6WtO
このスレにたどり着いたHaskell初心者が誤解してしまう恐れを取り除かないと

963 :デフォルトの名無しさん:2016/01/29(金) 22:37:12.50 ID:V8UIRHzx
2ちゃんやってる段階で加齢臭漂うジジイしかいないこと確定なんで、意識高い(笑)Haskellワナビは
こんな痰壺のぞきに来ないやろ彡(゚)(゚)

964 :デフォルトの名無しさん:2016/01/30(土) 08:45:57.67 ID:vmtmT3H6
3日に1回しか本気出さない怠け者でも通常の3倍以上生きてるだけでわりと有能だからね
若者に嫉妬されるのも仕方ない

965 :デフォルトの名無しさん:2016/01/31(日) 04:05:38.74 ID:1wXDLlpg
すごいハスでさえなかなか読み切らない
できる人はあれ一日でおkなん?

966 :デフォルトの名無しさん:2016/01/31(日) 09:28:31.71 ID:AEzrRz3r
>>965
読み切るだけなら1日か、長くても数日でできるでしょう。

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

がんばってください。

967 :デフォルトの名無しさん:2016/01/31(日) 10:25:52.63 ID:XFfzw+ki
少しでも批判的な立場から見れば、全部読み切る必要がないのは明らかだけど
批判を封じると無駄が増えていく

968 :デフォルトの名無しさん:2016/02/01(月) 06:10:51.64 ID:zz5N12rG
鈍感力とかいってた頃は鈍感だからいくら批判されてもOKだったけど今は批判NGなのかな

969 :デフォルトの名無しさん:2016/02/01(月) 09:59:54.71 ID:CiTgPvzP
また胡乱な書き込みが増えてきた
コードをさらせ

970 :デフォルトの名無しさん:2016/02/01(月) 21:19:05.11 ID: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" だ。

すごくね?

971 :デフォルトの名無しさん:2016/02/01(月) 21:26:58.60 ID:TMgHKDk0
>>970
うんそうだね。

でも遅延評価ってのが何物なのかわかってくるとあんま驚かない。

972 :デフォルトの名無しさん:2016/02/01(月) 23:05:53.20 ID:t43chpFC
yieldある言語だと無限要素の実現は容易だけど
それをリスト構造として扱えるって点では便利かもね

973 :デフォルトの名無しさん:2016/02/01(月) 23:14:58.61 ID:Ciri+Qiy
遅延評価は並列処理をしようとすると驚き最小の原則を破る

974 :デフォルトの名無しさん:2016/02/01(月) 23:47:41.92 ID:WxMLgo2+
遅延評価はノンプリエンプティブマルチタスクの親戚
タスクを遅延している

もしプリエンプティブならタスクが勝手に動き出すので無限ループを止められない
メニーコアとかも無限ループを止められない

975 :デフォルトの名無しさん:2016/02/02(火) 02:33:42.54 ID:Dqi7KAqT
遅延のおかげでメモリ不足になってエラーになった

976 :デフォルトの名無しさん:2016/02/02(火) 04:43:44.40 ID:xJAws4GV
ここから遅延評価の悪口を言っていこう

977 :デフォルトの名無しさん:2016/02/02(火) 05:59:03.44 ID:JJLoMZID
どんなに素晴らしいプログラミング言語だろうと
コーディングする人間の質が悪ければ何の意味も価値もなさない

http://ideone.com/880zvK

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

まあこの程度のものを>>977みたいに書かれたらそりゃたまらんよな

979 :デフォルトの名無しさん:2016/02/02(火) 18:57:44.79 ID:PRq2IyAN
ワンラインシェルスクリプトの俺スゲーみたいだな
悪いわけじゃないが、他者の可読性ってどうなんだ?

980 :デフォルトの名無しさん:2016/02/02(火) 19:35:18.50 ID:uTTEQY4N
>>977
酷すぎて乾いた笑いが出るな
Sラン級糞コーダーに解答例書かせるとかPaiza大丈夫か

981 :デフォルトの名無しさん:2016/02/02(火) 19:43:13.89 ID:24ytvjJT
このスレ、書いてないことまで透視能力使って読んでる奴いっぱいいるじゃん
それに比べたら書いてあることの可読性がどうなろうと透視するのは簡単だろ

982 :デフォルトの名無しさん:2016/02/02(火) 19:49:12.70 ID:uTTEQY4N
検索してみたらただの2chの回答者じゃん
流石に一般人晒すのはマズイよ

983 :デフォルトの名無しさん:2016/02/02(火) 20:19:13.66 ID: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が先頭につくのはどうしてですか?

984 :デフォルトの名無しさん:2016/02/02(火) 20:29:25.29 ID:lBmePa6t
>>983

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

2.そもそも再帰的定義

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

が理解出来てるか?

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

すみません、理解できていないです。
なぜ葉は直接fを適用できないのでしょうか?

986 :デフォルトの名無しさん:2016/02/02(火) 21:14:43.83 ID: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 という式は意味を成さない。

987 :デフォルトの名無しさん:2016/02/02(火) 22:42:19.59 ID:x3VaMdqQ
Haskellは無限ループに陥りません。
だからこそコンパイルが通ればバグが無いことを保証できるのです。

988 :デフォルトの名無しさん:2016/02/03(水) 00:23:47.55 ID:eYCB0y5I
バグの定義からはじめようか

989 :デフォルトの名無しさん:2016/02/03(水) 01:05:28.09 ID:pvHSiWBf
>>985
1. fが受け取るのは[xの型] (xは[Tree型]じゃない)
2. left と rightは[Tree型]
3. [Tree型]とfの仲介がfmap

おわかり?

990 :デフォルトの名無しさん:2016/02/03(水) 03:37:57.16 ID:mzFRVKkI
ideoneでhaskellのサンプルコードが無限ループじゃなかったっけ?

991 :デフォルトの名無しさん:2016/02/03(水) 04:12:58.04 ID:OD3iNzjF
Androidでお手軽にHaskellできるアプリ誰か頼む。C4droid並の品質で。ソースコードはAndroidのVimTouchで書くからIDEは要らないや

992 :985:2016/02/03(水) 11:15:50.69 ID:B67PXnHg
>>986, 989
理解できました!
わかりやすい説明ありがとうございます!

993 :デフォルトの名無しさん:2016/02/03(水) 13:15:08.68 ID:KiXDjJxB
タブレットでコーディングする需要があるのか…

994 :デフォルトの名無しさん:2016/02/03(水) 13:41:55.87 ID:vZagwsW/
arm向けのコード吐けるhaskellコンパイラって存在するの?
と言ってみる

995 :デフォルトの名無しさん:2016/02/03(水) 13:47:52.96 ID:WaqhOfMD
ARMをターゲットにしたクロスコンパイラなGHCは普通に存在する

そのGHCでGHC自体をARM向けにコンパイルすれば
ARM計算機上でHaskell使った開発ができるはず

996 :デフォルトの名無しさん:2016/02/03(水) 14:04:22.91 ID:uEOUJl1K
むしろプラットフォームに依存しないようなソフトしか書けないやろ

997 :デフォルトの名無しさん:2016/02/03(水) 17:44:14.30 ID:vZagwsW/
>>899に被せただけで特に意味はなかったが、クロスコンパイル環境は普通にあるのな
Androidなら誰か暇人が作ってそうだけど、あっても古くてメンテされてないかな

>>996
そのコメントは流石に的が外れすぎてる

998 :デフォルトの名無しさん:2016/02/03(水) 20:41:29.18 ID:WaqhOfMD
というかそもそもGHCはLLVMに対応してるからな

999 :デフォルトの名無しさん:2016/02/03(水) 20:54:22.37 ID:jdFVwRiR
>>993
キッズが空き時間にスマホにBluetoothキーボード繋いでCodeForcesやるだろ

1000 :デフォルトの名無しさん:2016/02/03(水) 22:28:22.77 ID:SRrG8qzq
トイプログラムで遊んでないでアプリ作ろうぜ

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

1002 :1002:Over 1000 Thread
2ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


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

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

▼ プレミアム会員登録はこちら ▼
http://premium.2ch.net/
http://pink-chan-store.myshopify.com/


289 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.02 2018/11/22 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)