2016-12-31 18 views
3

から特定のタイプを見つけるためにどのように私はあまりにも多くのクラスがありますので、私はcats.implicits._の輸入を好きではないしかし、コンパイルし、猫:暗黙

import cats.implicits._ 
Cartesian[ValidResponse].product(
    getName(map).toValidated, 
    readAge(map).toValidated 
).map(User.tupled) 

正常に動作します。このコードを持っています。

import cats.implicits.catsSyntaxCartesian 
import cats.implicits.catsSyntaxUCartesian 
import cats.implicits.catsSyntaxTuple2Cartesian 

のような特定のものをインポートしようとしましたが、これらは機能しませんでした。初心者としては、暗黙的なインポートは非​​常に混乱していることがわかりました。なぜなら、1000個の名前があり、その名前はあまり明確ではないからです。私の唯一の選択肢は、import cats.implicits._によって宇宙全体をインポートし、それについて考えを止めることです。

実際に私はcats.implicitscats.instances._およびcats.syntax._について広範な混乱を抱いています。これまでは、試行錯誤を経てこれらをインポートしています。私はいつ何を輸入するのか分からない。

+0

+1それは誰のビジネスだようにほとんどのライブラリは、暗黙を乱用していること。あなたがインポートを変更したり、コードを再フォーマットしたり、IDEがワイルドカードのインポートを取り除いたりすると、自分のコードが壊れる可能性があります。 –

答えて

7

cats.implicitsから特定のものを選んではいけません。あなたは物全体をインポートするか、まったく使用しません。さらに、それをすべてインポートすることを恐れる理由はありません。それは何かを妨げることはできません。

[OK]を、私は嘘をついた。 cats.instances.<x>._および/またはcats.syntax.<x>._cats.implicits._にインポートすると、になります。これらのグループは相互に排他的です。cats.implicits._ですべてをインポートしたり忘れたりするか、具体的にはcats.instancescats.syntaxでインポートするものを選択します。

これらの2つのパッケージは、cats.implicitsのように完全にインポートされることを意味するではなく、です。代わりに、they include abunch of objects。各オブジェクトには暗黙のインスタンス/構文が含まれており、からそれらをインポートするのはです。

import cats.implicits._ // Good, nothing to fear 
// RESET IMPORTS 
import cats.implicits.catsSyntaxCartesian // Bad, don't pick and choose 
// RESET IMPORTS 
import cats.instances._ // Bad, is useless 
import cats.syntax._ // Ditto 
// RESET IMPORTS 
import cats.instances.list._ // ok 
import cats.syntax.cartesian._ // ok 
// RESET IMPORTS 
import cats.implicits._ 
import cats.syntax.monad._ // Bad, don't mix these two 

さらにcats.{ instances, syntax }の各々は明らか機能と、allオブジェクトを含みます。インポートcats.implicits._は実際にimport cats.syntax.all._, cats.instances.all._のショートカットです。

2

import cats.implicits._は安全で妥当で、起動時には推奨される方法から始めることにします。だからこの質問の唯一の理由は、あまりにも多くのクラスをインポートするのが好きではないということです。

また、公式のネコimport guideをご覧ください。それは猫のコードのパッケージ/論理構造を説明しようとし、理解しやすくするかもしれません。

「猫」ライブラリを簡単にパッケージ名で区別することができ、いくつかの「領域」で編成され

  1. cats._ - 型クラスのほとんどが住んでいる。これは、(例えばモナド、折り畳み式など)
  2. cats.data._ - これは、ValidatedやStateなどのデータ構造の本拠地です。
  3. cats.instances._ - これは、1で定義されたタイプクリスのインスタンスがある場所です。たとえば、cats.instances.list._をインポートすると、Show、Monadなどのスコープが表示されます。標準Listのインスタンスに興味がある可能性が高いです。
  4. cats.syntax._ - コードの読み書きを容易にする構文が豊富にあります。

cats.syntax._をウッシングの例は次のようになります。

import cats.Applicative 
import cats.syntax.applicative._ 

val listOfInt = 5.pure[List] 
//instead of 
val otherList = Applicative[List[Int]].pure(5)