教科书级别的完美回答-感谢大神

「 刘颖: 问你个问题,看你这scala老手多长时间给出答案?

List(Some(3), None).flatMap(e => e)

的结果是什么? 为什么? 」


今天走在路上,忽然想到上次你说的这个问题可以从语言上层的理论来解释:
在面向对象的编程中,一切皆对象,类比到函数式编程,一切皆函数,也可以称为一切皆monad,也就是说我们在函数式编程中见到的应该都是monad(除去基本类型)。monad的严格定义是:自函子范畴内的幺半群。这句话中有两个比较重要的地方:
1、自函子:函数的定义域和值域在同一个范围内(也正因为这样我们才可以在函数式编程中使用链式调用)
2、幺半群:幺半群要拆开来看,首先是群的概念,所谓群就是满足“结合率”和“交换律”的集合,半群就是只满足结合率的集合,而“幺”则是指这个集合中存在一个幺元。

针对幺半群可以举一个例子:假设集合中存在a、b、c和一个函子*,半群意味着a * b * c = a * (b * c) = (a * b) * c,这一个在monad with cats中我记得应该是有大量的基于此推导出来的公式的。现在集合中还存在一个幺元:I,幺元满足的特性是 a * I = I * a = a。上面这个是理论,用个通俗点的例子来说明:存在一个字符串的集合 {“hello”, “world”, “!”, “”},那么append就是一个能使该集合满足单子特定的函子。演示一下结合率:“hello”.append(“wold”).append("!") = “hello”.append(“world”.append("!")) = (“hello”.append(“world”)).append("!"),在看一下幺元的特性:"".append(“hello”) = “hello”.append("") = “hello”。
回到上面的例子Some(3)和None都是集合中的元素,而flatMap则是集合的一个函子,这里的None应该就是monad中的幺元,所以上面的结果List(Some(3),None).flatMap(e => e) “equals” List(None, Some(3)).flatMap(e => e) “equals” List(Some(3)).flatMap(e => e)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值