2016-08-15 9 views
1

私はCoursera課題と2週目に取り組んでいます。今週の課題は難しくありませんが、非常に混乱します。スカラ "タイプ"エイリアスの混乱

は、私は、コードの下に書いて、それが

def union(s:Set[Int], t:Set[Int]):Set[Int] = s union t 

正常に動作します。しかし、私はセットのエイリアスを作成し、私は労働組合のためにエラーが発生します

type Set = Int => Boolean 
def union(s:Set, t:Set):Set = s union t 

として上記リライトするタイプを使用する場合、メンバーではありません設定

Set[T]がという名前の関数を定義するので、これは動作します

答えて

6
def union(s:Set[Int], t:Set[Int]):Set[Int] = s union t 

の、これは上記のコードで呼び出されます。

type Set = Int => Boolean 
def union(s:Set, t:Set):Set = s union t 

機能にはunionという名前のメソッドがないため、これは機能しません。

+0

型にはエイリアシングがありません[Int]を設定しますか? – Tahseen

+0

@DarkStarいいえ、 'Set'という標準ライブラリクラスとは関係のない新しいタイプの' Set'を作成しています。その新しいタイプの 'Set'は' Int => Boolean'のエイリアスです。つまり、def union(s:Set、t:Set):Setを書くと、def union(int:> Boolean、t:Int => Boolean)と同じです:Int => Boolean' 。 – sepp2k

+0

あなたはそれが正しいと言ってくれてありがとう。タイプ 'Set = Int => Boolean'を使用した瞬間、新しい関数エイリアスが作成されました。新しいエイリアスは整数をとり、ブール値を返します。だから私はあなたにも明確にするために+1を与える。ありがとう – Tahseen

4

私はそのコースをやったときに覚えていることから、ソリューションを構築するために標準ライブラリタイプを使用することは想定されていません。したがって、標準ライブラリのSet[T]は使用しないでください。コレクションライブラリでは、unionが定義され、期待どおりに動作します。

しかし、コースではSetの独自のタイプを定義する必要があります。それはInt => Booleanだと思います。

type Set = Int => Boolean 
def union (s1 : Set, s2 : Set) : Set = (x:Int) => s1(x) || s2(x) 

あなたがラムダを定義する必要があり、次のとおりです。あなたが実際に必要なもの

は、このような関数です。

+0

ありがとう。実際には@kpbochenekより正確に言及されていますが、私はあなたにも+1 – Tahseen

1

すでにスカラにはunionの機能があります。あなたは行って、REPLで確認できます。

> val x: Set[Int] = Set(1,2,3) 
> x.union(Set(3, 4, 5)) 
res0: scala.collection.immutable.Set[Int] = Set(5, 1, 2, 3, 4) 

は、あなたが書くことができ、あなたはまったく同じことを行うには、独自の機能を定義したいとしましょう:

​​

これが一般的な方法である(ただセットのように)、あなたはそれを呼び出すことができます。

> myunion(Set(1, 2, 3), Set(3, 4, 5)) 
//but it also works for other types: 
> myunion(Set('a', 'b', 'c'), Set('c', 'd', 'e')) 

エイリアシングの種類がわずかに異なる構文で行われます。

type SetInt = Set[Int] 
type SetChar = Set[Char] 
+0

を与えたので、彼のソリューションの後にリンクを接続しました。私は私の問題を明確にする必要があったと思うし、あなたはそれを正しく答えた – Tahseen

1

type Set = Int => Booleanを実行すると、Function1タイプが作成されます。 あなた自身でscala replで確認できます。

scala> type Set = Int => Boolean 
defined type alias Set 

scala> val test: Set = i => true 
test: Set = <function1> 

あなたはFunction1[-T1, +R]特性で見たようにunionメソッドを持っているが、それをSet持っていませんAnyRefを拡張します。