2012-11-22 2 views
4

ToFunctorOps는 내재 ToLiftV를 통해 lift 방법을 정의하지만 나는 내 펑터 인스턴스를 발견 할 수없는 것 :는 ToFunctorOps에서 리프트를 사용하는 방법

import scalaz.std.option._ 
import scalaz.syntax.functor._ 
import scalaz.syntax.id._ 
import scalaz.syntax.std.option._ 

def inc(x: Int) = x + 1 

1.some |> (inc _).lift 

<console>:16: error: could not find implicit value for parameter F: scalaz.Functor[F] 
       1.some |> (inc _).lift 

옵션의 펑 인스턴스가 볼 수 있지만, 컴파일러 그것을 찾을 수없는 것 같습니다. 이 문제를 어떻게 해결할 수 있을지에 대한 제안이 있으십니까?

답변

2

이것이 작동하지 않는 이유를 정확히 이해하지 못합니다. (이해가 안되는 부분에 대해 a follow-up question에게 물어 봤지만) 세 가지 해결 방법을 제공 할 수 있습니다.

first은 나에게 의미가 없으며 코드와 clunky 구문을 좀 더 깊게 변경해야하므로 필자는이를 지나치게 언급 할 것입니다.

scala> val of = implicitly[scalaz.Functor[Option]] 
of: scalaz.Functor[Option] = [email protected] 

scala> import of.functorSyntax._ 
import of.functorSyntax._ 

scala> 1.some |> (inc _).lift 
res0: Option[Int] = Some(2) 

그러나 이것은 당신이 원하는 모든 개인 Functor 이러한 implicits을 가져올 것을 요구 :

두 번째는 (제대로 작동하지 않는 ToFunctorOps 것과 반대로) 적절한 FunctorSyntax implicits을 가져 오는 것입니다 그들과 함께 사용하고, 단지 of lift inc을 쓰는 것보다 훨씬 낫지 않습니다.

마지막 코드가 조금 더 필요하지만 더 만족 스럽습니다. 당신은 liftFunction2Ops에서의 모델로 myLift 방법으로, 다음과 같은 새로운 구문 특성이 필요합니다

trait MyFunction1Syntax[A, R] extends scalaz.syntax.Ops[A => R] { 
    def myLift[F[_]](implicit F: scalaz.Functor[F]) = F lift self 
} 

implicit def toMyFunction1Syntax[A, R](f: A => R) = 
    new MyFunction1Syntax[A, R] { def self = f } 

이제 다음 작성할 수 있습니다

scala> 1.some |> (inc _).myLift 
res3: Option[Int] = Some(2) 

그것은이 문제를에 가져 오는 가치가있을 수도를 Scalaz 메일 링리스트.

+0

두 번째 해결 방법에 대한 귀하의 주장을 이해할 수 없습니다. 이러한 수입으로 충분할 것입니다. 'import scalaz.std.AllInstances._'및 'import scalaz.syntax.functor._' –

+1

@YoEight 예, 이것이이 질문의 핵심입니다. – Hugh

+1

그건 기괴한 행동입니다. 정말 좋은 파기입니다. – Hugh

0

귀하의 문제는 쉽게 문제가 FunctorSyntax에 사용되는 LiftV 특성에서 온이

import scalaz.syntax.std.option._ 
import scalaz.std.option._ 
import scalaz.syntax.id._ 

implicit def liftIt[F[_], A, B](f: A => B)(implicit F: Functor[F]): F[A] => F[B] = 
    F lift f 

def inc(x: Int) = x + 1 

2.some |> inc 

같이 해결할 수 있습니다. 솔직하게, 나는 그것이 누군가를 위해 유용 할 수 있었다는 것을 의심한다. 작동하려면 명시 적으로 입력해야합니다.

import scalaz.syntax.functor._ 

val f: LiftV[Option, Int, Int] = (inc _) 

2.some |> f.lift