Divisible型クラスやそのメソッドの名前の由来

数日前にDivisibleなどのことを書きましたが、その名前の由来について、気がついたことをメモ。


ContravariantやInvariantなApplicativeとscalaz.Equal, Orderとscalaprops.Cogenと各種シリアライザ―(scodec, argonaut, play-json, msgpack4z)


そもそもContravariantなApplicativeなら「ContravariantApplicative」と呼べばいいだろ、とも思わなくないですね?それだと長いですが。
実際ekmettせんせーが最初に入れたときはDivisibleではなく、そういった違う名前だったようです。
以下、関連コミット


ところで、最初のコミット自体2014年の8月なので、ずいぶん最近ですね。Haskell界隈でも「ContravairantなApplicative」の概念なんて知ってる人かなり少なそう。


そしてDivisibleの名前の由来ですが、自分も知りませんし、答え見つかったわけじゃありません。それ故、猫のgitterでも話題になってました。milessabinさんが、以下のような予想を言っていましたが、自分も大体そんなところなんじゃないか、と思ってます


https://gitter.im/non/cats?at=55e316fc56211cd86f869c3b

It's making me think of distributive predicates in lattices for some reason, ie. P(a) & P(b) => P(a * b) and P(a * b) => P(a) & P(b)
Ie. as a characteristic of the predicate P ... (co)distributive or somesuch.

以前書いたように

ekmett先生のdiscriminationというライブラリの動画を見たので雑に要約してみた


ContravariantなApplicativeであるDivisibleは、discriminationというライブラリで使われていて、Boolを返すPredicateがそのインスタンスになることはかなり重要なので、そう名づけたのではないですかね?


さて、そう考えると、Divisibleはどうにか納得がいくとして、そのメソッドの「conquer」がさっきまで自分のなかで謎だったんですが、つい先程一人で納得してました。

https://github.com/ekmett/contravariant/blob/v1.3.2/src/Data/Functor/Contravariant/Divisible.hs#L84

ちなみにconquerは、ApplicativeのpureやpointのContravariantなversionのものです。*1

divideとconquerという言葉の組み合わせ見たら、ある程度英語の知識ある人は「なるほどそういうことか」と思うんでしょうか?自分は思わなかったので、まだまだ英語力足りないですね。

べつにコレも確信があるわけではないですが、「divide and conquer」で一つの言葉ですね。そういうことです(どいうことだ)
日本語だと「分割統治」です。政治(?)の言葉でもあるし「divide and conquer algorithm」とすれば「分割統治法」となって、コンピュータサイエンスの言葉でもありますね?

つまり「divide」という名前つけた後、なんとなくそれとの組み合わせとの言葉遊びとして(ekmett先生もしくは近しい人のだれかが)conquerと名づけたんじゃないでしょうか?


以上、プログラミングの話というより、英語の豆知識コーナーをお届けしました(?)

*1: 更に言うと、divideはscalaz.Apply.apply2のContravariant版、と言えばいい?