数日前にDivisibleなどのことを書きましたが、その名前の由来について、気がついたことをメモ。
そもそもContravariantなApplicativeなら「ContravariantApplicative」と呼べばいいだろ、とも思わなくないですね?それだと長いですが。
実際ekmettせんせーが最初に入れたときはDivisibleではなく、そういった違う名前だったようです。
以下、関連コミット
- 最初にCoapplicativeとして入れたコミット https://github.com/ekmett/contravariant/commit/65d9dd74292b7a
- 名前変えたコミットその1(CoapplicativeからContravariantApplicative) https://github.com/ekmett/contravariant/commit/198571c6c872
- 名前変えたコミットその2(ContravariantApplicativeからDivisible) https://github.com/ekmett/contravariant/commit/291ca657e
ところで、最初のコミット自体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版、と言えばいい?