1

...やスカラ座をコーディングしている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 
    ) 
    } 

キーは、エラーメッセージのこの部分です:

答えて

4

以下はうまく動作するはずです「と、それは、明示的な結果の型が欠けています」。 Scalaの再帰的メソッドは明示的な戻り値型を持たなければならず、同様のタイプのクラスインスタンスも(直接的または間接的に)Mapインスタンスと|+|の構文のようなものを介して必要です。

すべて暗黙の定義に明示的な戻り値の型を入れるのは良い考えです。予期しない動作につながる可能性があります。そのことについて考えると仕様を読んでも意味があります)、その中のいくつかはコンパイラのバグであるようです。

+1

「明示的な結果の種類がありません」と混同されました。私はそれがクラスそのものではなく結合操作を指すと考えました。ありがとう!私はScalaでコーディングするときにFPアセンブリを書くつもりであると思うのを助けることができません... –

関連する問題