我正在开设Coursera作业和第2周。本周作业并不难,但非常令人困惑。
我在下面写了代码并且工作正常
def union(s:Set[Int], t:Set[Int]):Set[Int] = s union t
但是如果我使用type来创建Set的别名并在上面重写为
type Set = Int => Boolean
def union(s:Set, t:Set):Set = s union t
现在我收到错误,因为union不是Set
的成员答案 0 :(得分:6)
def union(s:Set[Int], t:Set[Int]):Set[Int] = s union t
这是有效的,因为Set[T]
定义了一个名为union
的函数,该函数在上面的代码中被调用。
type Set = Int => Boolean
def union(s:Set, t:Set):Set = s union t
这不起作用,因为函数没有名为union
的方法。
答案 1 :(得分:4)
从我记忆中回过头来做这个课程时,你不应该使用任何标准的库类型来构建你的解决方案。所以你不应该使用标准库中的Set[T]
。在集合库中,union
已定义并按预期工作。
但是,该课程要求您为Set
定义自己的类型,我相信它是Int => Boolean
。
你真正需要的是这样的功能:
type Set = Int => Boolean
def union (s1 : Set, s2 : Set) : Set = (x:Int) => s1(x) || s2(x)
也就是说,你需要定义一个lambda。
答案 2 :(得分:1)
您已在scala中使用union
函数。您可以通过执行以下操作验证:
> 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)
假设您想要定义自己的函数来完成同样的事情,您可以写:
def myunion[T](x: Set[T], y: Set[T]): Set[T] = x.union(y)
这是通用方法(就像在set中一样),你可以调用它:
> 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]
答案 3 :(得分: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拥有它。