小编lam*_*sta的帖子

物体功能阻抗不匹配

在OOP这是很好的做法,谈谈对接口没有实现.所以,例如,你写这样的东西(Seq我的意思scala.collection.immutable.Seq:) :):

// talk to the interface - good OOP practice
doSomething[A](xs: Seq[A]) = ???
Run Code Online (Sandbox Code Playgroud)

不像以下那样:

// talk to the implementation - bad OOP practice
doSomething[A](xs: List[A]) = ???
Run Code Online (Sandbox Code Playgroud)

但是,在纯函数式编程语言(如Haskell)中,您没有子类型多态性,而是通过类型类使用ad hoc多态.因此,例如,您具有列表数据类型和列表的monadic实例.您不必担心使用接口/抽象类,因为您没有这样的概念.

在混合语言中,例如Scala,你有两种类型(通过模式,实际上,而不是Haskell中的一等公民,但我离题)和子类型多态.在scalaz,cats等你当然有对具体类型一元的情况下,不是抽象的,.

最后一个问题:鉴于Scala的这种混合,你仍然尊重OOP规则来与接口交谈,或者只是与具体类型交谈以直接利用函子,monad等,而无需在需要时使用转换为具体类型他们?换句话说,即使你想拥抱FP而不是OOP,Scala仍然是很好的实践与界面交谈?如果没有,如果您选择使用ListVector怎么办?后来,您意识到这将是一个更好的选择?

PS:在我的例子中,我使用了一种简单的方法,但同样的推理也适用于用户定义的类型.例如:

case class Foo(bars: Seq[Bar], ...)
Run Code Online (Sandbox Code Playgroud)

oop functional-programming scala scalaz scala-cats

9
推荐指数
1
解决办法
336
查看次数

标签 统计

functional-programming ×1

oop ×1

scala ×1

scala-cats ×1

scalaz ×1