- its_out_of_tune
- 1733
- 1
- 3
- 0
@its_out_of_tune 型コンストラクタではなく?(データコンストラクタが必要だとdata Empty aがFunctorにならない気がします)
2014-11-04 21:10:43@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@fumieval 関手は対象から対象への対応付けが必要だったと記憶しているので、Functor型クラスのインスタンスに出来てFunctor則を満たすとしても、a -> f aが出来無いと厳密にはFunctorと呼べないのではないか、と思ってたのですが、勘違いですかね?
2014-11-04 21:40:00@its_out_of_tune もしかして、値レベルの話と混同していませんか?FがFunctorならば「Aという型が存在すれば、F Aという型も必ず存在する」という条件はありますが、それはaとF aの型の「値」に対しての制約ではないはずです
2014-11-04 21:43:39@fumieval ふむぅ。fmapが値レベルで存在していて、それにFunctorと名付けられていたので、fmapが要求されるならこの関手にはa -> f aも要求すべきだろうと思ったんですけど、そういうわけでも無いんですね。
2014-11-04 21:48:44つまり、まず対象と射の対応関係があるのは大前提で、この時点でも関手として差し支えないけれど、その上で射の対応関係のみ値レベルでの変換が存在するような関手がHaskellのFunctorである。みたいな。
2014-11-04 21:51:37@its_out_of_tune うーん、その感覚はよくわからないです…たとえばF aの型の値が存在しなければ、fmapは呼ばれないのでfmap _ = undefinedでいいですし、当然則も満たすと思います
2014-11-04 21:57:29@fumieval つまり、もともと無数の関手が考えられる中で、射の変換が考えられるものがHaskellのFunctorインスタンスになり得るという事でおkでしょうか?
2014-11-04 22:09:02@its_out_of_tune Haskellの場合型の部分的な対応は作れないので、則を満たすfmapについてだけ考えれば大丈夫、というのが私の見解です
2014-11-04 22:17:26@its_out_of_tune 「data F a = …という型を作ったとき、F AはあってもF Bという型を書くと型エラーか未定義動作になるようにできる」という意味です。
2014-11-04 22:21:29@its_out_of_tune すみません。Haskellではこういったことはありえないので、関手の要件の一つは自動的に満たされるという意図でした
2014-11-04 22:29:45@fumieval あ、なるほど。任意のaについて F a が考えうるので、その時点で対象と対象の対応は満たされるのだから、後は射の対応だけ考えれば良い。という話ですね。
2014-11-04 22:34:19