...やスカラ座をコーディングしているHaskellのプログラマの事故、自体に依存して半群のインスタンスを定義
部5私はScalaでは、以下の構造:
case class ResourceTree(
resources: Map[String, ResourceTree]
)
をそして、 Catsを使って、Semigroup
のインスタンスを定義したいと思います。
object ResourceTreeInstances {
implicit val semigroupInstance = new Semigroup[ResourceTree] {
override def combine(x: ResourceTree, y: ResourceTree): ResourceTree = {
ResourceTree(
x.resources |+| y.resources
)
}
}
これは、次のエラーになります:
value |+| is not a member of Map[String, ResourceTree]
[error] Note: implicit value semigroupInstance is not applicable here because it comes after the application point and it lacks an explicit result type
[error] x.resources |+| y.resource
だから、私の推測では、私はSemigroup
のインスタンスを定義していますので、ScalaのコンパイラはMap[String, ResourceTree]
のSemigroup
のインスタンスを導き出すことができないということでした。
implicit val semigroupInstance = new Semigroup[ResourceTree] {
override def combine(x: ResourceTree, y: ResourceTree): ResourceTree = {
dummyCombine(x, y)
}
}
// FIXME: see if there's a better way to avoid the "no instance of Semigroup" problem
def dummyCombine(x: ResourceTree, y: ResourceTree): ResourceTree = {
ResourceTree(
x.resources |+| y.resources
)
}
私は本当にこれはScalaで半群のインスタンスを定義する正しい方法であれば、私は検討し始めますので、私が間違っている願っています:これは、コンパイルされ、次のインスタンスいるので、確認しているように見えますこの言語でFPをやることをあきらめる考え。
良い方法がありますか?
import cats.Semigroup
import cats.instances.map._
import cats.syntax.semigroup._
case class ResourceTree(resources: Map[String, ResourceTree])
implicit val resourceTreeSemigroup: Semigroup[ResourceTree] =
new Semigroup[ResourceTree] {
def combine(x: ResourceTree, y: ResourceTree): ResourceTree =
ResourceTree(
x.resources |+| y.resources
)
}
キーは、エラーメッセージのこの部分です:
「明示的な結果の種類がありません」と混同されました。私はそれがクラスそのものではなく結合操作を指すと考えました。ありがとう!私はScalaでコーディングするときにFPアセンブリを書くつもりであると思うのを助けることができません... –