我正在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
现在,我得到错误工会是不是成员设置
我正在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
现在,我得到错误工会是不是成员设置
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
的方法。
从我能记得的方式回到当我做这门课时,你不应该使用任何标准库类型来建立你的解决方案。所以你不应该使用标准库中的Set[T]
。在收集库中,union
已定义并按预期工作。
但是,该课程要求您为Set
定义自己的类型,我相信它是Int => Boolean
。
你真正需要的是这样的函数:
type Set = Int => Boolean
def union (s1 : Set, s2 : Set) : Set = (x:Int) => s1(x) || s2(x)
也就是说,你需要定义一个拉姆达。
谢谢。其实@kpbochenek提到更准确,但你连接他的解决方案后的链接,所以我给你也+1 – Tahseen
你已经有了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]
谢谢。我认为我需要澄清我的问题,并且你的回答是正确的 – Tahseen
当你做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有它。
是不是类型只是别名集[Int]? – Tahseen
@DarkStar不,它创建一个名为'Set'的新类型,它与标准库类Set'无关。新的'Set'类型是'Int => Boolean'的别名。这就是当你编写'def union(s:Set,t:Set):Set'时,和写'def union(s:Int => Boolean,t:Int => Boolean)相同:Int => Boolean' 。 – sepp2k
谢谢你说的正确。当我使用'Set = Int => Boolean'类型时,它创建了一个新的函数别名,它接受一个整数并返回一个布尔值。所以我也给你+1的澄清。谢谢 – Tahseen