タイプエイリアスがどのように機能するのか、そして拡張子によって、type Set = Int => Boolean
でモデル化された単純なSet
タイプが部分的な機能を持つクラスとして書き直される方法を理解しようとしています。部分関数を使用してScalaのSetモデルを作成します。タイプエイリアス:Set = Int => Boolean
背景:
type Set = Int => Boolean
def union(s: Set, t: Set): Set = (x => s(x) || t(x))
def contains(s: Set, n: Int): Boolean = s(n)
val s1 = Set(3)
val s2 = Set(7)
val u1 = union(s1, s2)
contains(u1, 3) // res4: Boolean = true
すべてが順調と良い:私は上記のようなタイプのエイリアスを作成し、シンプルな機能セットのデータ型として使用できることを理解しています。いくつかの考えを取るが、私はそれがどのように機能するかを知る。私は、私の最初の試みは、このようなものになるだろうクラスにこれを有効にしたいのであれば
union(s: (Int => Boolean), t: (Int => Boolean)): Int => Boolean
:u1
は、本質的に基づいて、部分関数となる
case class Set(v: Int) {
def apply(i: Int) = i == v
def contains(n: Int): Boolean = this(n)
def union(n: Set): Set = (x => n(x) || apply(x)) // Missing param
}
しかし、それは動作しません。 (union
の定義にはコンパイルエラーがあり、x
はパラメータがありません)。
これをしばらくお待ちいただいた後、実際にコレクションベースのSetクラスを作成するなどの、もっと不可欠な方法に頼らなくても、同様の型を実装する方法については困惑しています。純粋に機能的な方法でこれを行う方法が必要です。
OOに頼らずに、あなたが望むものを達成する方法はありません。 'union 'の問題はSetでなければならないということですが、それは関数として定義されています。これをSetにするためには、Setを拡張したインスタンスを用意する必要があります.setを適用すると、関数を基にした実装のポイントをほぼ破棄します。 – pedrofurla
種類のエイリアスは置換だけで動作します。 – pedrofurla
あなたのスコープ内に3つのSet定義があると思います... xD 1.タイプ別名 'Set'(関数)、2. val s1 = Set(3)(' scala.Set')3.あなたの 'ケースクラスSet'を生成する。それはうまくいきません...そして、いいえ、組合は部分的な機能ではありません。 –