2016-09-29 5 views
2

나는 서적 Advanced scala with cats에서 간단한 운동을하고 있습니다.고양이와 스칼라 - Cartesian + Validated

CartesianValidated을 사용하고 싶습니다.


/* this doesnt work*/ 
type Result[A] = Validated[List[String], A] 
Cartesian[ValidatedString].product(
    f(somevariable)//returns Result[String], 
    g(somevariable)//returns Result[Int], 
).map(User.tupled) // creates an user from the returned string, int 

임 완전히 우둔

/* 
this works 
*/ 
type ValidatedString = Validated[ Vector[String], String] 
Cartesian[ValidatedString].product(
    "a".valid[Vector[String]], 
    "b".valid[Vector[String]] 
) 
. 어떤 힌트? 임 점점 :

could not find implicit value for parameter instance: cats.Cartesian[Result] Cartesian[Result].product( ^

+0

첫 번째 예제에서는'ValidationString'을'Vector [] '로 정의하고 두 번째 예제에서는'List []'로 정의합니다. 이것이 진정한 차이입니까? –

+0

'ValidatedString'은 유형 생성자가 아니기 때문에 부차적 인 부분이지만 처음 코드 스 니펫은 실제로 작동하지 않습니다. 이 질문은 향후 독자가 코드를 올바르게 설명하도록하는 데 더 유용 할 것입니다. –

답변

4

당신의 수입 나는이 문제를 추측에는 요를 보지 않고 당신이 있기 때문에, (당신이 사용하고자하는 분명하지 않다 - 그것은 또는 Vector) List에 대한 Semigroup 인스턴스를 놓치고 있다는 것입니다 나를 위해 작품을 다음

import cats.instances.list._ 
import cats.syntax.validated._ 
:

import cats.Cartesian, cats.data.Validated, cats.implicits._ 

type Result[A] = Validated[List[String], A] 

Cartesian[Result].product(
    "a".valid[List[String]], 
    "a".valid[List[String]] 
) 

당신은 다음과 cats.implicits._ 부분을 대체 할 수

...하지만 cats.implicits._으로 시작하는 것이 좋습니다.

문제는 여기에 Validated 당신이 product 두 개의 인스턴스를 결합, 어떤 "축적"때 실패를 축적 당신이 잘못이 "를 추가"하는 방법에 대해 설명합니다 잘못된 유형에 대한 Semigroup 인스턴스에 의해 결정되는 특정 맥락에서 의미이다 함께 가치. List (또는 Vector)의 경우

는 연결이 축적 작업에 의미가 있습니다, 그리고 고양이는 List[A]의 연결 Semigroup을 제공하지만, 순서대로하는 중 (가 명시 적으로 가져올 필요가 여기에 적용 할 얻을 cats.implicits 또는 cats.instances.list).

+0

'cat .implicits._ 가져 오기 '가 누락되었습니다. 감사합니다! –