SemiComonadもしくはExtendという、Comonadに関連するtypeclass

一言でいうと、Comonadからcopoint*1を除いたものです。


これが本当に有用ならばScalazの場合は以下のように

https://github.com/xuwei-k/scalaz/commit/5487aa1075e74b

もしくは以下のように、OptionやListなどを既存のCojoinとCobindのインスタンスにすればいいと思うのだけれども

https://github.com/xuwei-k/scalaz/commit/af0d3dbdad77b4

なぜ、そうなってないのだろう*2

これ最初に書いた数時間後に実装された・・・
https://github.com/scalaz/scalaz/commit/c9ab4bdab91b3d3a797
https://github.com/scalaz/scalaz/commit/86685074715425ae2d1
というか、先にcoflatmapとcoflatten直接実装してたからコメントした
https://github.com/scalaz/scalaz/commit/db10e6202a7270ed657c52bf03d94d131aa3376e#commitcomment-3253093




ちなみにHaskellの場合、現在 ekmett/semigroupoids にExtendがあります。

これ、実は昔は ekmett/comonad にあって、

class Extend w => Comonad w where

と、Commonad は Extend を継承していたようです!

なぜ 継承しなくなって、しかも semigroupoids に移したのだろう・・・色々と謎

*1:またの名をextract

*2: 現状のScalazは、「CojoinまたはCobindのどちらかを実装すると、もう一方は実装できる」という、実装上の都合によりCojoinとCobindというほぼExtendに相当するようなclassが2つあり、ComonadはCojoinとCobindを両方継承していたりと、ちょっとややこしい