【发布时间】:2018-03-17 19:24:16
【问题描述】:
这是问题。
我有这个类型集:
type Set = Int => Boolean
我可以这样使用:
val belowNegFive: Set = (i) => i < -5
belowNegFive(10)
我的意思是返回一个布尔值,具体取决于元素 10 是否属于 -5 以下的数字集。
- 我有这段代码,它返回
s的子集,p持有该子集。
def filter(s: Set, p: Int => Boolean): Set = (e: Int) => s(e) && p(e)
Q1:我怎么知道 p(e) 告诉我 int e 满足谓词 p?
- 我有这个 fc,它返回
s内的所有有界整数是否满足p。
def contains(s: Set, elem: Int): Boolean = s(elem) val bound = 1000 def forall(s: Set, p: Int => Boolean): Boolean = { def iter(a: Int): Boolean = { if (a > bound) true else if (contains(s, a) && !p(a)) false else iter(a+1) } iter(-bound) }
Q2:为什么所有的 a > 边界默认都简单地满足谓词的条件?或者 true 只是一个停止条件?我不确定为什么这个 fc 不返回无限循环。只是一个无限的布尔值列表,最后一个布尔值对于所有 a > 边界都是“真、真、真……”。
Q3:我看不出它在哪个点使用 && 在结果布尔值之间表示是,s 内的所有有界整数都满足 p。
谢谢
【问题讨论】:
-
第一部分没看懂。您能否详细说明您想在第一季度提出的问题?
-
p是Int=>Boolean和e是Int因此p(e)是Boolean。所以e满足p如果p(e)返回true。 -
我可能回答了你自己的问题。我注意到谓词 p: Int => Boolean 的处理方式与类型 Set = Int => Boolean 相同。如果我们将 s 定义为 Set,则方法 s(e: Int) 指示 e 是否属于 Set s。所以 p(e: Int) 应该有相同的结果。
-
如果
a > bound则您已经遍历了a的所有可能值(在边界内)。如果您现在还没有找到false,那么就没有。如果没有false,那么它必须是true。 -
如果
s确实not 包含a,那么我们不关心谓词p(a)是否成立。因此,如果a不是s的成员,则将跳过谓词测试。只有当a是s的成员时,我们才会测试谓词p(a)。
标签: scala set alias predicate forall