2011-01-05 3 views
6

Iterable의 3 개의 즉각적인 하위 유형은 Map, SeqSet입니다. 성능 문제를 제외하고는 Seq은 정수에서 값으로의 매핑이고 Set은 값에서 부울 값으로의 매핑입니다 (값이 집합에 있으면 true이고 그렇지 않으면 false).Seq [V]가 Map [Int, V]를 확장하지 못하고 Set [V]가 Map [V, Bool]을 확장하지 않는 이유는 무엇입니까?

이 경우 왜 Seq[V]을 확장하여 Map[Int, V]Set[V]을 확장하면 Map[V, Boolean]을 확장 할 수 있습니까?

+0

'Set'과'Seq'는'Map'과 매우 다른 의미를 가지므로, 그런 식으로 노출하는 것은 의미가 없습니다. – Gabe

+0

@ 가브리, "다른 의미"로 무엇을 의미하는지에 대한 구체적인 예를 들려 줄 수 있습니까? – Adam

+1

나는 이것이 흥미로운 질문이라고 생각하지만 Madoc의 대답은 결정적이다. – Malvolio

답변

12

글쎄, 그들은 적어도 실제로는 공통된 기능을 수행합니다. Seq[B]Int => B (PartialFunction[Int, B]을 통해)을 상속하며 A => B (PartialFunction[A, B]도 포함)에서 상속하며 Set[A]A => Boolean을 상속합니다. 따라서 기능 응용 및 구성 방법에 관한 한이 세 가지 모두를 서로 교환하여 사용할 수 있습니다. 또한, 이들은 모두가 TraversableLike을 구현하기 때문에, 순회 (traversal)가 일어날 때까지 상호 교환 적으로 사용될 수 있습니다.

+0

감사! 이 경우지도 (A, B)와 함수 [A, B] 사이의 기본적인 30 단어 차이는 무엇입니까? – Adam

+1

@Adam'Map'은 트래버스 가능하지만'Function'은 그렇지 않습니다. 그래서'Map'은 키를 열거 할 수 있지만,'Function'은 그것의 매개 변수를 위해서 같은 것을 할 수 없습니다. –

4

음, 모든 경우 약 SeqSet 당신이 지점이있을 것이다,이었다 신경. 스스로, 나는 그것이 가장 작은 importants 측면 중 하나라고 생각하고, 그들 모두가 이미 잘 표현한 것은 함수입니다. 인

하기, Map가 값으로 키의 함수이다하는 Seq는 값로의 Int의 함수이며,는 SetBoolean에 값의 함수이다. "지도"라고 부르는이 속성은 기능입니다. 그리고 그것은 이미이 세 가지 모두에 의해 공유됩니다. 제 생각에 Map, SeqSet 정말 약은 무엇

은 다음과 같습니다

  • Seq는 요소가 순서 것에 알고 걱정입니다. 개념적으로 Map에 요소를 어떻게 추가합니까? 모든 키의 번호를 다시 매겨 야합니다!

  • Set은 요소의 유무에 관한 것이다. 모델을 Map에서 어떻게 모델링할까요? 공통 맵이 아닌 디폴트 값을 가진 맵이어야하며 기본값이 아닌 모든 값이 동일해야합니다. 그것은 분명히 추상적 인 것이 아니라 퇴보적인 행동입니다.

  • Map은 임의의 키를 임의의 값으로 매핑하는 데 관심이 있습니다. A Seq에는 임의의 키가없고 Set에는 임의의 값이 없습니다.

+0

"글쎄, 네가 신경 쓰는 사람이라면 ..."글쎄, 내 질문은 "스칼라 라이브러리 설계자가 어떤 결정을 내렸는가?"라고 다시 말할 수있다. – Adam

+0

@Adam http://www.scala-lang.org/sid/3, http://www.scala-lang.org/docu/files/collections-api/collections.html 및 http : // www. scala-lang.org/docu/files/collections-api/collections-impl.html. –

8

정수에서 요소로의 대입으로 시퀀스를 보는 것은 시퀀스가 ​​무엇인지 설명하는 유일한 방법 일뿐입니다. 다른 방법이 있으며 시퀀스를 설명하는 방법이 표준이되어야하는 이유가 없습니다. 시퀀스의 실제 목적은 일련의 요소를 액세스 가능하고 트래버스 할 수있게 만드는 것입니다. 요소에 정수를 실제로 할당하기 위해 시퀀스가 ​​필요하지 않습니다. 예를 들어, 대부분의 Stream 구현에는 탐색과 병행하여 실행중인 카운터가 없을 것입니다. 이를 요구하면 구현에 불필요한 오버 헤드가 발생합니다.

이외에도 Map[K,V]Iterable[(K,V)]입니다. 귀하의 제안에 따라 Seq[A]Map[Int,A]이어야하며이 또한 Iterable[(Int,A)]이됩니다. SeqIterable으로 확장되기 때문에 은 Iterable[A]Iterable[(Int,A)] (그리고 재귀 적으로는 Iterable[(Int,(Int,A))], Iterable[(Int,(Int,(Int,A)))] 등)이됩니다. 이는 스칼라에서 허용 된 상속 방법이 아닙니다.

Set에 대한 제안에 대해 비슷한 인수를 구성 할 수 있습니다.

+2

두 번째 주장이 매력적이라고 ​​생각합니다. 이것을 단순화하기 위해'Seq [A]'가'Map [Int, A]'를 확장한다면'seq.elements()'는 무엇을 반환 할까? – Malvolio

+0

흥미 롭습니다. Haskell의 타입 시스템은 그러한 제한이 없다. (사실, 이런 종류의 다형성이 좌, 우로 보인다.) 스칼라의 기본 이론이 표준 라이브러리를 어떻게 제한하는지 보려합니다. – Adam

+1

@ 아담 나는 하스켈이 그 중 하나를 빠져 나가는 것을 보지 못했다. 하스켈에서'foldr'을 쓰면,'(Int, A)'를 접을 필요가 없습니다. A를 접을 수 있습니다. –

관련 문제