【发布时间】:2019-02-10 12:20:33
【问题描述】:
在斯坦福 Scala 课程中,我遇到了以下作业:
练习 1 – 集合为函数:
在本练习中,我们将集合表示为从 Ints 到 Booleans 的函数:
type Set = Int => Boolean
a) 编写一个函数“set”,它接受一个 Int 参数并返回一个包含该 Int 的 Set。
b) 编写一个“包含”函数,该函数接受一个 Set 和一个 Int 作为参数,如果 Int 在 Set 中则返回 true,否则返回 false。
c) 编写函数“union”、“intersect”和“minus”,以两个 Set 作为参数并返回一个 Set。
d) 你能写一个函数“子集”,它接受两个 Set 作为参数,如果第一个是第二个的子集则返回 true,否则返回 false?
a、b 和 c 的解决方案相当简单:
def set(i: Int): Set = n => n == i
def contains(s: Set, i: Int) = s(i)
def union(a: Set, b: Set): Set = i => a(i) || b(i)
def intersect(a: Set, b: Set): Set = i => a(i) && b(i)
def minus(a: Set, b: Set): Set = i => a(i) && !b(i)
但是 d 有什么优雅的解决方案吗? 当然,严格来说,d 的答案是“是”,因为我可以这样写:
def subset(a: Set, b: Set) = Int.MinValue to Int.MaxValue filter(a) forall(b)
但这可能不是正确的方法。
【问题讨论】:
-
我认为是正确的方式。
-
课程与斯坦福无关
-
@Seth 它来自斯坦福的课程,而不是当前的 Coursera 课程,尽管那里的第二个作业几乎相同。请注意,它没有 -bound/bound 提示,顺便说一句,它回答了我的问题。
标签: scala functional-programming set