고양이/Scalaz의 기본 예제를 다루었으며 튜토리얼을 통해 느낌을 얻었으며 확실한 케이스를 쳤습니다. 에 대한 해결책이 있습니다.하위 클래스 (cats/scalaz)를 사용하여 Functor로 일반 함수 호출하기
그것은 <: F
인 컨텍스트 펑터 뷰 (F[_] : Functor
)와 상황화 값 (F[A]
)를 얻어 일반화 된 함수를 호출 할 수 있는가? 나는 Functor가 F[_]
타입에서 불변하다고 알고 있고, 또한 Functor.widen
이라는 존재를 알고 있습니다.하지만 일반적인 함수에서 사용하기 위해 내 타입을 암시 적으로 넓힐 방법이 없다는 것이 이상하게 보입니다.
고양이의 예 (Scalaz와 유사한 예뿐만 아니라 존재) : 명시 적 옵션 및 매핑에 대한은 Functor를 소환 물론
import cats.instances.all._
import cats.syntax.all._
def takesAFunctor[F[_] : cats.Functor](f: F[Int]) = f.map(_ + 1)
takesAFunctor(Option(1)) // Works fine (of course)
takesAFunctor(Some(1)) // No implicit for Functor[Some]. Makes sense, but can we summon one since we have a Functor[Option]?
takesAFunctor(Some(1): Option[Int]) // Works but very verbose
가 예상 작품 그래서
Functor[Option].map(Some(1))(_ + 1) // Some(2)
내 질문에 is : 일반 함수의 시그니처가 서브 클래 싱 된 컨텍스트를 설명하기 위해 변경되어야하는지, 내가 모르는 일종의 "암시 적 확장"이 있는지, 아니면 스칼라의 함수 프로그래밍에 대한 불행한 결점이 stdlib?
A-ha! 이것은 내가 찾고 있었던 바로 그 것이었다. 고맙습니다! 나는 Function Variance를 고려하기를 완전히 소홀히했다. 그것은 많은 의미를 가진다. –