2016-07-07 7 views
2

나는 Some::flatten의 정의를 이해하려고 애 썼는데 문제가 생겼다. 여기 보이는 방법입니다플랫 틴이란 무엇입니까?

def flatten[B](implicit ev: A <:< Option[B]): Option[B] = 
    if (isEmpty) None else ev(this.get) 

내가 A <:< Option[B]의 평균을 이해하지 못했다. <:<의 의미는 무엇입니까?

답변

4

일반화 된 유형 제약 조건이므로 병합중인 유형이 Option[Option[T]] (또는 List[List[T]]) 형식이어야합니다. 그것이 무엇을 Option 또는 List의 레이어를 제거합니다. 따라서 Some(Some(3))Some(3)이되고 Some(None)은 없음이되고 NoneNone이됩니다. 목록 : List(List(1,2), List(3))List(1, 2, 3)이됩니다.

표준 라이브러리에서 일반화 된 유형 제약 조건을 사용하는 방법을 설명하는 매우 유용한 기사가 있습니다 (here).

편집 : @mavarazy가 지적한대로 Seq [Option [T]]를 Seq [T]로 전개 할 수도 있습니다. 일반화 된 유형 제약은 Scala 유형 시스템의 고급 기능 중 하나라고 생각하는 매우 강력한 장치입니다.

1

당신이 그것을 쉽게 수단 넣으면 평평 - 포장을 벗긴 (단순화) 입력

옵션의 경우, 당신이 경우 널 (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") 
+0

'flatten'이 무엇이 아닌지 묻는 질문을 읽었으나 'A <:

+0

@TheArchetypalPaul 제목 "평평하게하는 것이 무엇입니까?" 그는 평평한 것이 무엇인지 묻습니다. – Jesper

+0

예, 동의했지만 질문의 본문에 달리 말합니다. –

3

A <: B은 일반적으로 AB의 하위 유형임을 의미합니다.

A <:< B은이 하위 유형 관계의 증거를 제공하는 것으로, AB으로 변환하는 방법이 있음을 의미합니다.

기능 flattenOption[+A] 클래스의 멤버이며, 그것은 당신의 유형 AOption[B]로 전환 될 수 있다는 몇 가지 증거, 인

implicit ev: A <:< Option[B]

이 필요합니다. 이 증거가 제공된 Option[A]부터 시작하여 Option[Option[B]]으로 바꿀 수 있으며, 다른 답변에서 설명하는대로 Option[B]으로 박살낼 수 있습니다.