私はセットを持っていることを必要とする「囲碁プログラミング言語」演習#1.4を解決しようとしています。セットタイプを作成できますが、言語にセットタイプが付属していないのはなぜですか?行く、グアバも生まれたグーグルから来たのに、なぜ言語デザイナーは基本的なデータ構造のサポートを追加することを選ばなかったのですか?なぜユーザーにセットとして非常に基本的な独自の実装を作成させるのですか?
私はセットを持っていることを必要とする「囲碁プログラミング言語」演習#1.4を解決しようとしています。セットタイプを作成できますが、言語にセットタイプが付属していないのはなぜですか?行く、グアバも生まれたグーグルから来たのに、なぜ言語デザイナーは基本的なデータ構造のサポートを追加することを選ばなかったのですか?なぜユーザーにセットとして非常に基本的な独自の実装を作成させるのですか?
回答:
Goにはジェネリックがないためです(そのため、すべてのタイプに1つのセットタイプが必要か、リフレクションに頼るので、かなり非効率的です)。
必要なのは、「セットへの個々の要素の追加/削除」と「比較的スペース効率の良い」ことだけなので、aを使用するだけでかなりの量を得ることができますmap[yourtype]bool
(そして、セットtrue
内の任意の要素の値をに設定します))または、スペース効率を高めるために、値として空の構造体を使用_, present = the_setoid[key]
して、存在を確認するために使用できます。
map[T]struct{}
代わりに使用できますmap[T]bool
。
1つの理由は、マップからセットを簡単に作成できることです。
s := map[int]bool{5: true, 2: true}
_, ok := s[6] // check for existence
s[8] = true // add element
delete(s, 2) // remove element
連合
s_union := map[int]bool{}
for k, _ := range s1{
s_union[k] = true
}
for k, _ := range s2{
s_union[k] = true
}
交差点
s_intersection := map[int]bool{}
for k,_ := range s1 {
if s2[k] {
s_intersection[k] = true
}
}
他のすべての集合演算を実装することはそれほど難しくありません。
false
)が適切にそれを伝えます。テストにコンマOKイディオムは必要ありません。
map[int]struct{}
代わりに使用する方が最適bool
です。私は最近、このgist.github.com/bgadrian/cb8b9344d9c66571ef331a14eb7a2e80の
Vatineが書いたように:goにはジェネリックが不足しているため、標準ライブラリではなく言語の一部である必要があります。そのためには、キーワードセット、ユニオン、インターセクション、差異、サブセットで言語を汚染する必要があります...
もう1つの理由は、セットの「正しい」実装が何であるかがまったく明確でないことです。
機能的なアプローチがあります:
func IsInEvenNumbers(n int) bool {
if n % 2 == 0 {
return true
}
return false
}
これはすべてのintのセットです。これは非常に効率的なルックアップとユニオンを備えており、機能的な構成によって簡単に行うことができます。
値に関連付けられたものを格納するため、マップにはその問題はありません。
+
ユニオン、-
差分、*
交差、<=
サブセット、>=
スーパーセット、=
等式、<>
不等式、およびin
メンバーシップ。したがって、Goでは、新しいキーワードは1つだけになります- in
。一方、Pascalの組み込みセットは、「序数」、つまり、あるサイズの整数値の基になる表現を持つすべての型でのみ機能します。
s[key]
(あるかのようs
だったmap[T]bool
)の代わりにkey in s
。
n % 2 == 0
何ですか?