2016-12-23 5 views
4

고양이 또는 스칼라즈에 다른 컨테이너 유형을 변환하는 typeclass가 있습니까? 예를 들어스칼라 (고양이 또는 스카라)의 펑터 (F [A] => G [A]) 변환

  • 옵션 ~>
  • 이 ~> 미래
  • 하려고 시도 ~> 중 하나를 시도
  • 옵션 ~> 목록

FunctionK/~>/NaturalTransformation이있을 수 있습니다 것처럼 보이는 내가 찾고있어,하지만 그들에 대해 정의 된 인스턴스가 없으며 왜 그런지 모르겠다.

답변

5

자연스러운 변환이 당신이 찾고있는 것입니다. 그것들은 펑터 (functor)들 사이에서 형태를 정의합니다 (이 경우, List[A]Option[A] 타입 생성자).

def main(args: Array[String]): Unit = { 
    val optionToList = new (Option ~> List) { 
    override def apply[A](fa: Option[A]): List[A] = fa.toList 
    } 

    println(optionToList(Some(3))) 
    println(optionToList(None)) 
} 

수익률 : 당신은 Scalaz에 ~> "연산자"를 사용하여 하나를 정의 할 수 있습니다

/** A universally quantified function, usually written as `F ~> G`, 
    * for symmetry with `A => B`. 
    */ 
trait NaturalTransformation[-F[_], +G[_]] { 
    self => 
    def apply[A](fa: F[A]): G[A] 

    // Abbreviated for the answer 
} 
:

List(3) 
Nil 

~>는 특성 NaturalTransformation[-F[_], +G[_]]에 대한 syntatic 설탕이다