나는 Some::flatten
의 정의를 이해하려고 애 썼는데 문제가 생겼다. 여기 보이는 방법입니다플랫 틴이란 무엇입니까?
def flatten[B](implicit ev: A <:< Option[B]): Option[B] =
if (isEmpty) None else ev(this.get)
내가 A <:< Option[B]
의 평균을 이해하지 못했다. <:<
의 의미는 무엇입니까?
나는 Some::flatten
의 정의를 이해하려고 애 썼는데 문제가 생겼다. 여기 보이는 방법입니다플랫 틴이란 무엇입니까?
def flatten[B](implicit ev: A <:< Option[B]): Option[B] =
if (isEmpty) None else ev(this.get)
내가 A <:< Option[B]
의 평균을 이해하지 못했다. <:<
의 의미는 무엇입니까?
일반화 된 유형 제약 조건이므로 병합중인 유형이 Option[Option[T]]
(또는 List[List[T]]
) 형식이어야합니다. 그것이 무엇을 Option
또는 List
의 레이어를 제거합니다. 따라서 Some(Some(3))
은 Some(3)
이되고 Some(None)
은 없음이되고 None
은 None
이됩니다. 목록 : List(List(1,2), List(3))
은 List(1, 2, 3)
이됩니다.
표준 라이브러리에서 일반화 된 유형 제약 조건을 사용하는 방법을 설명하는 매우 유용한 기사가 있습니다 (here).
편집 : @mavarazy가 지적한대로 Seq [Option [T]]를 Seq [T]로 전개 할 수도 있습니다. 일반화 된 유형 제약은 Scala 유형 시스템의 고급 기능 중 하나라고 생각하는 매우 강력한 장치입니다.
당신이 그것을 쉽게 수단 넣으면 평평 - 포장을 벗긴 (단순화) 입력
옵션의 경우, 당신이 경우 널 (NULL)
Some(Some("a")).flatten = Some("a")
의 단일 수준으로 단순화, 널 (NULL)의 널 (NULL)이있는 경우 의미 옵션의 서열, 그것은 서열의 서열 번호의 경우 모든 nullables
Seq(Some("a"), None, Some("b")).flatten = Seq("a", "b")
을 제거 의미는 서열 레벨을
012를 제거 의미Seq(Seq("a"), Seq(), Seq("b", "c")).flatten = Seq("a", "b", "c")
A <: B
은 일반적으로 A
이 B
의 하위 유형임을 의미합니다.
A <:< B
은이 하위 유형 관계의 증거를 제공하는 것으로, A
을 B
으로 변환하는 방법이 있음을 의미합니다.
기능 flatten
는 Option[+A]
클래스의 멤버이며, 그것은 당신의 유형 A
가 Option[B]
로 전환 될 수 있다는 몇 가지 증거, 인
implicit ev: A <:< Option[B]
이 필요합니다. 이 증거가 제공된 Option[A]
부터 시작하여 Option[Option[B]]
으로 바꿀 수 있으며, 다른 답변에서 설명하는대로 Option[B]
으로 박살낼 수 있습니다.
'flatten'이 무엇이 아닌지 묻는 질문을 읽었으나 'A <:
@TheArchetypalPaul 제목 "평평하게하는 것이 무엇입니까?" 그는 평평한 것이 무엇인지 묻습니다. – Jesper
예, 동의했지만 질문의 본문에 달리 말합니다. –