ScalaのMap[A,B]はモナドになるのか?

1
Kenji Yoshida @xuwei_k

A => Option[B] と Option[A] => B を表すtraitが scalaz に入ったけど、わざわざ入れるほど便利なのかな・・・ https://t.co/9M5L5f7dqN https://t.co/A5lYFnmjJ0

2013-05-22 15:03:11
Kenji Yoshida @xuwei_k

書いた http://t.co/4iZYLahJNY "Bindという型クラスの存在意義"

2013-05-22 19:40:52
Kenji Yoshida @xuwei_k

そうか、 Scala の Map の withDefaultValue とか withDefault って、apply に対して有効になるだけで、getやisDefinedAtなどのほかのメソッドの動作は全部変えないんだっけ、忘れてた・・・

2013-05-23 15:24:03
Kenji Yoshida @xuwei_k

Mapがモナドにならない?のに、A => Option[B]という関数はモナドになる? ことの違いを考えてるんだけど、よくわからない。有限集合か無限集合の違い? それとも「Mapがモナドにならない」もしくは「A=>Option[B]という関数はモナド」のどちらかは間違ってる?

2013-05-23 15:41:08
がくぞ @gakuzzzz

A => Option[B] がモナドになるってどういう事だろう。A => Option[B] の Kind は * -> * -> * だけどモナドになるってことは * -> * にする必要がありそうだけど。AかBのどちらかは固定されてるのかな?

2013-05-23 15:55:54
がくぞ @gakuzzzz

Haskell の -> をモナドインスタンスにする場合って引数側の型が固定されてるんだっけ?

2013-05-23 15:57:16
Kenji Yoshida @xuwei_k

@gakuzzzz これです https://t.co/DnwDC652Zq 昨日この記事書いて http://t.co/4iZYLahJNY 「Mapはモナドにならないことが判明した?」けど、このNullResultはモナド則満たしてるような気がするし、あれ・・・と思って

2013-05-23 15:58:33
Kenji Yoshida @xuwei_k

@gakuzzzz Scalaなら自分で決められるし、(あまり自信ないですけど)Haskellも自分で決められるんじゃないんですかね?ちなみにScalazの場合、普通のFunction1もモナドになってるみたい https://t.co/gkPqzCp7Ue

2013-05-23 16:00:33
Kenji Yoshida @xuwei_k

そもそも「Mapとはなんなのか(どういうメソッドを持っていて、lawがあるのか、lawがあるならどういうlawをみたすのか)」という前提条件を定義しないことには、なんか意味がない気がしてきた

2013-05-23 16:03:08
がくぞ @gakuzzzz

@xuwei_k あ、たしかに自分で実装するなら好きに決められますね。確か標準実装でモナドインスタンスがあったような気がしてたので。 Scalaz の Function1 も引数側が固定な感じですねー

2013-05-23 16:03:16
ねこはる @halcat0x15a

Kleisliってモナドだっけ?

2013-05-23 16:04:43
Kenji Yoshida @xuwei_k

もし「A => Option[B]がモナドになる」として、 A => Option[B] という関数から自然なScalaのMap[A, B]が構築できれば、Mapもモナドになるだろうけど、関数からScalaのMap構築しようとした場合に、sizeメソッドどうするの?とか色々問題が

2013-05-23 16:06:14
がくぞ @gakuzzzz

@xuwei_k なるほど。NullResult も引数側が固定されてますね。ふむ。

2013-05-23 16:06:46
ねこはる @halcat0x15a

Kleisli[Option, K, V]はMonadPlusらしいからMap[K, V]もモナドになる?

2013-05-23 16:08:04
Takashi Miyamoto @tmiya_

@xuwei_k Mapというのはそもそもpartial functionだと思うと、A => Option[B] はMapと考えて良いのでは

2013-05-23 16:08:34
がくぞ @gakuzzzz

あー size がどうしょうもないのか。全インスタンスに適用して数をかぞえるしかないもんな……

2013-05-23 16:09:19
Kenji Yoshida @xuwei_k

Mapのbind定義するのにcollectとかapplyとかisDefinedAt使ってしまったので https://t.co/14vBdQlwen 「関数からScalaのMapを構築しようとしたとき」にそれらのメソッドを自然に定義できるのか?という問題が。あと等価性とかも

2013-05-23 16:09:59
Takashi Miyamoto @tmiya_

@xuwei_k 例えば無限リストに length は無いけど、List と(ほとんど同じと)思って良いみたいな?

2013-05-23 16:10:01
Kenji Yoshida @xuwei_k

.@tmiya_ そうですね・・・。すると、Monadの関数使って生成したMapは「lengthが未定義、もしくは無限、つまり例外投げるかもしれない」とかなるけど、そういうものを許容するのかというのが問題になるってことですかね?

2013-05-23 16:12:36
がくぞ @gakuzzzz

無限な Iterator[(A, B)] の toMap ってどうなるんだろ? 単純に実装考えると無限ループになるか

2013-05-23 16:14:13
がくぞ @gakuzzzz

無限Map ……ファミコンのバグ技かよ

2013-05-23 16:15:12
Kenji Yoshida @xuwei_k

Map[A, B]をA => Option[B]として捉えて定義すれば、とりあえずMapをモナドにすることは可能かもしれないけど、そうすると色々なメソッドが定義できない壊れたMapになるから、実用的にはそんな風にMapのモナドを定義しても使えないから定義しない。 で、いいのかな

2013-05-23 16:20:10
がくぞ @gakuzzzz

そう考えると Map#map が Map になるのってすごい。 Mapがゲシュタルト崩壊

2013-05-23 16:23:55
Takashi Miyamoto @tmiya_

@xuwei_k partial functionの合成ってmonadのbindだよね、というだけの話なんですかね... Mapの本質が、「キーに応じて値を返せたり返せなかったりである」「登録されている要素を列挙出来たり総数を返せることは本質で無い」と考えればあるいは。

2013-05-23 16:26:05