2016-08-15 93 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 

现在,我得到错误工会是不是成员设置

回答

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

的这工作,因为Set[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(s: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函数在scala中。您可以通过做在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]特质看到延伸AnyRef不具有union方法,但Set有它。