Scala“类型”别名混淆

时间:2016-08-15 19:56:34

标签: scala

我正在开设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

的成员

4 个答案:

答案 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拥有它。