2016-12-31 12 views
3

У меня есть этот код, который компилируется и работает отличноCats: как найти конкретный тип из implicits

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

Однако мне не нравится импорт cats.implicits._, потому что есть только слишком много классов там. Я попытался импортировать определенные вещи, связанные с картезианцами, такие как

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

Но это не сработало. Как новичок я нахожу, что имплицитные импорты очень сбивают с толку, потому что их просто тысячи, а имена не очень очевидны. Моя единственная альтернатива - импортировать всю вселенную на import cats.implicits._ и перестать думать об этом.

Фактически у меня есть более широкая путаница в отношении cats.implicits, cats.instances._ и cats.syntax._. Пока я просто импортирую их через пробную версию и ошибку. Я не уверен, когда им нужно импортировать.

+0

+1, что большинство библиотек злоупотребляют implicits как это дело никто не. Мое самое большое домашнее животное - ваш код может сломаться, если вы измените импорт или переформатируете код, а среда IDE удалит импорт подстановочных знаков. –

ответ

7

Не пытайтесь выбирать конкретные вещи от cats.implicits. Вы либо импортируете все это, либо не используете его вообще. Кроме того, нет причин бояться импортировать все это. Он ничего не может помешать.

Хорошо, я солгал. Это будет вмешиваться, если вы импортируете cats.instances.<x>._ и/или cats.syntax.<x>._ рядом с cats.implicits._. Эти группы должны быть взаимоисключающими: вы либо импортируете все, либо забываете об этом с помощью cats.implicits._, либо вы специально выбираете, что хотите импортировать с помощью cats.instances и cats.syntax.

Эти две упаковки: не предназначены для полного ввоза, как 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 and State.
  3. cats.instances._ - Здесь экземпляры для типов, определенных в 1, являются. Например, если вы импортируете cats.instances.list._, вы внесете в сферу Show, Monad и т. Д.экземпляры для стандартного списка. Это то, что вас больше всего интересует.
  4. cats.syntax._ - имеет некоторое синтаксическое обогащение, которое упрощает чтение и чтение кода.

Пример Ussing cats.syntax._ будет:

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^