이것이 작동하지 않는 이유를 정확히 이해하지 못합니다. (이해가 안되는 부분에 대해 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
을 쓰는 것보다 훨씬 낫지 않습니다.
마지막 코드가 조금 더 필요하지만 더 만족 스럽습니다. 당신은 lift
Function2Ops
에서의 모델로 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 메일 링리스트.
두 번째 해결 방법에 대한 귀하의 주장을 이해할 수 없습니다. 이러한 수입으로 충분할 것입니다. 'import scalaz.std.AllInstances._'및 'import scalaz.syntax.functor._' –
@YoEight 예, 이것이이 질문의 핵심입니다. – Hugh
그건 기괴한 행동입니다. 정말 좋은 파기입니다. – Hugh