2

私はAdvanced scala with cats自分で本の簡単なエクササイズをしています。

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

私は完全に無知です。ヒントはありますか?私は得ています:

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

4

1 に答える 1

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、2 つのインスタンスを で組み合わせると失敗が累積することですproduct。特定のコンテキストで「累積」が意味することは、Semigroup2 つの無効な値を一緒に「追加」する方法を示す無効な型のインスタンスによって決まります。

List(または)の場合、連結はこの累積操作に意味があり、Cats は任意Vectorの の連結を提供しますが、ここで適用するには、明示的にインポートする必要があります (fromまたは from のいずれか)。SemigroupList[A]cats.implicitscats.instances.list

于 2016-09-29T18:15:55.363 に答える