... 또는 스칼라 코딩하는 하스켈 프로그래머의 사고,자체에 의존하는 반군 인스턴스를 정의
부분 5. 스칼라에서 다음과 같은 구조를 가지고 :
case class ResourceTree(
resources: Map[String, ResourceTree]
)
을 그리고, 고양이를 사용하여, 그것의 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
의 인스턴스를 정의하고있어 이후 스칼라 컴파일러는 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
)
}
이 내가 고려하고 시작합니다 스칼라에서 반군에 대한 인스턴스를 정의하는 올바른 방법 인 경우 때문에 정말 내가 틀렸다 희망하고있다
이 언어로 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 어셈블리를 작성한다고 생각할 수 없다. –