2017-12-08 21 views
3

형식 제한이있는 abstract class Foo[V : Monoid]Functor을 정의 할 수 없습니다. 이는 Functormap 메소드가 Monoid이 아닌 B 매개 변수를 사용하기 때문입니다.형식 제약 조건을 functor 맵 함수에 추가하는 방법

제 질문은 어떻게 그런 제약 조건을 추가 할 수 있습니까?

import cats.Functor 
import cats.kernel.Monoid 

abstract class Foo[A : Monoid] { 
    val a: A 
} 

object Foo { 
    implicit def FooFunctor = new Functor[Foo] { 
    override def map[A, B](fa: Foo[A])(f: (A) => B) = new Foo[B] { 
     override val a: B = f(fa.a) 
    } 
    } 
} 

이 다음과 같은 예외를 발생 : 여기

내가 할 노력하고있어에서 샘플의

내 첫 번째 해결책으로 map 정의에 제약 조건을 추가했다
Error:(12, 59) could not find implicit value for evidence parameter of type cats.kernel.Monoid[B] 
    override def map[A, B](fa: Foo[A])(f: (A) => B) = new Foo[B] { 

(override def map[A, B : Monoid]) 그러나 이것은 함수의 정의를 Functor으로 변경하고 예외를 발생시킬 것이므로 유효하지 않습니다.

Error:(12, 18) method map overrides nothing. 

아무도 도와 주실 수 없습니까? 어떤 제안이라도 인정 될 것입니다.

+0

'Functor'대신에 'Applicative'가 필요합니까? 그런 식으로 당신은'Foo [B] '와'Foo [B]'를 만들 수 있습니다. –

+0

이것은 일반적인 [XY 문제] (https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)처럼 보입니다. 이 코드로 해결하려는 실제 문제를 설명해 주시겠습니까? 'cats.Functor'는 가능한 모든 유형에 대해 정의되어야하기 때문에'Foo'는'cats' 정의에 따라'Functor '가 아닙니다. 그러나 아마도 이것은 당신이 정말로 필요로하는 것이 아닙니다. 그래서 당신의 높은 수준의 문제를 지정하고 누군가가 더 나은 솔루션을 내놓을 수 있습니다. – SergGr

답변

0

저는 주요 문제는 하위 유형을 유형 클래스와 혼합하려고한다는 것입니다. 다음과 같아야합니다 :

trait Foo[A] extends Monoid[A] with Functor[A] { 
    val a: A 
} 

trait SomeADT 
case class SomeValue(a: String) extends SomeADT 

object SomeADT { 
    //evidence 
} 
+0

아직 불완전한 상태입니다. –