ScalaCool / scalacool.github.io

10 stars 0 forks source link

Subtyping vs Typeclasses(二) - Scala Cool #71

Open yisonshan opened 6 years ago

yisonshan commented 6 years ago

https://scala.cool/2017/09/subtyping-vs-typeclasses-2/

这是水滴产品团队面向 Scala 的中文技术博客,原创 Scala 文章、教程。

hangscer8 commented 6 years ago

学习了

kylooh commented 5 years ago

是否可以理解为本身为Comparable的对象,去掉了Comparable特性,而是采用对象+比较器的方案。Comparator本身其实已经是一个剥离对象的实现,Scala的隐式参数只是避免了显示传入,但是还是需要传入参数,本质上方法签名没有变。那这样的话,TypeClass方案的改进在哪点呢?我有点没看懂。

yisonshan commented 5 years ago

@kylooh 是否可以理解为本身为Comparable的对象,去掉了Comparable特性,而是采用对象+比较器的方案。Comparator本身其实已经是一个剥离对象的实现,Scala的隐式参数只是避免了显示传入,但是还是需要传入参数,本质上方法签名没有变。那这样的话,TypeClass方案的改进在哪点呢?我有点没看懂。

建议从「特设多态」的角度来思考(区别于Comparable方案的子类型多态),实际上是为某种类型动态注入了一种能力。如果我使用另外的方式,会更加灵活,参考这篇文章的PlayerListOpshttps://scala.cool/2019/05/cats-4/

PS: 1)可以结合 Kotlin 的 extension 来类比思考。 2)Subtyping和Typeclass都是设计类库的两种常用套路,前者会有F-bounded Type 问题,基于类型安全角度去思考也是一个PK角度

kylooh commented 5 years ago

@yisonshan

那是不是可以理解为排序=对象+比较方法。这里的比较方法就是TypeClass。是一种只定义行为的方法拓展,而对于排序而言,比较方法一种参数多态的实现。这种实现实际上也实现了对象对于排序方法的多态?

yisonshan commented 5 years ago

@kylooh

@yisonshan 那是不是可以理解为排序=对象+比较方法。这里的比较方法就是TypeClass。是一种只定义行为的方法拓展,而对于排序而言,比较方法一种参数多态的实现。这种实现实际上也实现了对象对于排序方法的多态?

Scala 中的 Typeclass 是一种模式,除了定义一个Typeclass结构(通常是一个 Trait)之外,还需要实现相应的实例,建议看这篇文章:https://scala.cool/2019/05/cats-4/

PS:刚才发现文章是老版本。。。已经覆盖重新发布了。