2011-01-05 10 views
6

Iterableの3つの直接サブタイプは、Map,SeqおよびSetである。パフォーマンスの問題とは別に、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

@Gabe、「異なるセマンティクス」という意味の具体例を挙げることはできますか? – Adam

+1

これは興味深い質問だと思いますが、Madocの答えは肯定的です。 – Malvolio

答えて

12

まあ、彼らは、少なくとも実際には共通の機能のdo、並べ替えます。 Seq[B]Int => BPartialFunction[Int, B]経由)を継承し、Map[A, B]A => BPartialFunction[A, B]も経由)を継承し、Set[A]A => Booleanを継承します。したがって、機能の適用および組成方法に関する限り、3つすべてを交換可能に使用することができる。さらに、これらはすべてトラバーサルが行われる限り互換的に使用できます。すべてTraversableLikeを実装しています。

+0

ありがとう!その場合、私の質問はちょっと変わったと思います。マップ[A、B]と関数[A、B]の基本的な違いは何ですか? – Adam

+1

@Adam 'Map'は移動可能ですが、' Function'は移動できません。したがって、 'Map'はそのキーを列挙できますが、' Function'はそのパラメータに対して同じことをすることができません。 –

4

よく、すべてあなたが約SeqSetを気にしていれば、あなたはポイントがあります。私自身は、それが最小の輸入業者の側面の1つだと思っているのですが、すでにすべてがよく表現されているものはです。です。 、Mapある

値へのキーの関数であり、Seq値にIntの関数であり、SetBooleanに値の関数です。 「地図」と呼ばれるこのプロパティは、機能です。そしてそれはすでに3つすべてに共有されています。私の意見では、MapSeqSetは約実際にある何、

は以下のとおりです。

  • Seqは、その要素が何であるかを順番に知っ懸念しています。概念的には、Mapにどのように要素を追加しますか?すべての鍵の番号を変更する必要があります。

  • Setは、要素の有無に関係します。 Mapでそれをモデル化する方法は?共通のマップではなく、デフォルト値を持つマップでなければならず、デフォルト以外のすべての値が同じでなければなりません!それは明らかに抽象的ではなく、縮退した行動である。

  • Mapは、任意のキーを任意の値にマッピングすることに関係しています。 A Seqには任意のキーがなく、Setには任意の値がありません。

+0

「あなたが気にしているのならば」 - 私の質問は、「具体的には、Scalaのライブラリ設計者がどのような決定を下したのですか」と言い換えることができます。 – 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に拡張されているため、Seq[A]Iterable[A]Iterable[(Int,A)](および再帰的にはIterable[(Int,(Int,A))],Iterable[(Int,(Int,(Int,A)))]など)となりますが、これはScalaでの継承の方法ではありません。

Setに関するあなたの提案にも同様の議論をすることができます。

+2

私は第二引数が魅力的だと思います。簡単にするために、 'Seq [A]'が 'Map [Int、A]'を拡張した場合、 'seq.elements()'は何を返しますか? – Malvolio

+0

興味深い。 Haskellの型システムには、このような制限はありません(実際、この種の多態性は左右に誇張されています)。 Scalaの基本的な理論が標準ライブラリをどのように制限しているのか興味深い。 – Adam

+1

@アダム私はハスケルもそれから出てくるのを見ない。あなたがHaskellのリストとして 'foldr'を使っているなら、'(Int、A) 'を折りたたんではいけません:あなたは' A'をフォールドします。 –

関連する問題