HaskellのFunctor

軽く勘違いしてたっぽいのをふみしゃんに軌道修正してもらいました。
0
ちゅーん @its_out_of_tune

Functorとは射影関数とデータコンストラクタのタプルである on Haskell

2014-11-04 21:06:14
ちゅーん @its_out_of_tune

突如現れるFunctorの疑問はだいたいHaskellのFunctorが自己関手のせいだと思う。

2014-11-04 21:07:34
ちゅーん @its_out_of_tune

Haskellのプログラムは相当頑張らないとHask圏から抜け出せないのだ。

2014-11-04 21:09:50
ふみ (DJ Monad) @fumieval

@its_out_of_tune 型コンストラクタではなく?(データコンストラクタが必要だとdata Empty aがFunctorにならない気がします)

2014-11-04 21:10:43
ちゅーん @its_out_of_tune

@fumieval a -> f aなる関数がないと値のmapが出来ない気がしたのですが・・・

2014-11-04 21:12:42
ちゅーん @its_out_of_tune

値のmapって言い方は変か。

2014-11-04 21:15:17
ちゅーん @its_out_of_tune

いや、fmapは射から射への関数で、対象から対象への関数が別途ないと関手として成り立たないと思ったんだけど。

2014-11-04 21:17:00
ちゅーん @its_out_of_tune

無いと、というか、実装できないと。

2014-11-04 21:17:43
ちゅーん @its_out_of_tune

型コンストラクタは * -> * で、Hask圏の対象のkindは * でないとダメだと思ったんだけど、勘違い?

2014-11-04 21:19:48
ふみ (DJ Monad) @fumieval

@its_out_of_tune たとえばdata Bizzare a = B (Bizzare a)はa -> f aが定義できませんが、instance Functor Bizzare where fmap f (B a) = B (fmap f a)のようにFunctor

2014-11-04 21:30:33
ふみ (DJ Monad) @fumieval

@its_out_of_tune になります。Applicativeならa -> f aが要求されますね

2014-11-04 21:31:10
ちゅーん @its_out_of_tune

@fumieval 関手は対象から対象への対応付けが必要だったと記憶しているので、Functor型クラスのインスタンスに出来てFunctor則を満たすとしても、a -> f aが出来無いと厳密にはFunctorと呼べないのではないか、と思ってたのですが、勘違いですかね?

2014-11-04 21:40:00
ふみ (DJ Monad) @fumieval

@its_out_of_tune もしかして、値レベルの話と混同していませんか?FがFunctorならば「Aという型が存在すれば、F Aという型も必ず存在する」という条件はありますが、それはaとF aの型の「値」に対しての制約ではないはずです

2014-11-04 21:43:39
ちゅーん @its_out_of_tune

@fumieval ふむぅ。fmapが値レベルで存在していて、それにFunctorと名付けられていたので、fmapが要求されるならこの関手にはa -> f aも要求すべきだろうと思ったんですけど、そういうわけでも無いんですね。

2014-11-04 21:48:44
ちゅーん @its_out_of_tune

つまり、まず対象と射の対応関係があるのは大前提で、この時点でも関手として差し支えないけれど、その上で射の対応関係のみ値レベルでの変換が存在するような関手がHaskellのFunctorである。みたいな。

2014-11-04 21:51:37
ふみ (DJ Monad) @fumieval

@its_out_of_tune うーん、その感覚はよくわからないです…たとえばF aの型の値が存在しなければ、fmapは呼ばれないのでfmap _ = undefinedでいいですし、当然則も満たすと思います

2014-11-04 21:57:29
ちゅーん @its_out_of_tune

@fumieval あれ?こういう時にさらっと _|_ を当てはめちゃって良いんですかね・・・?

2014-11-04 22:01:36
ふみ (DJ Monad) @fumieval

@its_out_of_tune fmapが呼ばれるという前提自体が偽なのでこのケースでは大丈夫ですね

2014-11-04 22:02:25
ちゅーん @its_out_of_tune

@fumieval つまり、もともと無数の関手が考えられる中で、射の変換が考えられるものがHaskellのFunctorインスタンスになり得るという事でおkでしょうか?

2014-11-04 22:09:02
ふみ (DJ Monad) @fumieval

@its_out_of_tune Haskellの場合型の部分的な対応は作れないので、則を満たすfmapについてだけ考えれば大丈夫、というのが私の見解です

2014-11-04 22:17:26
ちゅーん @its_out_of_tune

@fumieval 「型の部分的な対応」というのが良くわからなかったです。

2014-11-04 22:18:12
ふみ (DJ Monad) @fumieval

@its_out_of_tune 「data F a = …という型を作ったとき、F AはあってもF Bという型を書くと型エラーか未定義動作になるようにできる」という意味です。

2014-11-04 22:21:29
ちゅーん @its_out_of_tune

@fumieval 型レベルでの話です?そんなんありましたっけ・・・

2014-11-04 22:28:03
ふみ (DJ Monad) @fumieval

@its_out_of_tune すみません。Haskellではこういったことはありえないので、関手の要件の一つは自動的に満たされるという意図でした

2014-11-04 22:29:45
ちゅーん @its_out_of_tune

@fumieval あ、なるほど。任意のaについて F a が考えうるので、その時点で対象と対象の対応は満たされるのだから、後は射の対応だけ考えれば良い。という話ですね。

2014-11-04 22:34:19