... または、Scala をコーディングしなければならない Haskell プログラマーの事故、パート 5.
私はScalaで次の構造を持っています:
case class ResourceTree(
resources: Map[String, ResourceTree]
)
Semigroup
そして、Cats を使用して、そのインスタンスを定義したいと思います。
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
したがって、私の推測では、Scala コンパイラーのインスタンスを定義しているため、 ofSemigroup
のインスタンスを派生させることはできません。次のインスタンスがコンパイルされているため、これは確認されているようです。Semigroup
Map[String, ResourceTree]
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 の実行をあきらめるという考えを検討し始めるので、私が間違っていることを本当に望んでいます。
より良い方法はありますか?