2016-12-31 1 views
3

의 특정 유형을 찾을 어떻게 컴파일하고 작동이 코드를 가지고 거기에 너무 많은 클래스가 있기 때문에 내가 cats.implicits._의 가져 오기를 싫어하지만고양이 : implicits

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

잘. 나는 Cartesians와 관련된 특정 것들을 가져 오려고 시도했다.

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

그러나 이것들은 작동하지 않았다. 초보자로서 나는 묵시적 임포트가 매우 혼란 스럽다는 것을 발견했다. 왜냐하면 그 중 단지 1000 가지가 있고 그 이름이 그리 명백하지 않기 때문이다. 내 유일한 대안은 전체 우주를 import cats.implicits._으로 가져 와서 그것에 대해 생각하지 않는 것입니다.

실제로 나는 cats.implicits, cats.instances._cats.syntax._에 대해 더 혼란 스럽습니다. 지금까지 나는 시행 착오를 통해 이것들을 가져오고있다. 나는 무엇을 가져올 지 정말로 확신하지 못한다.

+0

한 대부분의 도서관은 implicits을 남용 것이다. 필자가 가장 많이 들었던 것은 가져 오기를 변경하거나 코드를 다시 포맷하면 IDE가 와일드 카드 가져 오기를 제거 할 때 코드가 손상 될 수 있다는 것입니다. –

답변

7

cats.implicits에서 특정 항목을 선택하지 마십시오. 전체 내용을 가져 오거나 전혀 사용하지 않습니다. 또한 모든 것을 가져 오는 것을 두려워 할 이유가 없습니다. 그것은 무엇이든 방해 할 수 없습니다.

네, 거짓말했습니다. cats.instances.<x>._ 및/또는 cats.syntax.<x>._cats.implicits._와 함께 가져 오는 경우 이됩니다. 이 그룹은 상호 배타적입니다. cats.implicits._으로 모든 것을 가져오고 잊어 버리거나 cats.instancescats.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._ - typeclasses의 대부분이 사는 곳이다 (예를 들어, 모나드, 접이식 등)
  2. cats.data._ - 이것은 Validated 및 State와 같은 데이터 구조의 고향입니다.
  3. cats.instances._ - 이것은 1에 정의 된 타입 클립의 인스턴스가있는 곳입니다. 예를 들어 cats.instances.list._을 가져 오면 표시, 모나드 등의 범위를 가져옵니다.표준 목록의 인스턴스 에 가장 관심있는 내용입니다.
  4. cats.syntax._ - 코드 작성 및 읽기가 더 쉬워 진 몇 가지 구문이 풍부합니다.

cats.syntax._을 ussing의 예 : 그것은 아무도의 사업처럼

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

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