挙げようと思えばいくらでも挙げられるとは思うけれど、とりあえず自分が思ったものをいくつか挙げておきます。
Typeclassopediaという型クラスを色々紹介した有名な素晴らしいやつがあるのですが、それ少し古いし、もうちょっと紹介してもいいような型クラスが触れられてないぞ?というのを前から思っていたので、それを簡単に書いてみるという話。
今回挙げてないのが重要でない、これ以外知らない、というわけではなく、あくまでもなんとなくな基準です。
(好評だったら、続編を書く? or 他の人が書いてくれてもいい?)
以前こんなtweetしたけど、まぁやってくれそうな人いないし、言い出しっぺの法則ということで。
「typeclassopediaに載ってないけど重要なclass10個」みたいなの書くとか、もしくはtypeclassopedia自体書きなおして色々追記、などをそろそろしてもいい頃
現状のHaskellをやる上で必要、というより
- 原理的に存在してもいい(けど触れられてないもの)
- ekmettライブラリにあるもの
- scalaz, purescript, などHaskellに影響を受けた後発の言語やライブラリにはあるもの
という視点で挙げておきます。挙げる順番は特に意味ありません
Semigroup
Monoidの親クラスとして存在していてほしい。後発の言語では大抵そうなってるはず? 次のversionでそうなるらしい?
最初の版にはなかった?(よって上記の日本語訳にはない?)けど、公式のHaskell wikiには普通に書かれてますね。
このあたり考えだすと、可換なMonoidとかSemiringとかいくらでも出てきますが、まぁ子供(?)になるやつはともかく、親になるやつは標準にないと、無駄にラッパー作ったりしないといけなくて厳しいので
Profunctor
Arrowの親クラスとして存在していてほしい。後発の言語では(以下略
Apply
Applicativeからpureを除いたもの。Applicativeの親クラスになっていてほしい。
そんなに使い所多いか?と言われると微妙だけど、分けれるなら分けてもいいんじゃないですかね(分けることが面倒でない言語なら)
これも初期にはなかった?けど、公式のHaskellのwikiのやつには、一言だけ触れられてはいます。
HaskellのListはlazyだから、ZipListはApplicativeになるけど、strictなlistだと(無限な長さのList生成できないので)、pureが定義できなくて(と言うより定義はできても使いものにならなくて)、すなわちstrictなlistのZipListはApplicativeではなくApplyになる、みたいな例はあります。
Bind
Monadからreturnを除いたもの。Applyの子供かつ、Monadの親。言葉で説明難しくなってくるので、scalazのクラス図みてください。
http://xuwei-k.github.io/scalaz7.2.0-M5.svg
ちなみに、HaskellのMapなんかは、Monadにはならないけど、BindやApplyになる、という例。
Alt(ekmett/semigroupoidsでの名前)、もしはPlus(scalazでの名前)
高階のSemigroup?と言ったらいいのか。AlternativeやMonadPlusからSemigroupな演算だけを抽出したもの。
Plus(ekmett/semigroupoidsでの名前)、もしはPlusEmpyt(scalazでの名前)
高階のMonoid?AlternativeやMonadPlusからMonoidな演算だけを抽出したもの。一つ上で触れたAltの子供になっててほしい。
かつ、AlternatieやMonadPlusの親になってて欲しい。
ところで、Haskellの最近の型レベルな機能使えば、普通のMonoidだろうが高階なMonoidだろうが統一して扱えるから、class分ける必要ない?みたいな話聞いたことある気がしますが、よくわかってないので説明は割愛します。
あと、MonadPlusとMonadOrの違い
https://wiki.haskell.org/MonadPlus_reform_proposal
を考えると、このAltにあたるものは2種類必要になるのか?1種類でいいのか?scalazもMonadPlusを整理し直す必要あるのでは?といった話もありますが、これも完全に自分の中で整理できてないので割愛。
Extend(ekmett/semigroupoidsでの名前、もしくはCobind(scalazでの名前)
Comonadからextractを除いたもの。Comonadの親、かつFunctorの子供、になっていて欲しい。
Semigroupoid(ekmett/semigroupidsでの名前)、もしくはCompose(scalazでの名前)
Categoryからidを除いたもの。Categoryの親