在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仍然是很好的实践与界面交谈?如果没有,如果您选择使用List该Vector怎么办?后来,您意识到这将是一个更好的选择?
PS:在我的例子中,我使用了一种简单的方法,但同样的推理也适用于用户定义的类型.例如:
case class Foo(bars: Seq[Bar], ...)
Run Code Online (Sandbox Code Playgroud)