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

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

■ このスレッドは過去ログ倉庫に格納されています
0001岡部メモリリーク健2015/07/14(火) 19:27:09.01ID:jJ1YDtNe
関数型プログラミング言語 Haskell について語るスレです。

         ,.-―: ̄`ー::::::::::、
       /::::::::::::.::::::::::::::::::::::::::::`::、、
      /::::::::::::::::::::::::::::::::::::::::::::::::::::::`、
      l::::::::::::::::::::::::::::::::::::::::;':l:::::::::::\::l
      l:::::::::::::::::::::::::::::::::,,::::::::;-,:,::::::::::::::::l
     l::::::::::::::::,_,.::::,';::::::;:::::: :: l ::::::::::::::l
     l::::::::::/-/:::/-ニ,.::::/=,./::::::::::l
     ヽ:::: ´、ひ> ;:  l .<ひ>'  、::::::::/
    ヽ:::::    ̄ .)::;  l  ̄   l::::/    < 毛の壁(岡部健)の話は禁止な
     、:::::..   /:::; .,-、     l:::/、
    ,―::::::::  ゝヽ- ー' 、    l::/,、ヽ
     l,、,、,,:、:: / ,--、,-.、_ l    /::::::,、,、l
   l,、,、,、,、,、::、 `ー ̄-'   /:::::::::::,、,、l
   l,、,、,、,、,、,、::ヽ      /::::::::、,、,、,、,ノ:\

haskell.org (公式サイト)
http://www.haskell.org/

前スレ
関数型プログラミング言語Haskell Part28
http://peace.2ch.net/test/read.cgi/tech/1428535861/
0083デフォルトの名無しさん2015/07/21(火) 13:32:51.80ID:aaCdXzrq
http://yomogi.2ch.net/test/read.cgi/net/1437302243/
GitHub/Qiita/StackOverflowの臭い奴を観察1
0084デフォルトの名無しさん2015/07/21(火) 19:49:21.60ID:LwXUVlfX
https://gist.github.com/anonymous/10622bea0d37cdd0f59f
0085デフォルトの名無しさん2015/07/21(火) 22:58:37.09ID:eRnXfzMM
毛の壁の記事を探索するbotコンテストでも開催しろ
0086デフォルトの名無しさん2015/07/23(木) 08:07:45.47ID:Hd8z6Qav
>>82
Qiita荒らしにしか見えない。
0087デフォルトの名無しさん2015/07/23(木) 09:38:20.27ID:UOPnVIxG
Monadでは
>>= :: ma -> (a -> mb) -> mb
となっているですが、これは、どうして
>>= :: ma -> (ma -> mb) -> mb(つまり普通のapply)
ではだめなのでしょうか?
0088デフォルトの名無しさん2015/07/23(木) 10:23:45.67ID:9NQb4Eqn
>>87

X -> m Y というタイプの関数をたくさん繋げたいという気持ちがあるわけ。mがモナドだとするとき
m でラップされた型、たとえば m Int だとか m () だとかを「mという文脈を付与された型」だと思う
ことにします。m としては IO や Maybe を考えれば考えやすい。

f :: X -> m Y
g :: Y -> m Z

みたいなのがあったとき、fの結果の文脈を引き継いでgを計算したいわけ。たとえば m が
Maybeならば、fの結果は Nothing かもしれないわけ。IOだったら、実行時環境からIOで
ラップされた値を受け取ってるかもしれない。そういうのを受けて g を計算したいわけ。

このとき、>>= があるおかげで

(f x) >>= g

というのが計算できるわけ。「fのあとにg」というのを素朴に、思いついたままにやろうとすると

g ( f x) -- 型が合ってないので illegal

だけど、これは m 一個分型がずれてるからダメ。>>= は、一個分の m を吸収して
適用してくれる。だから、「モナドでラップされた値を取り出して適用してくれる」
みたいな言われ方をするけど、まあ、結果としてそう見えるようなうまい定義が
されてる。(例えばモナド則なんかがそんなうまい定義の背景にあって、そういうのを
どうやって思いついたか説明しようとすると圏論の話しになる。しらんでいい。)
0089デフォルトの名無しさん2015/07/23(木) 10:30:27.22ID:9NQb4Eqn
>>87

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

そういう場合、

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

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

具体的に考えてみましょう。 m が Maybe の場合、 extract Nothing は何になりますか
0092デフォルトの名無しさん2015/07/23(木) 11:59:35.34ID:9NQb4Eqn
>>90
よくいろいろなところで、(>>=) は「モナドから値を取り出して関数に適用する」
と言われたりするけど、unit と join を基礎にしてモナドを作ると、このトリックは
理解しやすい。

参考: ttps://ja.wikibooks.org/wiki/Haskell/%E5%9C%8F%E8%AB%96

要するにMがモナドだとして

unit :: a -> M a

join :: M (M a) -> M a

があったとき

(>>=) :: M a -> (a -> M b) -> M b
x' >>= f = join ( (fmap f) x' )

となって、実際には fmap f を適用して、ダブった M を一枚剥がして M b の値を返してる。
(つまりモナドの中から値を引っ張りだす、というような事は実際にはやってないわけ)。

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

そういううまいルールをどうやって設定するかみたいな話をするために圏論を借りてきてる。
正直、圏論だとかいってもこのレベルの話ならグラフ理論と難しさは変わらん。
(表示的意味論でも圏論を使うけど、そっちは数学がよほど好きでないと厳しい)。
0093デフォルトの名無しさん2015/07/23(木) 13:06:35.41ID:UOPnVIxG
>>91
> extract Nothing は何になりますか
なるひどこれは困った。。。

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

>>= :: ma -> (a -> mb) -> mb の中では、特に、
a -> mb の部分がモナドにとって本質的なんだなと思えてきました
0094デフォルトの名無しさん2015/07/23(木) 13:35:05.00ID:UOPnVIxG
>>92
> そういううまいルールをどうやって設定するかみたいな話をするために圏論を借りてきてる。
「そういううまいルール」とは、どこの事でしょうか?
0095デフォルトの名無しさん2015/07/23(木) 13:41:38.62ID:UOPnVIxG
>>92
extract :: ma -> a
は存在しない場合があるようですが、
いつも存在しないのですか?
また、join :: m(ma) -> ma
は必ず存在するのですか?
0096デフォルトの名無しさん2015/07/23(木) 14:03:17.98ID:9NQb4Eqn
>>94
そういう上手いルール、はモナド則です。(Functor則と合わせて機能する)。

>>95
たとえば identity モナドなら extract は存在します。大事なのは「一般には、モナド M
に対して extract :: M a -> a が定義できない」ということ。 extract の存在を仮定してると
モナドの一般論にはならないわけです。

join :: M(M a) -> M a

の存在は、モナドの構成要件の一つだと言って差し支えないと思います。
Mがモナドであるかぎり必ず存在する。

参考:ttp://hackage.haskell.org/package/base-4.8.1.0/docs/Control-Monad.html#v:join

(さっき挙げたWikibooksのページには、unit + join でやる流儀と unit + bind
でやる流儀の両方が解説されてます。論理的にはどっちで考えても良い。)
0097デフォルトの名無しさん2015/07/23(木) 18:38:39.92ID:KEVSaEFA
日本語でおすすめの入門サイトってありますか?
0098デフォルトの名無しさん2015/07/23(木) 21:02:13.38ID:hAeb0KoI
Haskellの型システムは入門用ではない
静的型と動的型の高度な煽り合いの成果物だ
0099デフォルトの名無しさん2015/07/23(木) 21:31:05.23ID:UOPnVIxG
>>96 :デフォルトの名無しさん:2015/07/23(木) 14:03:17.98 ID:9NQb4Eqn
> そういう上手いルール、はモナド則です。
うまいというより、ふつうに定義すればモナド則は満たされるのではないですか?

> join :: M(M a) -> M a
> の存在は、モナドの構成要件の一つだと言って差し支えないと思います。
joinがそうであるのにextractがそうでないのはなぜでしょうか?
まあ、oinは不可欠だが、extractはなくても代わりがあるからだということなのでしょうが
0100デフォルトの名無しさん2015/07/23(木) 21:46:55.16ID:9NQb4Eqn
>>99
たとえば http://d.hatena.ne.jp/itto100pen/20090710 に、モナド則の一部が満たされない例があります。
「普通に定義すれば」モナド則は満たされるというのは、経験的には確かにそういう場面が多いかもしれませんが、
状況が込み入ってくれば、いつか「普通にモナドっぽいものを作ったつもり」なのにモナド則を満たさないものに
遭遇するかもしれません。

>joinがそうであるのにextractがそうでないのはなぜでしょうか?
モナドというものがそういうものだからとしか言いようがないですね。

>>93 であなたは
>a -> mb の部分がモナドにとって本質的なんだなと思えてきました

と書いていましたが、この X -> m Y 型の射をつなげてどうにかするための仕組みが
備わっているものをモナドと呼ぶわけです。うまくこのタイプの射をつなげるためには、
ダブったmをうまく剥がしてくれるものが必要で、それが join なわけです。

さっき挙げたWikibooksのページに、join を使って bind を作ったり、bind を使って join を作る
話が載ってますので、参考になさってください。

一方、あなたが書いてる extract :: M a -> a に相当する仕組みを考える場面は
一応あります。それは、 m X -> Y 型の射をうまくつなげてどうにかしたい場合です。
それは「コモナド」と呼ばれてます。(これを積極的に考える場面もあるらしいのですが
私の勉強が追いついていないのでコモナドについてこれ以上語れることはありません。)
0101デフォルトの名無しさん2015/07/23(木) 21:58:48.06ID:GSXYPmA+
>>100
空でないデータ構造に対して、その中のある(現在注目している)要素を特に指し示す
ある種のポインターを持った構造として使う、というのがよく知られた例ではないかと。

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

「不自然にならないよう自然を保証してくれるので復旧シナリオは考えていない」
まさかこのパターンの意味がわからない難聴系主人公はいないよね
0108デフォルトの名無しさん2015/07/24(金) 08:17:51.80ID:ZflfUkEE
>>107
> 「不自然にならないよう自然を保証してくれるので復旧シナリオは考えていない」
> まさかこのパターンの意味がわからない難聴系主人公はいないよね
ここよくわからない。少し説明を加えてくれませんか
0109デフォルトの名無しさん2015/07/24(金) 08:31:24.73ID:sUR4TL+C
モナド則を満たさないモナドインスタンスは使用者が大いに困るだろう
上の return x = [x x]
とか
0110デフォルトの名無しさん2015/07/24(金) 09:47:25.11ID:+b/Jkmb9
明らかにモナド則を満たさないモナドインスタンスの例はよく出てくるけど、
「ふつうの」FunctorやApplicative Functorであって
Monadでないものの具体例ってあるのかな
0111デフォルトの名無しさん2015/07/24(金) 10:31:52.55ID:qo8KZeeD
>>110
ZipList
理由はこれ http://www.mail-archive.com/[email protected]/msg57217.html
0112デフォルトの名無しさん2015/07/24(金) 12:24:32.99ID:mRGyPSzK
>>109
確かにロボットが困った顔してるように見える
0113デフォルトの名無しさん2015/07/24(金) 16:30:09.13ID:sUR4TL+C
>>110
間違ってるかもしらんけど
関数はFunctorやApplicative Functorだけどmonadではなかったような
0114デフォルトの名無しさん2015/07/24(金) 18:21:56.53ID:ZflfUkEE
>>113
関数は恒等モナドなのでしょう?
0115デフォルトの名無しさん2015/07/24(金) 20:30:46.83ID:ZflfUkEE
とにかくモナド則ってモナドの本質とは全然関係ないですよね。
そのネーミングがよくないなw
0116デフォルトの名無しさん2015/07/24(金) 22:02:00.45ID:UUB1Rdtf
>>115
モナドの本質とは、Kleisli射が「合成できる」ことであって、モナド則は
そのような合成が well-defined であることを保証しているという意味では本質と
関係している。
0117デフォルトの名無しさん2015/07/24(金) 22:15:15.51ID:E+4NqHJH
>>113
(->)型はモナド。
Readerモナドの正体は関数モナドそのもの。
0118デフォルトの名無しさん2015/07/24(金) 22:26:30.02ID:XFwmWe1A
モナド則は情報量保存則のようなものだと思ってもよい
(>>=)やreturnでwrapするだけで元の情報が失われるような実装は禁止
後に続く関数に元の情報を全て渡す

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

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

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

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

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

としたとき、このtraceってwell-defined?
0132デフォルトの名無しさん2015/07/26(日) 10:00:37.02ID:dkr9+eHq
型に特質があるから値の特質(モナド則?)はなくても良くね?
「選択と集中」とかいう言葉を信じるなら値に特質を持つことは寧ろ禁止した方が良い
0133デフォルトの名無しさん2015/07/26(日) 11:46:33.95ID:rsm1cXgs
HackageDBである特定のパッケージに依存しているパッケージの一覧を得る
検索方法はないでしょうか。

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

選択と集中でおもいっきり原子炉にぶっこんだ東芝はどうなった? 
0135デフォルトの名無しさん2015/07/26(日) 20:37:01.68ID:vJ1KGCO5
さすがにそこで原発でてくんのは謎
0136デフォルトの名無しさん2015/07/26(日) 20:44:23.44ID:vJ1KGCO5
マジレスするとモナド則を満たしてないモナドインスタンスはバグだ
利用者が困る
0137デフォルトの名無しさん2015/07/26(日) 20:52:18.39ID:dkr9+eHq
色々な機能を全部まとめて売りつけようとする奴がいるから
欲しくないものまで買わされて損する場合がある
それよりは欲しいものだけを集中的に買って損する方がマシ
0138デフォルトの名無しさん2015/07/26(日) 21:02:49.59ID:vJ1KGCO5
モナド則満たしてないモナドインスタンスなんて欲しくないもの買わされたって状態だよ
0139デフォルトの名無しさん2015/07/26(日) 21:02:55.04ID:PdaEJy2y
モナド則を満たしていることをコンパイル時に証明する機構がHaskellに望まれる
0140デフォルトの名無しさん2015/07/26(日) 23:01:02.42ID:ooP+OwHf
完全な保証は無理でもQuickCheckあたりでなんとかならんかな
0141デフォルトの名無しさん2015/07/27(月) 03:43:19.54ID:+mQx9Q9E
選択と集中というのは、経済学の用語で比較優位の話だ。

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

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


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

パッケージをインストールするとドキュメントも一緒にインストールされるように設定しましたが、
ドキュメントのルートのindex.html(.cabal/config ファイルの dic-index-file の項)が更新されるとき、
インストールしたパッケージが公開しているモジュールへのリンクが間違った場所を指しています。

.cabal/config ファイルのインストールディレクトリ関係の項はデフォルトで下記のようになっています(一部だけ抜粋)。

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

install-dirs user
 prefix: /home/ユーザー名/.cabal
 datadir: $prefix/share
 docdir: $datadir/doc/$abi/$pkgid
 htmldir: $dicdir/html
 haddockdir: $htmldir

例えば今 hacolour-1.23 パッケージをインストールすると、ドキュメントは
/home/ユーザー名/.cabal/share/doc/x86_64-linux-ghc-7.10.1/hscolour-1.23/html/
以下にインストールされます。

しかし、doc-index-file の index.html ページの例えば Language.Haskell.HsColour のリンクは
/home/ユーザー名/.cabal/share/doc/x86_64-linux-ghc-7.10.1/Language-Haskell-HsColour.html
を指すように更新されてしまいます。
当然、そんな所に Language-Haskell-HsColour.html ファイルはありません。

この間違ったリンクを正しく
/home/ユーザー名/.cabal/share/doc/x86_64-linux-ghc-7.10.1/hscolour-1.23/html/Language-Haskell-HsColour.html
を指すように設定するには
.cabal/config ファイルのどこを直せば良いのでしょうか。
0168デフォルトの名無しさん2015/08/02(日) 21:22:35.46ID:PjsL8G7T
>>167
>doc-index-file: $datadir/doc/$arch-$os-$compiler/index.html

普通に

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

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

htmldir: $docdir/html

です。
0175デフォルトの名無しさん2015/08/03(月) 11:59:33.09ID:C3iL4RK8
>>172
モナドFとGについて、合成関手FGに対して適切なηとμを、
「一般には」構成できない。FとGがよほど相性が良い場合は別だけど。
0176デフォルトの名無しさん2015/08/03(月) 17:24:38.72ID:u3Kfbgnb
         ,.-―: ̄`ー::::::::::、
       /::::::::::::.::::::::::::::::::::::::::::`::、、
      /::::::::::::::::::::::::::::::::::::::::::::::::::::::`、
      l::::::::::::::::::::::::::::::::::::::::;':l:::::::::::\::l
      l:::::::::::::::::::::::::::::::::,,::::::::;-,:,::::::::::::::::l
     l::::::::::::::::,_,.::::,';::::::;:::::: :: l ::::::::::::::l
     l::::::::::/-/:::/-ニ,.::::/=,./::::::::::l
     ヽ:::: ´、ひ> ;:  l .<ひ>'  、::::::::/
    ヽ:::::    ̄ .)::;  l  ̄   l::::/    < 排便ダン きんもちい〜
     、:::::..   /:::; .,-、     l:::/、
    ,―::::::::  ゝヽ- ー' 、    l::/,、ヽ
     l,、,、,,:、:: / ,--、,-.、_ l    /::::::,、,、l
   l,、,、,、,、,、::、 `ー ̄-'   /:::::::::::,、,、l
   l,、,、,、,、,、,、::ヽ      /::::::::、,、,、,、,ノ:\
      /⌒\〆',  `  ̄ ´  ゝ/⌒\
    /  ノつ\ ・    ・  /⊂  ヽ!
o0○ノ  /  3  \ (::::⌒ヽ / とノ\ ヽ○0o
(    /、_ノ\   Y `(_、_)   /  \´  )゚
 \_)    `ヽ   : :;;*:;   : : : |    (_ノ
         人__;;:;;、___ノ          ヽヽ        ヽヽ
             ;:;;:;;:;,,           ──┐ |  |   ──┐ |  |
          ∬ ;;:;::.;::.::;::..:;:..: ∬          /  |  |      /.  |  |
      ・〜   ;::;.:;:;:;:;:.:;:.:::.;:;:;.:.:.:          ノ    ノ  ┐ ノ    ノ  ┐
          ∬;;;:::;;;:;:.:;:.::.:;;.:.;.:;.:; ∬                 ┴    ヽヽ     ┴
              :"
0177デフォルトの名無しさん2015/08/04(火) 07:05:53.89ID:fTn2TRnu
もし敵の武器をコピーする能力があったら
意味不明すぎてコピーできない武器を使えばいい
0178デフォルトの名無しさん2015/08/04(火) 09:50:58.91ID:Jii/ZMO+
>>175
了解。
モナドが合成できないということは、代数的議論としてはそうだと言ってればいいんだろうが、
プログラミングとしては、致命的なのではないの?
0179デフォルトの名無しさん2015/08/04(火) 18:16:37.45ID:Qc8p5PG4
>>178
代数的な議論とか言ったって簡単に情報系の議論に移せるよ。

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

もう少し具体的に言えば、Maybeと状態モナドStateを考えたとき、Maybe State s a と State s Maybe a
を何も制約つけずに同一視できるほうがプログラミングとしては致命的だよ。
0180デフォルトの名無しさん2015/08/04(火) 20:22:00.28ID:T0ZfeL7S
すいませんハスケル初級者で質問なのですが
ハスケルでは「=」は代入ではなく束縛だという事で

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

と書いた場合無限に減算を繰り返す理由は
「=」は代入ではなく束縛だから
ハスケルがfunc xに該当する唯一の値を求めて処理を繰り返すという
仕組みになっているという理解でよろしいでしょうか。
0181デフォルトの名無しさん2015/08/04(火) 20:46:26.59ID:8q1xh6ui
代入とか束縛とか関係ない

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

int x = func(100);

Cでこう書いたって無限再帰
0182デフォルトの名無しさん2015/08/04(火) 21:03:02.69ID:Jii/ZMO+
>>179
可換でないといけないとは言っていない。
合成ができないのが致命的と言ったのだが
■ このスレッドは過去ログ倉庫に格納されています