1

... 또는 스칼라 코딩하는 하스켈 프로그래머의 사고,자체에 의존하는 반군 인스턴스를 정의

부분 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 
    ) 
    } 

의 핵심은 오류 메시지의 일부입니다 :

답변

4

다음은 잘 작동한다 "그것은 명시 적 결과 유형이 부족하다". 스칼라의 재귀 메서드에는 명시적인 반환 형식이 있어야하며 비슷한 경우 (직접 또는 간접적으로이 경우 Map 인스턴스와 |+| 구문을 통해 간접적으로 종속 됨)에도 필요합니다. 일반적으로

그것은 그렇게 모든 암시-하지 정의는이 경우와 같이 (그것에 대해 생각하고 사양을 읽으면 의미가 일부 예기치 않은 동작이 발생할 수 있습니다 에 명시 적 반환 형식을 넣어하는 것이 좋습니다) 중 일부는 컴파일러에서 버그가있는 것처럼 보입니다.

+1

나는 "명백한 결과 유형이 없다"는 말로 혼란스러워했다. 나는 그것이 클래스 자체가 아니라 결합 연산을 참조한다고 생각했습니다. 감사! 나는 Scala로 코딩 할 때 FP 어셈블리를 작성한다고 생각할 수 없다. –