복붙노트

[SCALA] 어떻게 A [B [C]가] B로 변환하는 [A [C]] A와 B는 모나드가 있다면?

SCALA

어떻게 A [B [C]가] B로 변환하는 [A [C]] A와 B는 모나드가 있다면?

나는 같은를 달성하기 위해 (그리고 아마도 monoids) 모나드를 악용하는 더 일반적인 솔루션을 찾고 있어요 다른 (xs.contains (없음)) 중에 일부 (xs.flatten가) 형 서열의 XS의 경우와없는 경우 [옵션 A]].

나는 Scalaz에 어떻게 그렇게 할 수 있습니까? 나는 분명 뭔가 빠진 것 같은 느낌.

해결법

  1. ==============================

    1.이 모나드를 갖는 두 부족 (M에 대한) 더 (N에 대한) 충분 - 어떤이의에 충분한까지 추가 과정 - 그러나 M은 트래버스 인스턴스를 가지고 있으며, N은 실용적 인스턴스가있는 경우, 당신은 순서를 사용할 수 있습니다. 예를 들면 :

    이 모나드를 갖는 두 부족 (M에 대한) 더 (N에 대한) 충분 - 어떤이의에 충분한까지 추가 과정 - 그러나 M은 트래버스 인스턴스를 가지고 있으며, N은 실용적 인스턴스가있는 경우, 당신은 순서를 사용할 수 있습니다. 예를 들면 :

    import scalaz._, Scalaz._
    
    def foo[A](xs: List[Option[A]]): Option[List[A]] = xs.sequence
    

    이것은 당신이 원하는 의미를 가지고있다. Scalaz 7이 더 이상 서열에 필요한 트래버스 인스턴스를 제공하기 때문에 (당신은 쉽게 자신을 쓸 수 있지만) 내가 대신 서열 목록을 사용하지 않는거야 있습니다.

    당신이 눈치 챘을 때, 다음은 컴파일되지 않습니다 :

    List(Some(1), Some(45)).sequence
    

    당신이 거기에 없음을 던져없는 경우는 괜찮습니다 비록 :

    scala> List(Some(1), None, Some(45)).sequence
    res0: Option[List[Int]] = None
    

    목록의 추론 유형 (일부 (1), 일부 (45))입니다 목록 [일부 [지능이], 우리는 일부에 대한 실용적 인스턴스를 가지고 있지 않기 때문입니다.

    Scalaz는 Some.apply처럼 작동하지만 당신은 이미 옵션으로 입력 뭔가를 제공하는 편리한 몇 가지 방법을 제공합니다, 그래서 당신은 다음과 같이 쓸 수 있습니다 :

    scala> List(some(1), some(45)).sequence
    res1: Option[List[Int]] = Some(List(1, 45))
    

    필요한 엑스트라 입력합니다.

  2. from https://stackoverflow.com/questions/12358673/how-to-convert-abc-to-bac-if-a-and-b-are-monads by cc-by-sa and MIT license