haskell-ja > Archives > 2009/07/02

2009/07/02 10:23:45 UTCnwn
#
うまくいくかなー: http://www.reddit.com/r/haskell/comments/8xkak/ask_haskell_is_supermonad_a_bad_idea/
#
モナドのスタック 2 段くらいしか自分で組んだことないけど
#
後でちょっと試してみよう
2009/07/02 11:40:03 UTCikegami
#
suparmonad 見た
#
たしかに lift . lift . lift ... って
#
ドンドンドリフの大爆笑ーになる
#
super だ、typo
#
でも、このやりかたはどうかなあ
#
f = lift . lift の型を限定して書けば、混乱はないと思うのだけれど (explosion というのもよくわからない
2009/07/02 11:47:03 UTCnwn
#
志村ー NoMonomorphismRestriction、NoMonomorphismRestriction
#
てきとうに instance 宣言して 2 段でやってみたら IncoherentInstances 指定しろとか言われた
#
どのインスタンスを使っていいかわかんなくなっちゃったみたい
#
explosion っていうのは、たとえば既存のライブラリに MaybeT みたいに新しいトランスフォーマを入れるとして元々あったトランスフォーマたちに対応するインスタンスかかなあかんっていう話だと思われる
2009/07/02 11:53:15 UTCikegami
#
あー、なるほど
#
たしかにそれは書く
#
(GHC に怒られた時に)
#
だけど一行だけだよ
#
GHC 拡張の stand-alone deriving つかう
2009/07/02 11:55:24 UTCnwn
#
初耳
2009/07/02 11:55:40 UTCikegami
#
data Foo a = Bar a | Baz String

  deriving instance Eq a => Eq (Foo a)
#
newtype Foo a = MkFoo (State Int a)

  deriving instance MonadState Int Foo
#
こんな書き方がゆるされる
#
下のケースでおk
2009/07/02 11:56:33 UTCnwn
#
それはどういう書き方の略記なの?
#
http://www.haskell.org/haskellwiki/GHC/Stand-alone_deriving_declarations 読んでみます
2009/07/02 11:58:01 UTCikegami
#
そこから抜粋しました
2009/07/02 12:06:12 UTCnwn
#
deriving は行頭に書かなきゃいけないみたいで少しはまった
2009/07/02 12:10:26 UTCnwn
#
(The last argument of the instance must be a data or newtype application)
#
(´・ω・`)
2009/07/02 12:11:39 UTCikegami
#
GHC 6.10.1 では未サポートだった...
2009/07/02 12:12:44 UTCnwn
#
そういえば 6.10.4 の release candicate ビルドしてない。。。
#
うーん、GHC はこういう拡張を使ったらどう?って教えてくれるのは良いんだけど
#
それがいったいどういう拡張なのかは教えてくれない
2009/07/02 12:17:12 UTCikegami
#
LANGUAGE プラグマじゃなくて OPTIONS_GHC プラグマ + -X では通った...
#
これはバグだなー
#
まあ、ともかく、一行 MonadState とか書くだけで get, set できるようになることはわかった
#
手元では deriving instance Monad Foo も必要だったので二行だけど
#
GHC のエラーは不親切で、親切に possibly, ... とか言うときはだいたい外れている
#
んー、冷静になると、これって別にモナドを重ねているわけではないな
#
StateT つかった例つくってみよう
2009/07/02 12:23:43 UTCnwn
#
そういえばそうですねw > モナド重ねてない
2009/07/02 12:26:56 UTCikegami
#
newtype Boo a = Boo (StateT Int IO a)                                                                                                            
                                                                                                                                                 
newtype FooBar a = FooBar (StateT Char Boo a)                                                                                                    
                                                                                                                                                 
deriving instance Monad Boo                                                                                                                      
deriving instance Monad FooBar                                                                                                                   
deriving instance MonadState Char FooBar
#
あああ、やっぱり行末の空白が
#
まあ、それはともかく、これは、手元では通った
#
-XStandaloneDeriving 付き
#
newtype じゃなくて type したら、もちろん、deriving すらいらなくなる
#
はず
2009/07/02 12:30:28 UTCnwn
#
fb1 :: FooBar Char
fb1 = get
#
ふむふむ
2009/07/02 12:30:41 UTCikegami
#
うわしかし、ちょっとめどいな、type だと
#
newtype のほうがらくだ
2009/07/02 12:30:51 UTCnwn
#
TypeSynonimInstances ?
2009/07/02 12:31:34 UTCikegami
#
あ、そうでもなかった
2009/07/02 12:31:53 UTCnwn
#
どっちやねんw
2009/07/02 12:31:56 UTCikegami
#
type Boo = StateT Int IO
#
type FooBar = StateT Char Boo
#
これでいいんだわ
#
これだと、instance 宣言いらない
2009/07/02 12:33:02 UTCnwn
#
楽さを求めるなら type 使えばいいんですね
2009/07/02 12:33:31 UTCikegami
#
だけど、エラー表示のときに Boo ってでてくれなくて
2009/07/02 12:34:02 UTCnwn
#
StateT Int IO になっちゃう?
2009/07/02 12:34:05 UTCikegami
#
ちょっとかなしい思いをする
#
そう
2009/07/02 12:34:28 UTCnwn
#
うーん、そこはコンパイラが空気読むしかないのかなあ...
2009/07/02 12:34:43 UTCikegami
#
type は、あくまで別名だから、展開されてしまって、消えてしまう
#
エラー表示のために残してくれてもいいのに...
2009/07/02 12:35:21 UTCnwn
#
postprocessor が欲しくなりますね
#
コンパイラのエラーをいい感じに整形してくれるような何か
2009/07/02 12:35:44 UTCikegami
#
でも、残せない理由もあって
#
type A = Int; type B = Int は正しいので
#
型を明示的にかかないで型推論する場合、A とか B とか言わずに Int というのは、方針が正しい
2009/07/02 12:36:43 UTCnwn
#
あ、そっか、Int を A に戻せばいいのか B に戻せばいいのかわかんなくなるのか
2009/07/02 12:36:51 UTCikegami
#
うむ...
#
その点 newtype だと型構築子がついてるから、区別できる
2009/07/02 12:37:35 UTCnwn
#
あとアクセス制御的な意味でも newtype は良いですよね
#
俺のモナドの中で勝手に get/put すんじゃねえとかそういうのができるのも強い
2009/07/02 12:38:41 UTCikegami
#
なかみ取り出したいなら、newtype A = A { unA :: Int } とすればいいしね
2009/07/02 12:55:59 UTCcut-sea
#
おしえてくん登場
#
おばんです
2009/07/02 12:56:20 UTCnwn
#
おばんですー
2009/07/02 12:56:25 UTCcut-sea
#
どもどもー
#
さっそく質問いいですか!!?
#
例えばあるライブラリを使おうとしたらHoge型構築子がありました。
2009/07/02 12:57:22 UTCnwn
#
ほい。
2009/07/02 12:57:45 UTCcut-sea
#
で、Hoge型構築子はMonadのインスタンスだとドキュメントはおっしゃってた
#
さて、この瞬間Hogeというものに対してどういうイメージというか
#
何を思いました?
#
うわ、すげー抽象的!!
2009/07/02 12:58:59 UTCnwn
#
イメージ? イメージかー
2009/07/02 12:59:11 UTCcut-sea
#
あるいは、じゃあドキュメントのこのあたり調べればHogeを使いこなせるなーとか
2009/07/02 12:59:23 UTCnwn
#
あ、それならもうちょっとわかるかも
2009/07/02 12:59:25 UTCcut-sea
#
あるいは何に使えそうかを理解できます?
#
お、そのへんクレクレーー!!
2009/07/02 12:59:53 UTCnwn
#
もし、ドキュメントの中に fuga :: Int -> Hoge String みたいなのがあったとして
#
liftIO . putStrLn =<< fuga 100 とかすれば何かが起きるという予感はするかも
2009/07/02 13:01:14 UTCcut-sea
#
2009/07/02 13:01:17 UTCnwn
#
とりあえず型をあわせようとがんばってみる
2009/07/02 13:01:22 UTCikegami
#
ghci で :i する...
#
ドキュメントなんて信じない
#
(長門調でおねがいします)
2009/07/02 13:02:12 UTCnwn
#
まーいつのまにかソース読んでたりするけどねー
2009/07/02 13:02:17 UTCcut-sea
#
その場合、Hogeが何かってのはあまり重要じゃなくてHogeを生成している関数を理解しようとするんですね
2009/07/02 13:02:57 UTCnwn
#
結果的にそうかも
2009/07/02 13:03:52 UTCcut-sea
#
ふむ。
#
上の例を見ると勝手な推測ですあg
#
ですが
#
=<<によって取りあえず中身を取り出す
#
ってことを試みている段階でHogeはやっぱりコンテナのイメージが付いているんでしょうか?
2009/07/02 13:05:31 UTCikegami
#
Monad のインスタンスだってことで、return :: a -> Hoge a と (>>=) :: Hoge a -> (a -> Hoge b) -> Hoge b が使えるってことだけしかわからない
2009/07/02 13:05:32 UTCcut-sea
#
それとも、Monadごとに=<<に何か細工があったりするわけだから
#
=<<が何をしているかを調べようとしている感じでしょうか
2009/07/02 13:05:59 UTCikegami
#
return と (>>=) が実際なにかはまだわからないから、ソースを読む
2009/07/02 13:06:13 UTCcut-sea
#
そこなんですけど、
#
例えばですね、Eqクラスってあるじゃないですか?
2009/07/02 13:06:56 UTCikegami
#
ないです!(うそ)
2009/07/02 13:07:29 UTCnwn
#
何それ(うそ)
2009/07/02 13:07:46 UTCcut-sea
#
例えばFugaという型がEqクラスのインスタンスだと言われたら
#
(==)の実装もまぁ見るでしょうが
2009/07/02 13:08:21 UTCikegami
#
見ないですね
#
常識的に考えて
2009/07/02 13:08:54 UTCcut-sea
#
ともかくFugaが「同じ」ってどういうことよ?って議論が出来るってことをイメージしますよね?
2009/07/02 13:09:05 UTCikegami
#
そうです
2009/07/02 13:09:23 UTCcut-sea
#
ifの条件式に使えそうとか同一性の判定に使えそうとか
#
そして、もしですよ
#
(==)の実装が a == b = a % b
#
あーすまん
#
a == b = (a % b) = 0
#
%は剰余ね
#
となってたとしたら「あれ?変じゃね」って思いますよね?
2009/07/02 13:10:33 UTCikegami
#
とりあえず、なにもかんがえずに、Fuga のソースを読んで、Arbitrary のインスタンスにして、quickcheck で (==) の性質をたしかめる
2009/07/02 13:10:41 UTCcut-sea
#
そこ!
#
Arbitraryは知らないですが
#
つまり等しいということについて
#
「性質」を認識してて
#
それによってEqという性質についてイメージを持ってるんじゃないかと思ってんですが
#
上のEqの例では6は3と等しいけど
#
3と6は等しくない
#
とか
#
それは等しいっていう性質を満してない
2009/07/02 13:13:12 UTCikegami
#
んー、6 == 3 でもいいんじゃね?世界では、いいのでは
#
Z/3Z って、普通の対象だし
2009/07/02 13:13:44 UTCcut-sea
#
Z/3Zって何でしょう?
2009/07/02 13:13:45 UTCikegami
#
日本語でしゃべってなくてすまぬ
#
Z/3Z = {0, 1, 2}
#
Z -> Z/3Z が (% 3)
#
Z は Integer だ、そっちをつかおう
#
type Z = Integer だとしてくれたまえ
2009/07/02 13:15:00 UTCcut-sea
#
==を使ったプログラムを書くときに6==3と3==6とで結果が違うんですよ?
#
それでもOK?ってことですか?
2009/07/02 13:15:11 UTCikegami
#
それはおかしい
2009/07/02 13:15:22 UTCcut-sea
#
そういう例です>上のは
#
6 % 3 => 0でTrueだけど3 % 6=> 3でFalse
2009/07/02 13:16:07 UTCikegami
#
ほんとだ、そういう例ですね
2009/07/02 13:16:18 UTCcut-sea
#
だし当然推移律もなりたたない
#
で、そういうルールが背後にあることで
2009/07/02 13:16:49 UTCikegami
#
Haskell の型クラスは、プログラマに「性質を証明すること」を暗に要求します
2009/07/02 13:16:56 UTCcut-sea
#
Eqクラスに対する==に付いてのイメージがあるんじゃないかと思います。
#
でだ。
#
>>=とかreturnの実装も、まぁ重要なんでしょうが
#
おそらくHogeというMonadのインスタンスには
#
インスタンスをあげたのは、
#
モナド則が何を意味しているかについての
#
モナドを理解している方のイメージというか
#
>>=とかreturnを明かしてなかった分だけ
#
モナド則について*だけ*のイメージが問えるかなーと思ったのですが
2009/07/02 13:19:25 UTCikegami
#
そうですね
#
要するに、Haskell のモナドを使ったプログラミングには、2 種類の考え方があって、
#
既存のモナドを使うなら、特にモナド則を意識する必要は無く、たとえば List モナドとか Maybe モナドの各振舞いを覚えておけばいい
#
いっぽう、初めてみたモナドと主張する何かについては、注意深く return と (>>=) をみないといけない
#
さもないと、さっきわたしが勘違いしたように、(==) が実際には Eq であるべきでない、とかやってしまう
2009/07/02 13:22:42 UTCcut-sea
#
上の例は引っかけるのが目的ではなく、「あれ?おかしい」と感じる背景には
2009/07/02 13:23:07 UTCikegami
#
で、確かめるには、QuickCheck が一番てっとりばやいよ、というのが個人的な意見
2009/07/02 13:23:21 UTCcut-sea
#
うーん
#
Hogeの実装が正しいかどうかを議論したいのではなく
#
「あれ?おかしい」と思った背景にある法則がありますよね
#
交代律(?)が成り立つとか推移律(?)が成り立つとか
#
この法則が成り立つことを利用して
#
==をプログラムの中で使っているんじゃないかな?と思っているんですけど
#
そうだとしたらMonadを使う時にはモナド則を満すからこそ
#
その法則が成り立つことを背景にしてプログラムの中でMonadを利用しているのではないかな?と。
2009/07/02 13:26:33 UTCikegami
#
(==) は 1. forall x. x==x, 2. forall x, y. x== y ==> y == x, 3. forall x, y, z. x == y && y == z ==> x == z
#
の 3 つがないといけないっていう、ことは、モナドの 3 則が必要ってこととも同じですね
2009/07/02 13:27:03 UTCcut-sea
#
おお同じものも等しいのか
#
まぁ数はともかく、これらの法則が「同じ」ということのイメージを我々に植え付けてて
#
プログラム中でも==をこれらの法則を期待して使ってるはず。
#
Monadのバヤイはどーなんかなーと
2009/07/02 13:28:55 UTCikegami
#
Monad 3 則を期待しているのではないでしょうか
2009/07/02 13:29:19 UTCcut-sea
#
そうだと思うんですが、モナド則の意味ってエントリがいくつかあるんですけど
#
山本さんなんかも書いてたり
#
でもね、こういうreturnは書かなくてすむことを言っているとか
2009/07/02 13:29:49 UTCikegami
#
山本さんは、ふつうに迷路をさまよっていて、観察の対象ですね
2009/07/02 13:30:05 UTCcut-sea
#
どーもコード上の便利のためみたいな解釈で
#
そういうものとは違うものを期待してたんですよ。勝手に。
2009/07/02 13:31:07 UTCikegami
#
んーむ
2009/07/02 13:31:30 UTCcut-sea
#
上のEqみたくすっきりしないのは型の性質ではなく型構築子の性質だから難しいって
2009/07/02 13:31:36 UTCikegami
#
コード上の便利、であり、かつ、法則的、なものなんじゃないのかしらん
2009/07/02 13:32:03 UTCcut-sea
#
nobsunとかには言われたけど、それでも使いこなしている人には何かしらMonadについてのイメージがあるんじゃないかなーと
2009/07/02 13:32:38 UTCikegami
#
イメージありますよ。個人的には、do がつかえてうれしいなーらんらんって。
2009/07/02 13:33:11 UTCcut-sea
#
なるほど、それもコード上の話になりますねー
2009/07/02 13:33:29 UTCnwn
#
Applicative も忘れないであげてください
2009/07/02 13:33:29 UTCikegami
#
あと、さっき nwn さんとも話してたことになりますけど、モナド変換子つかって積み上げるの楽しいので
#
Monad になってないとげんなりします
2009/07/02 13:33:59 UTCnwn
#
それはある
#
Monad 則だけを期待してるプログラム(関数)っていったら Control.Monad の中の関数ぐらいじゃないかな
2009/07/02 13:36:28 UTCcut-sea
#
そうなんだぁ
2009/07/02 13:36:46 UTCnwn
#
いや、知らないですけどw
2009/07/02 13:36:48 UTCcut-sea
#
あれ?
#
でもね
#
もし上のEqの==の実装同様い
#
同様に
#
Monad則を満さないreturnとか>>=の実装になってたとしたら
#
何がしかの期待が裏切られた振る舞いをするんじゃないかと思うんですが
2009/07/02 13:37:57 UTCikegami
#
そうでしょうね
#
なんでコンパイルに通るのに、こんな振舞いになっちゃうのみたいな
2009/07/02 13:38:17 UTCcut-sea
#
それって何か期待できる性質があるんじゃないかな
#
まーすぐ言葉にできないものかもしれないのですが
#
理解している人なら「あれ?変だぞ?」と思いますね?
#
なぜ変だと思うんでしょう?
#
何を変だと思うんでしょう?
#
それが性質だったりするかも
2009/07/02 13:39:17 UTCikegami
#
3 則のどれを破っているかによるだろうな
2009/07/02 13:39:36 UTCcut-sea
#
まずはどれでも良いのですが何か例はありませんかねぇ
2009/07/02 13:39:39 UTCikegami
#
言うのが楽な順にいうと、3 番目の (m >>= f) >>= g == m >>= (\x -> f x >>= g) がなりたってないばあい
2009/07/02 13:40:01 UTCcut-sea
#
おもしろそう!
2009/07/02 13:40:03 UTCikegami
#
do で書いてた時に、途中で fail するなり GHC panic! するなりなんかなる
#
やってみるといい
2009/07/02 13:40:22 UTCcut-sea
#
ありゃ、そこまで致命的なレベルかぁ
#
panicって見たことないな
#
どーゆー時にpanicするんだろう
2009/07/02 13:41:19 UTCnwn
#
panic はモナド則破ったからでは起こらないと思う
2009/07/02 13:41:27 UTCcut-sea
#
GHCがワケワカ!って思うんだー
2009/07/02 13:41:29 UTCikegami
#
1 番目 (return x) >>= f == f x と 2 番目 m >>= return == m のどちらかが成り立ってない場合は
#
たぶん、コンパイル時にエラーが起きると思う
2009/07/02 13:41:52 UTCcut-sea
#
そうなの?>nwn
2009/07/02 13:42:46 UTCnwn
#
そう聞かれるとなんか起こる気がしてきたw
2009/07/02 13:42:49 UTCcut-sea
#
コンパイル時にエラーってのは型の整合性で?
#
でもモナド則満してなくてもHaskellは知ったこっちゃないんですよね?
#
returnと>>=が実装されてりゃOKなスタンスですよね
2009/07/02 13:43:37 UTCnwn
#
(>>=) をインライン展開してるうちにわけわかめになって panic とかはある気がしなくもなくもない(どっちだよ)
#
ごめん、忘れてください
2009/07/02 13:44:33 UTCcut-sea
#
^^;
#
なんとなく気になるのはモナド則が満されてない実装だったときに
#
それを見て上のEqの様に「おかしい」と思うのではなく
#
使ってみてGHCが「おかしい」挙動をするから変だと分るだけってことのようですね
2009/07/02 13:46:07 UTCikegami
#
かなしいかな、そうです
2009/07/02 13:46:20 UTCnwn
#
本当は紙で検算とかするんだと思う
2009/07/02 13:46:26 UTCikegami
#
GHC が、か、あるいは、それを使って作ったプログラムga
#
おかしくなるか
2009/07/02 13:46:36 UTCcut-sea
#
とすると「モナド則」が背景にあることで皆が何を期待しているかについては
2009/07/02 13:46:38 UTCikegami
#
のどちらか
2009/07/02 13:47:12 UTCcut-sea
#
もしかしたら「言葉にできないでいるだけ」か「実際何のイメージも存在しない」かでしょうか。
#
できれば前者であって欲しい。
#
ありがとうございました>ikegami,nwn
#
なんとなくちょっとずつ質問のポイントも見えてきたし
#
イロイロ収穫がありました!
#
サンクスです。
2009/07/02 13:49:12 UTCnwn
#
後者じゃないかなー。『言葉』の定義に Haskell のプログラムを含むのであればモナド 3 則を差し出すだけだし
2009/07/02 13:49:13 UTCcut-sea
#
えらく曖昧かつ的を得ない質問ですんませんでしたが
#
差し出す、とは?
2009/07/02 13:50:53 UTCnwn
#
モナド則が成り立てば、こういう書き換えができるよって示す
#
それをひとまず信じといていろいろやるんだっていう
2009/07/02 13:54:11 UTCcut-sea
#
それはコード上の便利のためのものだということでしょうか
#
だとすると後者だということになるか
2009/07/02 13:55:03 UTCnwn
#
うん、使ってみると便利っていう
2009/07/02 13:55:44 UTCcut-sea
#
うーん。便利なんだ?!その辺がまだまだ修行が足りないなー
#
まるでHaskellで自由にコードが書けないorz
2009/07/02 13:58:04 UTCikegami
#
http://hpaste.org/fastcgi/hpaste.fcgi/view?id=6450#a6450
2009/07/02 13:58:19 UTCnwn
#
ちょwwww
2009/07/02 13:58:40 UTCikegami
#
モナドじゃない Either a b を、黒魔術でモナドに見せかけてみました
#
GHC に通ります
#
すきなだけ、BUG しまくってください
2009/07/02 14:00:18 UTCcut-sea
#
コンパイル通りました。
2009/07/02 14:00:26 UTCikegami
#
Haskell は性善説を仮定しているので
2009/07/02 14:00:42 UTCcut-sea
#
さて、これはモナド則を満さない?
2009/07/02 14:01:29 UTCikegami
#
1. return x >>= f :=====: f x
#
が、このばあい、return は Left しかみてないので
#
Right だったときに、ほんげー
2009/07/02 14:02:25 UTCcut-sea
#
場合によって満さないわけか
2009/07/02 14:02:52 UTCnwn
#
n :: Double -> MaybeInt Double
n d = return d*NotMonad> unMI (n 2.1 >>= return . show)
Left 1879136974
#
わわわ
#
n :: Double -> MaybeInt Double
n d = return d
*NotMonad> unMI (n 2.1 >>= return . show)
Left 1879136974
2009/07/02 14:03:35 UTCikegami
#
そうです、おそろしいことになるのです
#
C のほうが SEGV ってくれるだけましって気分
2009/07/02 14:04:23 UTCnwn
#
どっちもいやです ; ;
#
同じくらい
2009/07/02 14:05:15 UTCcut-sea
#
なるほど、奇妙だ
#
unsafeって時点で
#
モナド則を満さないことより問題じゃないか?と思ってしまった
2009/07/02 14:07:22 UTCikegami
#
いやまあ、GHC のコンパイルに通るモナドでない何かがすぐに思いつかなかったので
#
unsafeCoerce :: a -> b つかっちゃったわけですけど
#
ゆっくり考えれば、GHC がモナドだと信じてしまう普通のデータ型はいくらでもありそう
#
モナドじゃないのにモナドみたいななにか
2009/07/02 14:12:31 UTCnwn
#
こういうモナドを考えてはまったことがあります: http://hpaste.org/fastcgi/hpaste.fcgi/view?id=6451#a6451
2009/07/02 14:12:44 UTCcut-sea
#
unsafeってプレフィクスつけるのってどうかと思うな>Haskellライブラリ
2009/07/02 14:13:08 UTCikegami
#
いや、むしろ重要で
2009/07/02 14:13:15 UTCnwn
#
どんなプレフィクスがいいですか?
2009/07/02 14:13:22 UTCikegami
#
unsafe ってつけないと、初心者が使っちゃう
2009/07/02 14:13:32 UTCcut-sea
#
こっちもか>nwn
#
いや、それよ。
#
使うなと言われるライブラリが提供されるという文化が
2009/07/02 14:14:27 UTCikegami
#
unsafe は safe なときがある
2009/07/02 14:14:27 UTCcut-sea
#
どうも理解できない
2009/07/02 14:14:50 UTCikegami
#
けど、safe なときがいつか、を知るには GHC のソース全部読まないと駄目
2009/07/02 14:14:54 UTCcut-sea
#
実際私はunsafeと見た時点でそっぽ向いちゃうな
2009/07/02 14:15:19 UTCikegami
#
で、GHC の開発者とかマニアが、たまに欲しがる
#
まあ、たしかに、標準ライブラリとして配るのはどうよ、という気はする
2009/07/02 14:15:54 UTCcut-sea
#
他の手段では実現困難?この種のやつは
2009/07/02 14:16:05 UTCikegami
#
Id はモナドなので
#
PartialId
#
部分的な Id をモナドだと信じ込ませようとしているところ now
2009/07/02 14:17:38 UTCcut-sea
#
hpastetwoってHaskellのコードをはりつけるwikiみたいなものですか?
2009/07/02 14:18:09 UTCnwn
#
#Haskell の住人たちのための gist もしくは pastebin
2009/07/02 14:18:10 UTCikegami
#
hpaste.org は、おもに Haskell コードを貼付けて、IRC とかで議論するのに使います
2009/07/02 14:18:47 UTCcut-sea
#
しらなかったです。
#
cppとかも貼り付けられてますね
#
キーワードに色付けてくれるのがステキ
2009/07/02 14:31:37 UTCikegami
#
ほい : unsafe つかわない、Monad じゃないなにか
#
http://hpaste.org/fastcgi/hpaste.fcgi/view?id=6452#a6452
#
strange を評価してくれたまい
#
あれ、インデントずれてるな、なおしてください
#
よくわからんがインデントがずれてしまう、うーむ
2009/07/02 14:34:20 UTCcut-sea
#
どっかずれてますか?
2009/07/02 14:34:31 UTCikegami
#
strange の定義
2009/07/02 14:34:37 UTCcut-sea
#
そのままコピペでロードできました
2009/07/02 14:34:51 UTCikegami
#
まあ、それならよかった
2009/07/02 14:34:51 UTCcut-sea
#
あーほんとうだ
#
でもEmacsに貼った時点でも無問題
#
確かに期待を裏切ってますね
#
何が変でこうなるのかまだ分らないですが
#
モナド則ひとつずつ検証すればよいのか
2009/07/02 14:40:36 UTCikegami
#
return x >>= f :====: f x はどうかな
#
(left) = (The x) >>= f ---> f x
#
めでたし
2009/07/02 14:41:41 UTCcut-sea
#
The x >>= f ---------> f x
#
はいOKです
2009/07/02 14:41:54 UTCikegami
#
m >>= return :=====: m
2009/07/02 14:42:25 UTCcut-sea
#
mがThe vなら
#
The v >>= return ------> return v -------> The v
#
OK
2009/07/02 14:43:00 UTCikegami
#
うむ
2009/07/02 14:43:15 UTCcut-sea
#
mがEmpty ??なら
#
Empty ?? >>= return -------> Empty ()
#
これは満さない可能性がある
2009/07/02 14:44:09 UTCikegami
#
Empty () >>= return ---> The (Empty ()) /= Empty ()
#
2 番目がなりたってない
2009/07/02 14:44:44 UTCcut-sea
#
Theは噛まないのでは?
#
Empty () >>= return ------> Empty ()
#
その場合には成り立ちそうな
2009/07/02 14:45:18 UTCikegami
#
あ、ほんとだ
#
じゃあ、いちばんめんどくさい 3 番目か...
#
(m >>= f) >>= g == m >>= (\x -> f x >>= g)
#
うう
2009/07/02 14:46:09 UTCcut-sea
#
mがThe vなら
#
うう
2009/07/02 14:46:29 UTCikegami
#
それは Id が Monad だからだいじょうぶなはず
#
m が Empty () のときにおかしくなってくれるとおもう
2009/07/02 14:46:47 UTCcut-sea
#
あーそうか
2009/07/02 14:47:46 UTCikegami
#
わかった
2009/07/02 14:47:48 UTCcut-sea
#
(Empty () >>= f) >>= g ------> Empty () >>= g
#
-----> Empty ()
#
というわけで左辺はEmpty ()
2009/07/02 14:48:17 UTCikegami
#
そうだね、>>= は Empty () をずーっとすどおり
2009/07/02 14:48:28 UTCcut-sea
#
Maybeと同じになりそうな
2009/07/02 14:48:46 UTCikegami
#
がーん
2009/07/02 14:49:18 UTCcut-sea
#
Empty () >>= (\x -> f x >>= g) ------> Empty ()
#
成り立つかも
#
ってことはやっぱりEmpty ()の()が()じゃない場合に成り立たないってことでは?
#
でもstrangeの例ではEmpty ()しか使ってないけど
2009/07/02 14:50:24 UTCnwn
#
return x = Empty () にすれば Maybe じゃなくなるかも
2009/07/02 14:50:27 UTCcut-sea
#
なぜだろう
#
でもstrangeは実際奇妙ですよねぇ
2009/07/02 14:52:14 UTCnwn
#
*PartialId> let justmaybe = do x <- Nothing; y <- return 1; return (x,y)
*PartialId> justmaybe
Nothing
2009/07/02 14:53:17 UTCcut-sea
#
あれ?別に奇妙じゃないのか
#
普通のMaybeと同じだったか
2009/07/02 14:53:34 UTCikegami
#
どうやらそのようだ、時間を費やしてしまいもうしわけない
2009/07/02 14:54:20 UTCcut-sea
#
return x = Empty ()にするってことはMaybeのreturn xをNothingにするってのと同じってことですね。
#
それは成り立たなそうなかほりが
#
return x >>= f :====: f x
#
Empty () >>= f --------> Empty ()
#
で最初のは成り立つ
#
m >>= return :=====: m
#
mがThe vなあ
#
なら
#
The v >>= return -------> return v -------> Empty ()
#
成立しない
2009/07/02 14:57:20 UTCnwn
#
やったー
2009/07/02 14:57:32 UTCcut-sea
#
で、これで振る舞いを
2009/07/02 14:59:38 UTCnwn
#
http://hpaste.org/fastcgi/hpaste.fcgi/view?id=6452#a6455
2009/07/02 14:59:41 UTCcut-sea
#
なんか奇妙な結果になるstrangeがいるなコリャ
#
オオォ
#
奇妙だ
2009/07/02 15:01:00 UTCnwn
#
return したら終了
2009/07/02 15:01:23 UTCcut-sea
#
なるほど、そらそうだ。でも奇妙だ。
#
なるほど、でもこの奇妙さってのはモナド則ではなくreturnの意味に対する奇妙さなのかしらん
#
やはりreturnや>>=の意味の方に重点があるのかな
2009/07/02 15:03:20 UTCikegami
#
ふむ
#
明日は出張なので、のんびり考えてみよう
2009/07/02 15:04:25 UTCcut-sea
#
わたしも考えてみよう
2009/07/02 15:04:43 UTCikegami
#
圏論で return, >>= に対応するものを考えて、あえておかしくすれば、きっとヘンテコなものができるにちがいない
2009/07/02 15:04:48 UTCnwn
#
モナドにならない物を探すよりすでにモナドになってる何かを壊すほうが簡単なのかもね
2009/07/02 15:04:58 UTCcut-sea
#
ふむ。
2009/07/02 15:05:08 UTCikegami
#
そう思って Id をいじったら Maybe になったという
2009/07/02 15:06:09 UTCcut-sea
#
ともかく成り立たないものを考えて、そこに違和感なり不自然さを感じられたら嬉しいのですが。個人的にはね。
#
それが個々のMonadのインスタンス個別のものだとそう嬉しくないけど。
#
おそくまでありがとうございました!!
#
日付も変ったのでそろそろ退散します~
#
ごきげんよう
2009/07/02 15:07:44 UTCnwn
#
ごきげんよう
#
モナドだけど違和感や不自然さを感じる: http://lukepalmer.wordpress.com/2008/08/10/mindfuck-the-reverse-state-monad/
#
これ貼るの二回目だったり
#
そろそろ自重
2009/07/02 15:09:58 UTCnobsun
#
あらもういない? > cut-sea
2009/07/02 15:11:25 UTCikegami
#
コメントが薄いー(かんけいないけど
#
data ListL a = NilL | Scon (ListL a) a
#
みたいな逆と、おなじことなんじゃないのかなー
#
Scon じゃなくて Snoc (どうでいい
#
良い夢をみたいので、妄想してみるのだけれど
#
ブートストラップから、なにから、完全に ghc とは独立した Haskell 処理系で、ghc extension をサポートする
#
ってものを作るのに、どれくらいの時間がかかるだろうか
#
一年じゃ無理かなあ
2009/07/02 15:17:20 UTCcut-sea
#
読み返してたのでまだいるにはいる>nobsun
2009/07/02 15:17:52 UTCikegami
#
あきらめて、おとなしく、目立ちそうなライブラリでも書くか...
2009/07/02 15:18:25 UTCcut-sea
#
純粋じゃなくなっちゃうライブラリ
#
目立つよ
#
Haskellじゃなくなっちゃったみたいな
2009/07/02 15:19:09 UTCnobsun
#
モナド則1、2を満すけど、モナド則3を満さないMonadって構成できる?
2009/07/02 15:19:35 UTCikegami
#
日本語になってない
#
(わたしもそうだけど)
2009/07/02 15:19:54 UTCcut-sea
#
以前もそれ言ってましたね?
2009/07/02 15:20:09 UTCnobsun
#
そう。
2009/07/02 15:20:12 UTCcut-sea
#
そういう例ってもしかして無いのでは?という疑惑?
2009/07/02 15:20:15 UTCikegami
#
return, >>= が 1,2 をみたして 3 を満たさないようにつくる、ってことですね
2009/07/02 15:20:26 UTCnobsun
#
そうそうす
2009/07/02 15:20:52 UTCcut-sea
#
確かに3が満さないってのが一番面白そうな議題なんだけどな
2009/07/02 15:21:43 UTCnobsun
#
1、2を満すのに3を満さないと何がおこるかが知りたい。
2009/07/02 15:22:08 UTCcut-sea
#
1,2はなんか基底条件が変って感じの変さで3は再帰条件が変みたいなさ(全然意味不明)
2009/07/02 15:23:42 UTCikegami
#
http://scienceblogs.com/goodmath/2007/01/the_theory_of_monads_and_the_m_1.php
#
圏論的には、ηが return で、μが >>=
#
だから、arrow なんだけど、可換図を満たさなければ 3. がなりたたない
#
(正確にはμじゃないんだけど、うーややこしい
#
3. は、確か四角形の diagram に対応するはずだ
#
commutativity of mu
2009/07/02 15:29:12 UTCnobsun
#
関数合成の結合法則みたいなものだから成り立たないとdo構文がむちゃくくちゃになりそうだとおもうんだけど。実際に構成してその様子がみたい。
2009/07/02 15:29:13 UTCikegami
#
だから、三角形 commutativity of composition ηが成り立つが、四角形 commutativity of mu が成り立たないものを探す
#
と、対応する return, >>= がそれぞれη, μからつくれるはず
2009/07/02 15:31:11 UTCnobsun
#
見つけられそうですか。
2009/07/02 15:36:29 UTCcut-sea
#
難しそうなので先に寝ます~
#
すみません。朝起きたら例が出てるとラッキーみたいな。
#
おやすみです
2009/07/02 15:37:11 UTC[1..100]>>=pen
#
面白うそうな話してる。
#
いれ違い
#
(==) の不自然な話は
#
8 Haskell の標準クラス 8.4 導出されたインスタンス
#
にも
#
非推移律的な (==) 述語は、たとえば、大変苦痛で、プログラムを読むものを困惑させ
#
とありあすね。
2009/07/02 15:38:34 UTCcut-sea
#
なんてタイミングでやってくるんだ[1..100]>>=pen
#
でも寝ます。お先に~
2009/07/02 15:38:53 UTC[1..100]>>=pen
#
もっと起きてなさい(w
2009/07/02 15:38:58 UTCcut-sea
#
(w
2009/07/02 15:39:00 UTC[1..100]>>=pen
#
おやすみです。
2009/07/02 15:39:06 UTCcut-sea
#
おやすみなさい
2009/07/02 15:40:14 UTC[1..100]>>=pen
#
「たとえば、大変苦痛で、」訳も不自然(w > nobsun
2009/07/02 15:46:43 UTCnobsun
#
「大変苦痛で、読むものを困惑させる」気分を良く表わしている迷訳 :p
2009/07/02 15:57:32 UTC[1..100]>>=pen
#
確かにイコール的なものに対する直感ほどにはモナド的なものに対する直感はみがかれていないような気がしますね。
#
夜更しするといけないので明日考えてみます。
2009/07/02 16:21:17 UTCnwn
#
死闘の記録: http://blog.livedoor.jp/nonowarn/archives/51276276.html
2009/07/02 16:53:05 UTCshelarcy
#
LANGUAGE プラグマで普通に stand-alone deriving 使えますが…… > http://practical-scheme.net/chaton/haskell-ja/a/2009/07/02#entry-4a4ca548-c44be
#
http://practical-scheme.net/chaton/haskell-ja/a/2009/07/02#entry-4a4ca814-5615a の例は {-# LANGUAGE StandaloneDeriving, MultiParamTypeClasses, GeneralizedNewtypeDeriving #-} で使えます。
#
stand-alone deriving は連載の過去の回で使っていたので、「あれっ?」と思って調べました。
2009/07/02 17:06:11 UTCshelarcy
#
あと、unsafe プレフィックスのつく関数の提供は、普通のモジュールで普通に提供されているのでなくて。基本的には Unsafe.Coerce や System.IO.Unsafe のような Unsafe の名のついたモジュール、または GHC.* のような内部定義用のモジュールに隔離されています。
#
unsafePerformIO が互換性のために Foreign で提供されているせいで、一部方針を徹底できない部分もありますが。
2009/07/02 17:11:43 UTCikegami
#
にゃるほどー
#
(まだおきてた
2009/07/02 17:12:45 UTCshelarcy
#
それでも普通に使えるのが嫌だというのであれば、次の base パッケージの分割で unsafe パッケージというのを作って dph-* のような隠しパッケージ扱いにするよう提案してみると良いと思います。
2009/07/02 17:13:34 UTCikegami
#
いや、ぼくはむしろ、簡単に黒魔術できるほうが楽しい派なので、いいです
2009/07/02 17:13:50 UTCshelarcy
#
そうすれば unsafe パッケージを明示的に使用しない限り、基本的には unsafe の付く関数は使えなくなるはず……
#
私も使いたいときには直ぐ使える方が良いですけれどね。
#
あと ByteString パッケージにある最大限危険な関数 inlinePerformIO には、unsafe が付いていないと言う事実。
#
一応、こちらも Data.ByteString.Internal という「普通の人は使うな」というモジュールに隔離されていますが
#
おっと、小文字の bytestring パッケージですね。
2009/07/02 17:36:38 UTCshelarcy
#
http://practical-scheme.net/chaton/haskell-ja/a/2009/07/01#entry-4a4b6c6a-4ee97 ですが、darcs Current の New Build System では install-docs は消えた(未実装?)ようですね
#
New Build System への移行に伴い、一部 target がリファクタリングされて無くなっていたり、GHC 6.10.* を想定するビルド環境ではビルドできなくなっていることがあるので注意が必要です。
#
また、README が古くなっています。target が無い旨のエラーがでたら、Makefile か http://darcs.haskell.org/ghc/ghc.mk に target が存在するかどうかを直接参照した方が良いと思います。
2009/07/02 17:44:10 UTCikegami
#
話題の途中ですが、そろそろ寝ますです
#
おやすみなさい
2009/07/02 17:44:46 UTCshelarcy
#
おやすみなさい
2009/07/02 17:53:01 UTCshelarcy
#
これに関連して Current の Windows バイナリが暫くの間提供されなくなっていたのですが、6月30日にようやく復活したようです。
#
http://www.haskell.org/ghc/dist/current/dist/
2009/07/02 17:58:12 UTCshelarcy
#
というわけで、Windows でもきちんと New Build System を使った Current がビルドできるようです。ただし、docbook の扱いが少し厳格になっているので環境によってはドキュメントがビルドできないかもしれませんが……。
2009/07/02 18:05:39 UTCshelarcy
#
GHC のビルド中にパース・エラーが起きる場合ですが、HackageDB にある alex や happy の方が新しいのでそちらを使ってください。
#
http://hackage.haskell.org/cgi-bin/hackage-scripts/package/happy
#
http://hackage.haskell.org/package/alex
#
あっ、alex の方が URL が短い。
#
happy もこちらでいけますね。
#
http://hackage.haskell.org/package/happy
#
あと、happy は流石にホームページの方のバージョンもあがったみたいですね。
#
最後に Current からは extra libraries が消えていますが、これは仕様です。
#
http://www.haskell.org/pipermail/cvs-ghc/2009-May/048594.html
#
今後は Haskell Platform ni
#
バンドルされるので、そちらを使ってください
#
http://hackage.haskell.org/platform/
#
あるいは cabal コマンドなどを使って自分の手でインストールしてください。
#
では、そんなところで
#
おやすみなさい
2009/07/02 18:24:29 UTCnwn
#
ghc-6.10.4-rc1 Tiger でビルドできたーやったー
2009/07/02 22:46:49 UTCshelarcy
#
一応ドキュメントでの Data.ByteString.Internal の参照はできなくなるみたいですね。
#
patch applied (bytestring): Hide the .Internal modules in the haddock docs
#
http://www.haskell.org/pipermail/cvs-libraries/2009-July/010995.html
2009/07/02 23:00:06 UTCikegami
#
Haskell platform が本家に載るとは思わなかった、dons にくわえて dcoutt の存在がおおきかったのかな
#
初心者にとってインストールが楽になることはいいことだ
2009/07/02 23:19:09 UTCcut-sea
#
いやいや、誰にとってもインストールが楽になるのは良いことだ、です。