2016-09-29 2 views
2

Я делаю простое упражнение из книги Advanced scala with cats самостоятельно.Scala with Cats - Cartesian + Validated

Я хочу использовать Cartesian с Validated.

/* 
this works 
*/ 
type ValidatedString = Validated[ Vector[String], String] 
Cartesian[ValidatedString].product(
    "a".valid[Vector[String]], 
    "b".valid[Vector[String]] 
) 

/* 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 

Im совершенно невежественны. Любые намеки? Im получение:

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

+0

В первом примере вы определяете 'ValidatedString' в терминах' Vector [] ', а во втором примере вы определяете его в терминах' List [] '. Это реальная разница? –

+0

Это второстепенный момент, но ваш первый фрагмент кода _doesn't_ действительно работает, так как 'ValidatedString' не является конструктором типа. Это сделало бы этот вопрос более полезным для будущих читателей, чтобы убедиться, что ваш код описан правильно. –

ответ

4

Не видя ваш импорт я предположил бы, что вопрос в том, что вы не нашли Semigroup экземпляр для List (или Vector -это не ясно, который вы хотите использовать), так как следующие работы для меня:

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._ часть со следующим:

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

... но я предлагаю начать с cats.implicits._.

Проблема здесь состоит в том, что Validated накапливает неудачи, когда вы объединяете два экземпляра с product, и то, что «аккумулирует» означает, в определенном контексте определяется Semigroup например, для недопустимого типа, который говорит вам, как «добавить» два недействительный значения вместе.

В случае List (или Vector), конкатенация имеет смысл для этой операции накопления и кошек обеспечивает конкатенацию Semigroup для любого List[A], но для того, чтобы применять его здесь нужно явно импортировать его (или от cats.implicits или от cats.instances.list).

+0

Мне не хватало 'import cats.implicits._' спасибо! –