Functional Programming in Scala week2 Assignment-Function Sets感想

来源:互联网 发布:淘宝联盟编辑分享文案 编辑:程序博客网 时间:2024/06/05 16:45

这是Coursera上Functional Programming in Scala week 2 Assignment的记录。
在自己一开始拿到题目后,是莫名奇妙的,完全看不懂。一方面,我觉得这是因为自己对函数式编程还不是很熟悉,另一方面我觉得也是题目有误导之处

type Set= Int => Boolean

一开始,我直接理解成这是一个Set的定义,是一个容器。然后想了十多分钟后,实在想不出,就去网上找找他人的思路,直到自己找到了这个 Assignment help: Union between sets,然后发现了其中的一句话,It’s not a container, it’s just a function。于是,茅塞顿开。
我们知道 Int=> Boolean 其实是定义了一个函数类型,它接受一个 Int 类型的参数,然后返回一个 Boolean 值。只不过这里缺少了具体的函数体,所以任何满足上述条件的函数,那么它的类型都是 Int=> Boolean 。理解了这个,然后再理解下 type 关键字。type 关键字其实是定义了一个别名,类似于 C++ typedeftype 关键字定义了别名后,我们就可以使用 Set 来表示这个函数类型了。
接下来,来看下题目中 contains 的定义

def contains(s: Set, elem: Int): Boolean = s(elem)

从这里,我们就可以看出,s其实是一个函数,因为它的类型是 Set ,也就是说它的类型是 Int => Boolean ,所以我们才可以在 contains 的定义中直接使用 s(elem),其实就是将 elem作为参数传递给 s 。因为s的返回值是Boolean,同时根据定义,就可以直接把 s(elem)的结果当做是 contains的结果
再来看下,比较关键的 singletonSet 定义。函数 singletonSet 接受一个 Int 参数,返回的是一个 Set 类型,即返回一个函数类型。这说明,我们需要在 singletonSet 中返回一个匿名函数,它接受一个 Int 类型作为参数,返回 Boolean 值。那么,要怎么定义这个匿名函数呢?结合 singletonSet 的定义,我们知道,这个函数的作用是传递进一个参数, 就可以构建出一个集合 s 出来。那么下次,就可以利用创建的集合 s 来判断某个元素是否属于这个集合。怎么判断呢?直接利用 s(element) 就可以判断了,而这个判断其实是调用了我们在 singletonSet 中定义的匿名函数体。如果 element 的值等于原来创建这个集合的 elem,那么就应该得到 true;反之,如果是其它元素,就会得到 false 。于是,singletonSet 的定义应该是:

def singletonSet(elem:Int): Set= x => x == elem

这里的 x 就是匿名函数需要接受的参数。另外,因为这里 x 只使用了一次,所以可以使用通配符代替

def singletonSet(elem:Int): Set= _ == elem

解决了 singletonSet 的定义问题,那么剩下来的就很好搞定了。

0 0
原创粉丝点击