scala – 重构样板类型约束
发布时间:2020-12-16 18:38:37 所属栏目:安全 来源:网络整理
导读:我有一个带有一堆相关例程的对象,它们的所有声明看起来都是一样的 object Sorting { def qsort[a % Ordered[a]] .... def partition[a % Ordered[a]] ... def qselect[a % Ordered[a]] ...} 有没有办法在一个地方指定类型约束,并将声明减少到像qsort [a](xs
我有一个带有一堆相关例程的对象,它们的所有声明看起来都是一样的
object Sorting { def qsort[a <% Ordered[a]] .... def partition[a <% Ordered[a]] ... def qselect[a <% Ordered[a]] ... } 有没有办法在一个地方指定类型约束,并将声明减少到像qsort [a](xs:Stream [a])或更好的只是qsort(xs:Stream [a])? 暂时我决定使用隐式类进行滚动 object Implicits { implicit class SortableArray[a <% Ordered[a]](xs: Array[a]) { def qsort = {...} } } object Application { import Implicits._ def main(args: Array[String]) = { val xs = Array(1,2,3) xs.qsort } } 解决方法
不幸的是,你不能将类型声明为类型U [T] = T<%Ordered [T].这不起作用,甚至不会编译. 但是,您可以将一些解决方法应用于您的代码 设想这个思维流程: 如
here所述:
def f [A<%B](a:A)= a.bMethod 是相同的 def f [A](a:A)(隐式ev:A => B)= a.bMethod 还有这个 def g [A:B](a:A)= h(a) 是相同的 def g [A](a:A)(隐式ev:B [A])= h(a) 所以回到你的例子: def qsort[A <% Ordered[A]] = ??? ……被翻译成: def qsort[A](implicit ev: A => Ordered[A]) = ??? …现在你可以引入类型参数,如: type O[A] = A => Ordered[A] ……并将其用作: def gsort[A] (implicit ev: O[A]) ……可以简化为: def gsortX[A : O] 然后您可以编写的所有代码为: 之前 object Sorting { def qsort[A <% Ordered[A]] = ??? def partition[A <% Ordered[A]] = ??? def qselect[A <% Ordered[A]] = ??? } 后 object Sorting { type O[A] = A => Ordered[A] def qsort[A: O] = ??? def partition[A: O] = ??? def qselect[A: O] = ??? } 甚至更好地使用特质 trait Sorting[A] { type O = A => Ordered[A] implicit def f : O def qsort = ??? def partition = ??? def qselect = ??? } 我希望这有点帮助:) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |